OSDN Git Service

Fix a bug in r123034 (trying to sext/zext non-integers) and clean up a little.
authorFrits van Bommel <fvbommel@gmail.com>
Sat, 8 Jan 2011 10:51:36 +0000 (10:51 +0000)
committerFrits van Bommel <fvbommel@gmail.com>
Sat, 8 Jan 2011 10:51:36 +0000 (10:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123061 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineSelect.cpp
test/Transforms/InstCombine/crash.ll

index c2caedf..71a286e 100644 (file)
@@ -299,6 +299,11 @@ Instruction *InstCombiner::visitSelectInstWithICmp(SelectInst &SI,
       case ICmpInst::ICMP_SLT:
       case ICmpInst::ICMP_UGT:
       case ICmpInst::ICMP_SGT: {
+        // These transformations only work for selects over integers.
+        const IntegerType *SelectTy = dyn_cast<IntegerType>(SI.getType());
+        if (!SelectTy)
+          break;
+
         Constant *AdjustedRHS;
         if (Pred == ICmpInst::ICMP_UGT || Pred == ICmpInst::ICMP_SGT)
           AdjustedRHS = ConstantInt::get(CI->getContext(), CI->getValue() + 1);
@@ -315,9 +320,8 @@ Instruction *InstCombiner::visitSelectInstWithICmp(SelectInst &SI,
         // promote all to the larger type. This enables scalar evolution to
         // analyze this expression.
         else if (CmpRHS->getType()->getScalarSizeInBits()
-                 < SI.getType()->getScalarSizeInBits()) {
-          Constant *sextRHS = ConstantExpr::getSExt(AdjustedRHS,
-                                                    SI.getType());
+                 < SelectTy->getBitWidth()) {
+          Constant *sextRHS = ConstantExpr::getSExt(AdjustedRHS, SelectTy);
 
           // X = sext x; x >s c ? X : C+1 --> X = sext x; X <s C+1 ? C+1 : X
           // X = sext x; x <s c ? X : C-1 --> X = sext x; X >s C-1 ? C-1 : X
@@ -332,8 +336,7 @@ Instruction *InstCombiner::visitSelectInstWithICmp(SelectInst &SI,
             CmpLHS = FalseVal;
             AdjustedRHS = sextRHS;
           } else if (ICI->isUnsigned()) {
-            Constant *zextRHS = ConstantExpr::getZExt(AdjustedRHS,
-                                                      SI.getType());
+            Constant *zextRHS = ConstantExpr::getZExt(AdjustedRHS, SelectTy);
             // X = zext x; x >u c ? X : C+1 --> X = zext x; X <u C+1 ? C+1 : X
             // X = zext x; x <u c ? X : C-1 --> X = zext x; X >u C-1 ? C-1 : X
             // zext + signed compare cannot be changed:
index 60cb747..e87a302 100644 (file)
@@ -335,3 +335,9 @@ ret void
 
 declare i32 @func_14()
 
+
+define double @test16(i32 %a) nounwind {
+  %cmp = icmp slt i32 %a, 2
+  %select = select i1 %cmp, double 2.000000e+00, double 3.141592e+00
+  ret double %select
+}