[llvm] ac75171 - [InstCombine] Fix incorrect nneg inference on shift amount

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 21 06:48:07 PST 2023


Author: Nikita Popov
Date: 2023-11-21T15:47:55+01:00
New Revision: ac75171d41f0000d53eadf64a943d6fabc24af6c

URL: https://github.com/llvm/llvm-project/commit/ac75171d41f0000d53eadf64a943d6fabc24af6c
DIFF: https://github.com/llvm/llvm-project/commit/ac75171d41f0000d53eadf64a943d6fabc24af6c.diff

LOG: [InstCombine] Fix incorrect nneg inference on shift amount

Whether this is valid depends on the bit widths of the involved
integers.

Fixes https://github.com/llvm/llvm-project/issues/72927.

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
    llvm/test/Transforms/InstCombine/shift.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 1b2615d4598d929..d2c6ffe9001d78b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1223,7 +1223,9 @@ Instruction *InstCombinerImpl::visitZExt(ZExtInst &Zext) {
 
   if (!Zext.hasNonNeg()) {
     // If this zero extend is only used by a shift, add nneg flag.
-    if (Zext.hasOneUse() && SrcTy->getScalarSizeInBits() > 2 &&
+    if (Zext.hasOneUse() &&
+        SrcTy->getScalarSizeInBits() >
+            Log2_64_Ceil(DestTy->getScalarSizeInBits()) &&
         match(Zext.user_back(), m_Shift(m_Value(), m_Specific(&Zext)))) {
       Zext.setNonNeg();
       return &Zext;

diff  --git a/llvm/test/Transforms/InstCombine/shift.ll b/llvm/test/Transforms/InstCombine/shift.ll
index 1cb1ac327291622..bad6a995cb75d51 100644
--- a/llvm/test/Transforms/InstCombine/shift.ll
+++ b/llvm/test/Transforms/InstCombine/shift.ll
@@ -2208,8 +2208,8 @@ define i128 @shift_zext_nneg(i8 %arg) {
 
 define i129 @shift_zext_not_nneg(i8 %arg) {
 ; CHECK-LABEL: @shift_zext_not_nneg(
-; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i8 [[ARG:%.*]] to i129
-; CHECK-NEXT:    [[SHL:%.*]] = shl nuw nsw i129 1, [[EXT]]
+; CHECK-NEXT:    [[EXT:%.*]] = zext i8 [[ARG:%.*]] to i129
+; CHECK-NEXT:    [[SHL:%.*]] = shl nuw i129 1, [[EXT]]
 ; CHECK-NEXT:    ret i129 [[SHL]]
 ;
   %ext = zext i8 %arg to i129


        


More information about the llvm-commits mailing list