[llvm] [LoopIdiomVectorize] Recognize and transform minidx pattern (PR #144987)
    Madhur Amilkanthwar via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Wed Jul 16 01:18:51 PDT 2025
    
    
  
madhur13490 wrote:
> > > It's my understanding that the GVN improvement brings this into a form that we can at least in principle vectorize, even if it doesn't work yet. It's not either/or, we want both.
> > 
> > 
> > I am not sure if that is the right understanding. @fhahn do you think GVN (with a lot of work) optimized IR would or could be vectorizable?
> 
> Yes, once the loads have been simplified by GVN we should be able to tackle this in LV
Thanks. 
@fhahn @nikic 
I am thinking aloud. If not GVN, then is there a place in LLVM where I can pattern match and "simplify" the loads? 
 ```
  %load1_ptr = getelementptr float, ptr %first_ptr, i64 %iv
  %load1 = load float, ptr %load1_ptr, align 4
  %index_sext = sext i32 %index to i64
  %load2_ptr = getelementptr float, ptr %second_ptr, i64 %index_sext  ; <--- load the c
  %load2 = load float, ptr %load2_ptr, align 4
  %cmp = fcmp contract olt float %load1, %load2
```
GCC loads the second value to a register and updates it when a minimum element is found. This is PRE to me but doing this in GVN is not feasible. Is there any other pass where I can achieve this?
FWIW, here is an equivalent C loop. https://godbolt.org/z/EcT6efd3x
GCC-generated code has a single load in the loop. Register `w4` is a temporary register used to hold the last MinIdx.
https://github.com/llvm/llvm-project/pull/144987
    
    
More information about the llvm-commits
mailing list