summaryrefslogtreecommitdiff
path: root/lib/Transforms/InstCombine/InstCombineSelect.cpp
diff options
context:
space:
mode:
authorFrits van Bommel <fvbommel@gmail.com>2011-01-08 10:51:36 +0000
committerFrits van Bommel <fvbommel@gmail.com>2011-01-08 10:51:36 +0000
commitb686eb9186ebefe54b4d33846eb07e1ab0beb234 (patch)
tree4ca5dfe5528e8efc7643dc1a266efe3c19bac904 /lib/Transforms/InstCombine/InstCombineSelect.cpp
parentd9ec3572f3d0997348361334446f942194522127 (diff)
downloadllvm-b686eb9186ebefe54b4d33846eb07e1ab0beb234.tar.gz
llvm-b686eb9186ebefe54b4d33846eb07e1ab0beb234.tar.bz2
llvm-b686eb9186ebefe54b4d33846eb07e1ab0beb234.tar.xz
Fix a bug in r123034 (trying to sext/zext non-integers) and clean up a little.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@123061 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/InstCombine/InstCombineSelect.cpp')
-rw-r--r--lib/Transforms/InstCombine/InstCombineSelect.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineSelect.cpp b/lib/Transforms/InstCombine/InstCombineSelect.cpp
index c2caedfa6c..71a286ef69 100644
--- a/lib/Transforms/InstCombine/InstCombineSelect.cpp
+++ b/lib/Transforms/InstCombine/InstCombineSelect.cpp
@@ -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: