[llvm] r219568 - InstCombine: Don't fold (X <<s log(INT_MIN)) /s INT_MIN to X

David Majnemer david.majnemer at gmail.com
Sat Oct 11 03:20:04 PDT 2014


Author: majnemer
Date: Sat Oct 11 05:20:04 2014
New Revision: 219568

URL: http://llvm.org/viewvc/llvm-project?rev=219568&view=rev
Log:
InstCombine: Don't fold (X <<s log(INT_MIN)) /s INT_MIN to X

Consider the case where X is 2.  (2 <<s 31)/s-2147483648 is zero but we
would fold to X.  Note that this is valid when we are in the unsigned
domain because we require NUW: 2 <<u 31 results in poison.

This fixes PR21245.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
    llvm/trunk/test/Transforms/InstCombine/div.ll

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=219568&r1=219567&r2=219568&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Sat Oct 11 05:20:04 2014
@@ -762,7 +762,8 @@ Instruction *InstCombiner::commonIDivTra
           }
         }
 
-        if ((IsSigned && match(LHS, m_NSWShl(m_Value(X), m_APInt(C1)))) ||
+        if ((IsSigned && match(LHS, m_NSWShl(m_Value(X), m_APInt(C1))) &&
+             *C1 != C1->getBitWidth() - 1) ||
             (!IsSigned && match(LHS, m_NUWShl(m_Value(X), m_APInt(C1))))) {
           APInt Quotient(C1->getBitWidth(), /*Val=*/0ULL, IsSigned);
           APInt C1Shifted = APInt::getOneBitSet(

Modified: llvm/trunk/test/Transforms/InstCombine/div.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/div.ll?rev=219568&r1=219567&r2=219568&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/div.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/div.ll Sat Oct 11 05:20:04 2014
@@ -247,3 +247,20 @@ define i32 @test28(i32 %a) {
 ; CHECK-NEXT: %div = mul nuw i32 %a, 12
 ; CHECK-NEXT: ret i32 %div
 }
+
+define i32 @test29(i32 %a) {
+  %mul = shl nsw i32 %a, 31
+  %div = sdiv i32 %mul, -2147483648
+  ret i32 %div
+; CHECK-LABEL: @test29(
+; CHECK-NEXT: %[[and:.*]] = and i32 %a, 1
+; CHECK-NEXT: ret i32 %[[and]]
+}
+
+define i32 @test30(i32 %a) {
+  %mul = shl nuw i32 %a, 31
+  %div = udiv i32 %mul, -2147483648
+  ret i32 %div
+; CHECK-LABEL: @test30(
+; CHECK-NEXT: ret i32 %a
+}





More information about the llvm-commits mailing list