[llvm-commits] [llvm] r59476 - in /llvm/trunk: lib/Transforms/Scalar/IndVarSimplify.cpp test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll

Devang Patel dpatel at apple.com
Mon Nov 17 16:40:03 PST 2008


Author: dpatel
Date: Mon Nov 17 18:40:02 2008
New Revision: 59476

URL: http://llvm.org/viewvc/llvm-project?rev=59476&view=rev
Log:

Give SIToFPInst preference over UIToFPInst because it is faster on platforms that are widely used.


Added:
    llvm/trunk/test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=59476&r1=59475&r2=59476&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp Mon Nov 17 18:40:02 2008
@@ -722,6 +722,23 @@
   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 @@
   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);

Added: llvm/trunk/test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll?rev=59476&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll (added)
+++ llvm/trunk/test/Transforms/IndVarsSimplify/2008-11-17-Floating.ll Mon Nov 17 18:40:02 2008
@@ -0,0 +1,35 @@
+; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep icmp | count 2
+; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep sitofp | count 1
+; RUN: llvm-as < %s | opt -indvars | llvm-dis | grep uitofp | count 1
+
+define void @bar() nounwind {
+entry:
+	br label %bb
+
+bb:		; preds = %bb, %entry
+	%x.0.reg2mem.0 = phi double [ 0.000000e+00, %entry ], [ %1, %bb ]		; <double> [#uses=2]
+	%0 = tail call i32 @foo(double %x.0.reg2mem.0) nounwind		; <i32> [#uses=0]
+	%1 = add double %x.0.reg2mem.0, 1.0e+0		; <double> [#uses=2]
+	%2 = fcmp olt double %1, 2147483646.0e+0		; <i1> [#uses=1]
+	br i1 %2, label %bb, label %return
+
+return:		; preds = %bb
+	ret void
+}
+
+define void @bar1() nounwind {
+entry:
+	br label %bb
+
+bb:		; preds = %bb, %entry
+	%x.0.reg2mem.0 = phi double [ 0.000000e+00, %entry ], [ %1, %bb ]		; <double> [#uses=2]
+	%0 = tail call i32 @foo(double %x.0.reg2mem.0) nounwind		; <i32> [#uses=0]
+	%1 = add double %x.0.reg2mem.0, 1.0e+0		; <double> [#uses=2]
+	%2 = fcmp olt double %1, 2147483647.0e+0		; <i1> [#uses=1]
+	br i1 %2, label %bb, label %return
+
+return:		; preds = %bb
+	ret void
+}
+
+declare i32 @foo(double)





More information about the llvm-commits mailing list