OSDN Git Service

[InstCombine] Handle failures from ConstantFoldConstantExpression
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 28 Jul 2016 02:29:06 +0000 (02:29 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 28 Jul 2016 02:29:06 +0000 (02:29 +0000)
ConstantFoldConstantExpression returns null when folding fails.

This fixes PR28745.

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

lib/Transforms/InstCombine/InstCombineCasts.cpp
test/Transforms/InstCombine/cast.ll

index 0d79733..d41c449 100644 (file)
@@ -162,7 +162,8 @@ Value *InstCombiner::EvaluateInDifferentType(Value *V, Type *Ty,
     C = ConstantExpr::getIntegerCast(C, Ty, isSigned /*Sext or ZExt*/);
     // If we got a constantexpr back, try to simplify it with DL info.
     if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
-      C = ConstantFoldConstantExpression(CE, DL, TLI);
+      if (Constant *FoldedC = ConstantFoldConstantExpression(CE, DL, TLI))
+        C = FoldedC;
     return C;
   }
 
index 715956f..e450911 100644 (file)
@@ -1372,3 +1372,11 @@ define i16 @PR24763(i8 %V) {
   %t = trunc i32 %l to i16
   ret i16 %t
 }
+
+define i64 @PR28745() {
+; CHECK-LABEL: @PR28745(
+; CHECK-NEXT:    ret i64 zext (i32 extractvalue ({ i32 } select (i1 icmp eq (i16 extractelement (<2 x i16> bitcast (<1 x i32> <i32 1> to <2 x i16>), i32 0), i16 0), { i32 } { i32 1 }, { i32 } zeroinitializer), 0) to i64)
+
+  %b = zext i32 extractvalue ({ i32 } select (i1 icmp eq (i16 extractelement (<2 x i16> bitcast (<1 x i32> <i32 1> to <2 x i16>), i32 0), i16 0), { i32 } { i32 1 }, { i32 } zeroinitializer), 0) to i64
+  ret i64 %b
+}