[InstCombine] add helper function for folding of icmp (and X, C2), C; NFC

llvm-svn: 279834
This commit is contained in:
Sanjay Patel 2016-08-26 16:42:33 +00:00
parent 3db176410a
commit d3c7bb28be
2 changed files with 21 additions and 6 deletions

View File

@ -1389,8 +1389,8 @@ Instruction *InstCombiner::foldICmpXorConstant(ICmpInst &Cmp,
return nullptr;
}
/// Fold icmp (and X, Y), C.
Instruction *InstCombiner::foldICmpAndConstant(ICmpInst &Cmp,
/// Fold icmp (and X, C2), C.
Instruction *InstCombiner::foldICmpAndConstConst(ICmpInst &Cmp,
BinaryOperator *And,
const APInt *C) {
// FIXME: This check restricts all folds under here to scalar types.
@ -1410,8 +1410,7 @@ Instruction *InstCombiner::foldICmpAndConstant(ICmpInst &Cmp,
// have its sign bit set or if it is an equality comparison.
// Extending a relational comparison when we're checking the sign
// bit would not work.
if (Cmp.isEquality() ||
(!AndCst->isNegative() && C->isNonNegative())) {
if (Cmp.isEquality() || (!AndCst->isNegative() && C->isNonNegative())) {
Value *NewAnd =
Builder->CreateAnd(Cast->getOperand(0),
ConstantExpr::getZExt(AndCst, Cast->getSrcTy()));
@ -1590,6 +1589,20 @@ Instruction *InstCombiner::foldICmpAndConstant(ICmpInst &Cmp,
Constant::getNullValue(RHS->getType()));
}
}
return nullptr;
}
/// Fold icmp (and X, Y), C.
Instruction *InstCombiner::foldICmpAndConstant(ICmpInst &Cmp,
BinaryOperator *And,
const APInt *C) {
if (Instruction *I = foldICmpAndConstConst(Cmp, And, C))
return I;
// FIXME: This check restricts all folds under here to scalar types.
ConstantInt *RHS = dyn_cast<ConstantInt>(Cmp.getOperand(1));
if (!RHS)
return nullptr;
// Try to optimize things like "A[i]&42 == 0" to index computations.
if (LoadInst *LI = dyn_cast<LoadInst>(And->getOperand(0))) {

View File

@ -579,6 +579,8 @@ private:
const APInt *C);
Instruction *foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add,
const APInt *C);
Instruction *foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And,
const APInt *C);
Instruction *foldICmpEqualityWithConstant(ICmpInst &ICI);
Instruction *foldICmpIntrinsicWithConstant(ICmpInst &ICI);