[llvm-commits] [llvm] r108687 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp

Owen Anderson resistor at mac.com
Mon Jul 19 01:09:34 PDT 2010


Author: resistor
Date: Mon Jul 19 03:09:34 2010
New Revision: 108687

URL: http://llvm.org/viewvc/llvm-project?rev=108687&view=rev
Log:
Reimplement r108639 in InstCombine rather than DAGCombine.

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=108687&r1=108686&r2=108687&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Mon Jul 19 03:09:34 2010
@@ -1097,6 +1097,32 @@
       break;  
     }
   }
+  
+  // Fold (fptrunc (sqrt (fpext x))) -> (sqrtf x)
+  // NOTE: This should be disabled by -fno-builtin-sqrt if we ever support it.
+  CallInst *Call = dyn_cast<CallInst>(CI.getOperand(0));
+  if (Call && Call->getCalledFunction() &&
+      Call->getCalledFunction()->getName() == "sqrt" &&
+      Call->getNumArgOperands() == 1) {
+    CastInst *Arg = dyn_cast<CastInst>(Call->getArgOperand(0));
+    if (Arg && Arg->getOpcode() == Instruction::FPExt &&
+        CI.getType() == Builder->getFloatTy() &&
+        Call->getType() == Builder->getDoubleTy() &&
+        Arg->getType() == Builder->getDoubleTy() &&
+        Arg->getOperand(0)->getType() == Builder->getFloatTy()) {
+      Module* M = CI.getParent()->getParent()->getParent();
+      Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf", 
+                                                   Call->getAttributes(),
+                                                   Builder->getFloatTy(),
+                                                   Builder->getFloatTy(),
+                                                   NULL);
+      CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0),
+                                       "sqrtfcall");
+      ret->setAttributes(Call->getAttributes());
+      return ret;
+    }
+  }
+  
   return 0;
 }
 





More information about the llvm-commits mailing list