[llvm] [DAG] isKnownToBeAPowerOfTwo - add DemandedElts + OrZero handling to ISD::ZERO_EXTEND cases (PR #207697)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 6 03:33:30 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
Fixes #<!-- -->181648
---
Full diff: https://github.com/llvm/llvm-project/pull/207697.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (+1-1)
- (modified) llvm/test/CodeGen/X86/known-pow2.ll (+3-5)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 34be92d3c847f..c655e18114c57 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -4859,7 +4859,7 @@ bool SelectionDAG::isKnownToBeAPowerOfTwo(SDValue Val,
Depth + 1);
case ISD::ZERO_EXTEND:
- return isKnownToBeAPowerOfTwo(Val.getOperand(0), /*OrZero=*/false,
+ return isKnownToBeAPowerOfTwo(Val.getOperand(0), DemandedElts, OrZero,
Depth + 1);
case ISD::VSCALE:
diff --git a/llvm/test/CodeGen/X86/known-pow2.ll b/llvm/test/CodeGen/X86/known-pow2.ll
index 7d926362adc93..f85bc7d3eb699 100644
--- a/llvm/test/CodeGen/X86/known-pow2.ll
+++ b/llvm/test/CodeGen/X86/known-pow2.ll
@@ -1086,7 +1086,6 @@ define i1 @pow2_though_zext(i32 %x, i16 %y) {
define i32 @pow2_though_zext_vec(<8 x i16> %a0, ptr %p1, i32 %a2) {
; CHECK-LABEL: pow2_though_zext_vec:
; CHECK: # %bb.0:
-; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: pxor %xmm1, %xmm1
; CHECK-NEXT: pxor %xmm2, %xmm2
; CHECK-NEXT: pcmpgtw %xmm0, %xmm2
@@ -1096,13 +1095,12 @@ define i32 @pow2_though_zext_vec(<8 x i16> %a0, ptr %p1, i32 %a2) {
; CHECK-NEXT: por %xmm0, %xmm2
; CHECK-NEXT: movdqa %xmm2, %xmm0
; CHECK-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
-; CHECK-NEXT: pextrw $0, %xmm2, %ecx
+; CHECK-NEXT: pextrw $0, %xmm2, %eax
; CHECK-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
; CHECK-NEXT: movdqa %xmm2, 16(%rdi)
; CHECK-NEXT: movdqa %xmm0, (%rdi)
-; CHECK-NEXT: xorl %edx, %edx
-; CHECK-NEXT: divl %ecx
-; CHECK-NEXT: movl %edx, %eax
+; CHECK-NEXT: decl %eax
+; CHECK-NEXT: andl %esi, %eax
; CHECK-NEXT: retq
%cmp = icmp sgt <8 x i16> zeroinitializer, %a0
%sel = select <8 x i1> %cmp, <8 x i16> <i16 4, i16 5, i16 6, i16 7, i16 9, i16 10, i16 11, i16 12>, <8 x i16> splat (i16 2)
``````````
</details>
https://github.com/llvm/llvm-project/pull/207697
More information about the llvm-commits
mailing list