Reimplement r108639 in InstCombine rather than DAGCombine.
authorOwen Anderson <resistor@mac.com>
Mon, 19 Jul 2010 08:09:34 +0000 (08:09 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 19 Jul 2010 08:09:34 +0000 (08:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108687 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCasts.cpp

index 505a0bf8f4e7f175b70c0015901d3d13e1e82958..042bf1a9829abbebd329f1556ef021c156c8cbd5 100644 (file)
@@ -1097,6 +1097,32 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
       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;
 }