mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 22:50:47 +00:00
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:
parent
dc0b06c815
commit
979ed44feb
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user