Fix a serious performance regression introduced by r108687 on linux:

turning (fptrunc (sqrt (fpext x))) -> (sqrtf x)  is great, but we have
to delete the original sqrt as well.  Not doing so causes us to do 
two sqrt's when building with -fmath-errno (the default on linux).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113260 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-09-07 20:01:38 +00:00
parent dc0b06c815
commit 979ed44feb
2 changed files with 25 additions and 4 deletions

View File

@ -1139,7 +1139,7 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
Arg->getOperand(0)->getType()->isFloatTy()) {
Function *Callee = Call->getCalledFunction();
Module *M = CI.getParent()->getParent()->getParent();
Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf",
Constant *SqrtfFunc = M->getOrInsertFunction("sqrtf",
Callee->getAttributes(),
Builder->getFloatTy(),
Builder->getFloatTy(),
@ -1147,6 +1147,11 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0),
"sqrtfcall");
ret->setAttributes(Callee->getAttributes());
// Remove the old Call. With -fmath-errno, it won't get marked readnone.
Call->replaceAllUsesWith(UndefValue::get(Call->getType()));
EraseInstFromFunction(*Call);
return ret;
}
}

View File

@ -1,7 +1,25 @@
; RUN: opt -S -instcombine %s | FileCheck %s
define float @foo(float %x) nounwind readnone ssp {
define float @test1(float %x) nounwind readnone ssp {
entry:
; CHECK: @test1
; CHECK-NOT: fpext
; CHECK-NOT: sqrt(
; CHECK: sqrtf(
; CHECK-NOT: fptrunc
%conv = fpext float %x to double ; <double> [#uses=1]
%call = tail call double @sqrt(double %conv) readnone nounwind ; <double> [#uses=1]
%conv1 = fptrunc double %call to float ; <float> [#uses=1]
; CHECK: ret float
ret float %conv1
}
declare double @sqrt(double)
; PR8096
define float @test2(float %x) nounwind readnone ssp {
entry:
; CHECK: @test2
; CHECK-NOT: fpext
; CHECK-NOT: sqrt(
; CHECK: sqrtf(
@ -12,5 +30,3 @@ entry:
; CHECK: ret float
ret float %conv1
}
declare double @sqrt(double) readnone