diff options
| author | Dan Gohman <gohman@apple.com> | 2009-05-18 16:29:04 +0000 |
|---|---|---|
| committer | Dan Gohman <gohman@apple.com> | 2009-05-18 16:29:04 +0000 |
| commit | 6350296efcf502d0343549b63f0b1b7aecd3ece2 (patch) | |
| tree | 6316567495bdf5208da6a9d1c28843a971949727 /llvm/lib/Analysis | |
| parent | d277a1ed491e730dab3462119c4e76bdb6a74ab8 (diff) | |
| download | bcm5719-llvm-6350296efcf502d0343549b63f0b1b7aecd3ece2.tar.gz bcm5719-llvm-6350296efcf502d0343549b63f0b1b7aecd3ece2.zip | |
Teach ScalarEvolution to recognize x^-1 in the case where non-demanded
bits have been stripped out by instcombine.
llvm-svn: 72010
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 3480a317c06..3ecb30232c6 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -2203,6 +2203,19 @@ SCEVHandle ScalarEvolution::createSCEV(Value *V) { // If the RHS of xor is -1, then this is a not operation. if (CI->isAllOnesValue()) return getNotSCEV(getSCEV(U->getOperand(0))); + + // Model xor(and(x, C), C) as and(~x, C), if C is a low-bits mask. + // This is a variant of the check for xor with -1, and it handles + // the case where instcombine has trimmed non-demanded bits out + // of an xor with -1. + if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U->getOperand(0))) + if (ConstantInt *LCI = dyn_cast<ConstantInt>(BO->getOperand(1))) + if (BO->getOpcode() == Instruction::And && + LCI->getValue() == CI->getValue()) + if (const SCEVZeroExtendExpr *Z = + dyn_cast<SCEVZeroExtendExpr>(getSCEV(U->getOperand(0)))) + return getZeroExtendExpr(getNotSCEV(Z->getOperand()), + U->getType()); } break; |

