diff options
| author | Devang Patel <dpatel@apple.com> | 2008-11-18 00:40:02 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2008-11-18 00:40:02 +0000 |
| commit | f1e932920952a75058f3cb304f1f646a918d7750 (patch) | |
| tree | 5c81bdc95a305141f3bd744277bb7a3eb02a3d49 /llvm/lib/Transforms | |
| parent | 5ebdb98a6ea83b9d8d759b023b1a2baa8aa5a321 (diff) | |
| download | bcm5719-llvm-f1e932920952a75058f3cb304f1f646a918d7750.tar.gz bcm5719-llvm-f1e932920952a75058f3cb304f1f646a918d7750.zip | |
Give SIToFPInst preference over UIToFPInst because it is faster on platforms that are widely used.
llvm-svn: 59476
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index ba19fbfc963..53d3ab5f048 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -722,6 +722,23 @@ void IndVarSimplify::OptimizeCanonicalIVType(Loop *L) { Incr->eraseFromParent(); } +/// Return true if it is OK to use SIToFPInst for an inducation variable +/// with given inital and exit values. +static bool useSIToFPInst(ConstantFP &InitV, ConstantFP &ExitV, + uint64_t intIV, uint64_t intEV) { + + if (InitV.getValueAPF().isNegative() || ExitV.getValueAPF().isNegative()) + return true; + + // If the iteration range can be handled by SIToFPInst then use it. + APInt Max = APInt::getSignedMaxValue(32); + if (Max.getZExtValue() > abs(intEV - intIV)) + return true; + + return false; +} + +/// convertToInt - Convert APF to an integer, if possible. static bool convertToInt(const APFloat &APF, uint64_t *intVal) { bool isExact = false; @@ -858,9 +875,9 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PH, Incr->replaceAllUsesWith(UndefValue::get(Incr->getType())); DeadInsts.insert(Incr); - // Replace floating induction variable. - if (EV->getValueAPF().isNegative() - || InitValue->getValueAPF().isNegative()) { + // Replace floating induction variable. Give SIToFPInst preference over + // UIToFPInst because it is faster on platforms that are widely used. + if (useSIToFPInst(*InitValue, *EV, newInitValue, intEV)) { SIToFPInst *Conv = new SIToFPInst(NewPHI, PH->getType(), "indvar.conv", PH->getParent()->getFirstNonPHI()); PH->replaceAllUsesWith(Conv); |

