mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +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()) {
|
Arg->getOperand(0)->getType()->isFloatTy()) {
|
||||||
Function *Callee = Call->getCalledFunction();
|
Function *Callee = Call->getCalledFunction();
|
||||||
Module *M = CI.getParent()->getParent()->getParent();
|
Module *M = CI.getParent()->getParent()->getParent();
|
||||||
Constant* SqrtfFunc = M->getOrInsertFunction("sqrtf",
|
Constant *SqrtfFunc = M->getOrInsertFunction("sqrtf",
|
||||||
Callee->getAttributes(),
|
Callee->getAttributes(),
|
||||||
Builder->getFloatTy(),
|
Builder->getFloatTy(),
|
||||||
Builder->getFloatTy(),
|
Builder->getFloatTy(),
|
||||||
@ -1147,6 +1147,11 @@ Instruction *InstCombiner::visitFPTrunc(FPTruncInst &CI) {
|
|||||||
CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0),
|
CallInst *ret = CallInst::Create(SqrtfFunc, Arg->getOperand(0),
|
||||||
"sqrtfcall");
|
"sqrtfcall");
|
||||||
ret->setAttributes(Callee->getAttributes());
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,25 @@
|
|||||||
; RUN: opt -S -instcombine %s | FileCheck %s
|
; RUN: opt -S -instcombine %s | FileCheck %s
|
||||||
|
|
||||||
define float @foo(float %x) nounwind readnone ssp {
|
define float @test1(float %x) nounwind readnone ssp {
|
||||||
entry:
|
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: fpext
|
||||||
; CHECK-NOT: sqrt(
|
; CHECK-NOT: sqrt(
|
||||||
; CHECK: sqrtf(
|
; CHECK: sqrtf(
|
||||||
@ -12,5 +30,3 @@ entry:
|
|||||||
; CHECK: ret float
|
; CHECK: ret float
|
||||||
ret float %conv1
|
ret float %conv1
|
||||||
}
|
}
|
||||||
|
|
||||||
declare double @sqrt(double) readnone
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user