[llvm] [LoongArch] Custom lower vecreduce_add. (PR #154304)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 22 02:46:39 PDT 2025


================
@@ -1,27 +1,18 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
-
 ; RUN: llc --mtriple=loongarch64 --mattr=+lasx %s -o - | FileCheck %s
 
 define void @vec_reduce_add_v32i8(ptr %src, ptr %dst) nounwind {
 ; CHECK-LABEL: vec_reduce_add_v32i8:
 ; CHECK:       # %bb.0:
 ; CHECK-NEXT:    xvld $xr0, $a0, 0
-; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 78
-; CHECK-NEXT:    xvshuf4i.b $xr1, $xr1, 228
-; CHECK-NEXT:    xvadd.b $xr0, $xr0, $xr1
-; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 68
-; CHECK-NEXT:    xvbsrl.v $xr1, $xr1, 8
-; CHECK-NEXT:    xvadd.b $xr0, $xr0, $xr1
-; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 68
-; CHECK-NEXT:    xvsrli.d $xr1, $xr1, 32
-; CHECK-NEXT:    xvadd.b $xr0, $xr0, $xr1
-; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 68
-; CHECK-NEXT:    xvshuf4i.b $xr1, $xr1, 14
-; CHECK-NEXT:    xvadd.b $xr0, $xr0, $xr1
-; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 68
-; CHECK-NEXT:    xvrepl128vei.b $xr1, $xr1, 1
-; CHECK-NEXT:    xvadd.b $xr0, $xr0, $xr1
-; CHECK-NEXT:    xvstelm.b $xr0, $a1, 0, 0
+; CHECK-NEXT:    xvhaddw.h.b $xr0, $xr0, $xr0
+; CHECK-NEXT:    xvhaddw.w.h $xr0, $xr0, $xr0
+; CHECK-NEXT:    xvhaddw.d.w $xr0, $xr0, $xr0
+; CHECK-NEXT:    xvhaddw.q.d $xr0, $xr0, $xr0
+; CHECK-NEXT:    xvpermi.d $xr1, $xr0, 2
+; CHECK-NEXT:    xvadd.d $xr0, $xr1, $xr0
+; CHECK-NEXT:    xvpickve2gr.d $a0, $xr0, 0
----------------
tangaac wrote:


> Yeah. In the current test, the extension bits of the result are not relevant. What I mean is that in some related cases (for example, adding new test cases), should the selection of the `xvpickve2gr.[b,bu]` instruction be handled in this patch?
> 
> ```llvm
> define signext i8 @vec_reduce_add_v32i8(ptr %src) nounwind {
>   %v = load <32 x i8>, ptr %src
>   %res = call i8 @llvm.vector.reduce.add.v32i8(<32 x i8> %v)
>   ret i8 %res
> }
> ```

I think it's NO.
We should combine `extract_vector_elt` and `sign_extend_inreg`.

``` asm
Vector-legalized selection DAG: %bb.0 'vec_reduce_add_v32i8:'
SelectionDAG has 19 nodes:
  t0: ch,glue = EntryToken
    t2: i64,ch = CopyFromReg t0, Register:i64 %0
  t5: v32i8,ch = load<(load (s256) from %ir.src)> t0, t2, undef:i64
          t19: v4i64 = LoongArchISD::XVPERMI t17, Constant:i64<2>
        t20: v4i64 = add t19, t17
      t22: i64 = extract_vector_elt t20, Constant:i64<0>
    t13: i64 = sign_extend_inreg t22, ValueType:ch:i8
  t9: ch,glue = CopyToReg t0, Register:i64 $r4, t13
  t14: v32i8 = LoongArchISD::VHADDW t5, t5
  t15: v16i16 = LoongArchISD::VHADDW t14, t14
  t16: v8i32 = LoongArchISD::VHADDW t15, t15
  t17: v4i64 = LoongArchISD::VHADDW t16, t16
  t10: ch = LoongArchISD::RET t9, Register:i64 $r4, t9:1

```



https://github.com/llvm/llvm-project/pull/154304


More information about the llvm-commits mailing list