forked from OSchip/llvm-project
Fix a bug in r123034 (trying to sext/zext non-integers) and clean up a little.
llvm-svn: 123061
This commit is contained in:
parent
8c5defd0b0
commit
6a1fb8f235
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue