summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2008-11-18 00:40:02 +0000
committerDevang Patel <dpatel@apple.com>2008-11-18 00:40:02 +0000
commitf1e932920952a75058f3cb304f1f646a918d7750 (patch)
tree5c81bdc95a305141f3bd744277bb7a3eb02a3d49 /llvm/lib/Transforms
parent5ebdb98a6ea83b9d8d759b023b1a2baa8aa5a321 (diff)
downloadbcm5719-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.cpp23
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);
OpenPOWER on IntegriCloud