[llvm] [LoongArch] Add patterns to match `cto.w/d` when meeting i8/i16 types `not+cttz` (PR #166124)

via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 2 22:30:26 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-loongarch

Author: ZhaoQi (zhaoqi5)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/166124.diff


2 Files Affected:

- (modified) llvm/lib/Target/LoongArch/LoongArchInstrInfo.td (+4) 
- (modified) llvm/test/CodeGen/LoongArch/ctlz-cttz-ctpop.ll (+8-12) 


``````````diff
diff --git a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
index 9565a55e4c6c5..41e8373603b09 100644
--- a/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
@@ -1393,6 +1393,8 @@ def : PatGpr<ctlz, CLZ_D>;
 def : PatGpr<cttz, CTZ_D>;
 def : Pat<(ctlz (not GPR:$rj)), (CLO_D GPR:$rj)>;
 def : Pat<(cttz (not GPR:$rj)), (CTO_D GPR:$rj)>;
+def : Pat<(cttz (or (not GPR:$rj), 256)), (CTO_D (ANDI GPR:$rj, 255))>;
+def : Pat<(cttz (or (not GPR:$rj), 65536)), (CTO_D (BSTRPICK_D GPR:$rj, 15, 0))>;
 def : PatGpr<loongarch_clzw, CLZ_W>;
 def : PatGpr<loongarch_ctzw, CTZ_W>;
 def : Pat<(loongarch_clzw (not GPR:$rj)), (CLO_W GPR:$rj)>;
@@ -1404,6 +1406,8 @@ def : PatGpr<ctlz, CLZ_W>;
 def : PatGpr<cttz, CTZ_W>;
 def : Pat<(ctlz (not GPR:$rj)), (CLO_W GPR:$rj)>;
 def : Pat<(cttz (not GPR:$rj)), (CTO_W GPR:$rj)>;
+def : Pat<(cttz (or (not GPR:$rj), 256)), (CTO_W (ANDI GPR:$rj, 255))>;
+def : Pat<(cttz (or (not GPR:$rj), 65536)), (CTO_W (BSTRPICK_W GPR:$rj, 15, 0))>;
 } // Predicates = [IsLA32, Has32S]
 
 /// FrameIndex calculations
diff --git a/llvm/test/CodeGen/LoongArch/ctlz-cttz-ctpop.ll b/llvm/test/CodeGen/LoongArch/ctlz-cttz-ctpop.ll
index 27be02c50f1c7..e36e01978d730 100644
--- a/llvm/test/CodeGen/LoongArch/ctlz-cttz-ctpop.ll
+++ b/llvm/test/CodeGen/LoongArch/ctlz-cttz-ctpop.ll
@@ -901,16 +901,14 @@ define i8 @test_not_cttz_i8(i8 %a) nounwind {
 ;
 ; LA32S-LABEL: test_not_cttz_i8:
 ; LA32S:       # %bb.0:
-; LA32S-NEXT:    ori $a1, $zero, 256
-; LA32S-NEXT:    orn $a0, $a1, $a0
-; LA32S-NEXT:    ctz.w $a0, $a0
+; LA32S-NEXT:    andi $a0, $a0, 255
+; LA32S-NEXT:    cto.w $a0, $a0
 ; LA32S-NEXT:    ret
 ;
 ; LA64-LABEL: test_not_cttz_i8:
 ; LA64:       # %bb.0:
-; LA64-NEXT:    ori $a1, $zero, 256
-; LA64-NEXT:    orn $a0, $a1, $a0
-; LA64-NEXT:    ctz.d $a0, $a0
+; LA64-NEXT:    andi $a0, $a0, 255
+; LA64-NEXT:    cto.d $a0, $a0
 ; LA64-NEXT:    ret
   %neg = xor i8 %a, -1
   %tmp = call i8 @llvm.cttz.i8(i8 %neg, i1 false)
@@ -943,16 +941,14 @@ define i16 @test_not_cttz_i16(i16 %a) nounwind {
 ;
 ; LA32S-LABEL: test_not_cttz_i16:
 ; LA32S:       # %bb.0:
-; LA32S-NEXT:    lu12i.w $a1, 16
-; LA32S-NEXT:    orn $a0, $a1, $a0
-; LA32S-NEXT:    ctz.w $a0, $a0
+; LA32S-NEXT:    bstrpick.w $a0, $a0, 15, 0
+; LA32S-NEXT:    cto.w $a0, $a0
 ; LA32S-NEXT:    ret
 ;
 ; LA64-LABEL: test_not_cttz_i16:
 ; LA64:       # %bb.0:
-; LA64-NEXT:    lu12i.w $a1, 16
-; LA64-NEXT:    orn $a0, $a1, $a0
-; LA64-NEXT:    ctz.d $a0, $a0
+; LA64-NEXT:    bstrpick.d $a0, $a0, 15, 0
+; LA64-NEXT:    cto.d $a0, $a0
 ; LA64-NEXT:    ret
   %neg = xor i16 %a, -1
   %tmp = call i16 @llvm.cttz.i16(i16 %neg, i1 false)

``````````

</details>


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


More information about the llvm-commits mailing list