[llvm-commits] [llvm] r51271 - in /llvm/trunk: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/sitofp.ll

Chris Lattner sabre at nondot.org
Mon May 19 13:25:04 PDT 2008


Author: lattner
Date: Mon May 19 15:25:04 2008
New Revision: 51271

URL: http://llvm.org/viewvc/llvm-project?rev=51271&view=rev
Log:
convert fptosi(sitofp x) -> x  if the fp value has enough bits in its mantissa
to accurately represent the integer.  This triggers 9 times in 471.omnetpp,
though 8 of those seem to be inlined from the same place.

Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
    llvm/trunk/test/Transforms/InstCombine/sitofp.ll

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

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Mon May 19 15:25:04 2008
@@ -208,8 +208,8 @@
     Instruction *visitSExt(SExtInst &CI);
     Instruction *visitFPTrunc(FPTruncInst &CI);
     Instruction *visitFPExt(CastInst &CI);
-    Instruction *visitFPToUI(CastInst &CI);
-    Instruction *visitFPToSI(CastInst &CI);
+    Instruction *visitFPToUI(FPToUIInst &FI);
+    Instruction *visitFPToSI(FPToSIInst &FI);
     Instruction *visitUIToFP(CastInst &CI);
     Instruction *visitSIToFP(CastInst &CI);
     Instruction *visitPtrToInt(CastInst &CI);
@@ -2439,9 +2439,9 @@
       } while (Size >= 1);
       
       // FIXME: This shouldn't be necessary. When the backends can handle types
-      // with funny bit widths then this whole cascade of if statements should
-      // be removed. It is just here to get the size of the "middle" type back
-      // up to something that the back ends can handle.
+      // with funny bit widths then this switch statement should be removed. It
+      // is just here to get the size of the "middle" type back up to something
+      // that the back ends can handle.
       const Type *MiddleType = 0;
       switch (Size) {
         default: break;
@@ -7995,12 +7995,30 @@
   return commonCastTransforms(CI);
 }
 
-Instruction *InstCombiner::visitFPToUI(CastInst &CI) {
-  return commonCastTransforms(CI);
-}
-
-Instruction *InstCombiner::visitFPToSI(CastInst &CI) {
-  return commonCastTransforms(CI);
+Instruction *InstCombiner::visitFPToUI(FPToUIInst &FI) {
+  // fptoui(uitofp(X)) --> X  if the intermediate type has enough bits in its
+  // mantissa to accurately represent all values of X.  For example, do not
+  // do this with i64->float->i64.
+  if (UIToFPInst *SrcI = dyn_cast<UIToFPInst>(FI.getOperand(0)))
+    if (SrcI->getOperand(0)->getType() == FI.getType() &&
+        (int)FI.getType()->getPrimitiveSizeInBits() < /*extra bit for sign */
+                    GetFPMantissaWidth(SrcI->getType()))
+      return ReplaceInstUsesWith(FI, SrcI->getOperand(0));
+
+  return commonCastTransforms(FI);
+}
+
+Instruction *InstCombiner::visitFPToSI(FPToSIInst &FI) {
+  // fptosi(sitofp(X)) --> X  if the intermediate type has enough bits in its
+  // mantissa to accurately represent all values of X.  For example, do not
+  // do this with i64->float->i64.
+  if (SIToFPInst *SrcI = dyn_cast<SIToFPInst>(FI.getOperand(0)))
+    if (SrcI->getOperand(0)->getType() == FI.getType() &&
+        (int)FI.getType()->getPrimitiveSizeInBits() <= 
+                    GetFPMantissaWidth(SrcI->getType()))
+      return ReplaceInstUsesWith(FI, SrcI->getOperand(0));
+  
+  return commonCastTransforms(FI);
 }
 
 Instruction *InstCombiner::visitUIToFP(CastInst &CI) {

Modified: llvm/trunk/test/Transforms/InstCombine/sitofp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sitofp.ll?rev=51271&r1=51270&r2=51271&view=diff

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/sitofp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/sitofp.ll Mon May 19 15:25:04 2008
@@ -23,3 +23,11 @@
   ret i1 %C  ;  A != 127
 }
 
+define i32 @test5(i32 %A) {
+  %B = sitofp i32 %A to double
+  %C = fptosi double %B to i32
+  %D = uitofp i32 %C to double
+  %E = fptoui double %D to i32
+  ret i32 %E
+}
+





More information about the llvm-commits mailing list