diff options
author | Chris Lattner <sabre@nondot.org> | 2007-04-02 05:41:38 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-04-02 05:41:38 +0000 |
commit | a3e0bb4ebb38397cf5b8968c5d996655d60afbed (patch) | |
tree | 59b079b7a9f4443be01819c308555a63fd469e06 /llvm/lib/Analysis | |
parent | d14447833ae3ae425ad8790054afdaca8562516b (diff) | |
download | bcm5719-llvm-a3e0bb4ebb38397cf5b8968c5d996655d60afbed.tar.gz bcm5719-llvm-a3e0bb4ebb38397cf5b8968c5d996655d60afbed.zip |
Treat xor of signbit like an add.
llvm-svn: 35586
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 051631e80d1..3597b3551c9 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -1427,7 +1427,16 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) { } } break; - + case Instruction::Xor: + // If the RHS of the xor is a signbit, then this is just an add. + // Instcombine turns add of signbit into xor as a strength reduction step. + if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { + if (CI->getValue().isSignBit()) + return SCEVAddExpr::get(getSCEV(I->getOperand(0)), + getSCEV(I->getOperand(1))); + } + break; + case Instruction::Shl: // Turn shift left of a constant amount into a multiply. if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { |