Commit 75e5c50b authored by Bill Wendling's avatar Bill Wendling
Browse files

Approved by Chris:

$ svn merge -c 113257 https://llvm.org/svn/llvm-project/llvm/trunk
--- Merging r113257 into '.':
A    test/Transforms/InstCombine/sqrt.ll
D    test/Transforms/InstCombine/2010-07-19-sqrt.ll

Renaming test.

$ svn merge -c 113260 https://llvm.org/svn/llvm-project/llvm/trunk
--- Merging r113260 into '.':
U    test/Transforms/InstCombine/sqrt.ll
U    lib/Transforms/InstCombine/InstCombineCasts.cpp

Log:
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).

llvm-svn: 113265
parent 0b8abab7
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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;
    }
  }
+32 −0
Original line number Diff line number Diff line
; 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) nounwind ; <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) readnone
declare double @sqrt(double)

; PR8096
define float @test2(float %x) nounwind readnone ssp {
entry:
; CHECK: @test2
; 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) nounwind ; <double> [#uses=1]
  %conv1 = fptrunc double %call to float          ; <float> [#uses=1]
; CHECK: ret float
  ret float %conv1
}