diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-01-10 02:22:12 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-01-10 02:22:12 +0000 |
| commit | f0af17dab3e75485105a265abd829d8257664329 (patch) | |
| tree | 61170608df58d6f56bcff129448f8a00787ca719 /llvm/lib | |
| parent | 7723e2b10f674b10e81673cea9b5102d5b32fdf8 (diff) | |
| download | bcm5719-llvm-f0af17dab3e75485105a265abd829d8257664329.tar.gz bcm5719-llvm-f0af17dab3e75485105a265abd829d8257664329.zip | |
enhance CanEvaluateZExtd to handle shift left and sext, allowing
more expressions to be promoted and casts eliminated.
llvm-svn: 93096
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index a6833b88257..3ad786b6bdd 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -643,17 +643,31 @@ static int CanEvaluateZExtd(Value *V, const Type *Ty,unsigned &NumCastsRemoved, if (Tmp1 == -1) return -1; Tmp2 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); if (Tmp2 == -1) return -1; + return 0; // TODO: Could be improved. + + case Instruction::Shl: + Tmp1 = CanEvaluateZExtd(I->getOperand(0), Ty, NumCastsRemoved, TD); + if (Tmp1 == -1) return -1; + + if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) + return Tmp1 - CI->getZExtValue(); + + // Variable shift, no known zext bits. + Tmp2 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); + if (Tmp2 == -1) return -1; return 0; - //case Instruction::Shl: //case Instruction::LShr: case Instruction::ZExt: // zext(zext(x)) -> zext(x). Since we're replacing it, it isn't eliminated. Tmp1 = Ty->getScalarSizeInBits()-OrigTy->getScalarSizeInBits(); return GetLeadingZeros(I, TD)+Tmp1; - //case Instruction::SExt: zext(sext(x)) -> sext(x) with no upper bits known. - //case Instruction::Trunc: + case Instruction::SExt: + // zext(sext(x)) -> sext(x) with no upper bits known. + return 0; + //case Instruction::Trunc: -> Could turn into AND. + case Instruction::Select: Tmp1 = CanEvaluateZExtd(I->getOperand(1), Ty, NumCastsRemoved, TD); if (Tmp1 == -1) return -1; |

