InstCombine: match can find ConstantExprs, don't assume we have a Value
authorDavid Majnemer <david.majnemer@gmail.com>
Sun, 4 Jan 2015 07:36:02 +0000 (07:36 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sun, 4 Jan 2015 07:36:02 +0000 (07:36 +0000)
We assumed the output of a match was a Value, this would cause us to
assert because we would fail a cast<>.  Instead, use a helper in the
Operator family to hide the distinction between Value and Constant.

This fixes PR22087.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225127 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/mul.ll

index 255e58725830714a461b94d6e9e8273c912a5a1f..165a9e92654eca49bf99eafddb1571b2f595e8b4 100644 (file)
@@ -341,10 +341,10 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
     bool ShlNSW = false;
     if (match(Op0, m_Shl(m_One(), m_Value(Y)))) {
       BO = BinaryOperator::CreateShl(Op1, Y);
-      ShlNSW = cast<BinaryOperator>(Op0)->hasNoSignedWrap();
+      ShlNSW = cast<ShlOperator>(Op0)->hasNoSignedWrap();
     } else if (match(Op1, m_Shl(m_One(), m_Value(Y)))) {
       BO = BinaryOperator::CreateShl(Op0, Y);
-      ShlNSW = cast<BinaryOperator>(Op1)->hasNoSignedWrap();
+      ShlNSW = cast<ShlOperator>(Op1)->hasNoSignedWrap();
     }
     if (BO) {
       if (I.hasNoUnsignedWrap())
index a81ba726387cc6f79d3b7523cd44c63e7627d92a..4d1e6c700bda253ec3fca04506611a1247860464 100644 (file)
@@ -279,3 +279,12 @@ define i64 @test30(i32 %A, i32 %B) {
 ; CHECK-NEXT: %[[mul:.*]] = mul nuw i64 %[[zext1]], %[[zext2]]
 ; CHECK-NEXT: ret i64 %[[mul]]
 }
+
+@PR22087 = external global i32
+define i32 @test31(i32 %V) {
+; CHECK-LABEL: @test31
+  %mul = mul i32 %V, shl (i32 1, i32 zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32))
+  ret i32 %mul
+; CHECK:      %[[mul:.*]] = shl i32 %V, zext (i1 icmp ne (i32* inttoptr (i64 1 to i32*), i32* @PR22087) to i32)
+; CHECK-NEXT: ret i32 %[[mul]]
+}