From da5e148474e717918af06024d0b2ead54373f3f9 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Thu, 16 Jan 2014 20:59:41 +0000 Subject: [PATCH] Fix a bug in InstCombine where we failed to preserve fast math flags when optimizing an FMUL expression. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199424 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 7 +++++-- test/Transforms/InstCombine/fmul.ll | 5 ++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 6c34b1bf566..94461c5f84a 100644 --- a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -525,8 +525,11 @@ Instruction *InstCombiner::visitFMul(BinaryOperator &I) { Value *N1 = dyn_castFNegVal(Opnd1, IgnoreZeroSign); // -X * -Y => X*Y - if (N1) - return BinaryOperator::CreateFMul(N0, N1); + if (N1) { + Value *FMul = Builder->CreateFMul(N0, N1); + FMul->takeName(&I); + return ReplaceInstUsesWith(I, FMul); + } if (Opnd0->hasOneUse()) { // -X * Y => -(X*Y) (Promote negation as high as possible) diff --git a/test/Transforms/InstCombine/fmul.ll b/test/Transforms/InstCombine/fmul.ll index 71b7138b644..0b4a90d88fa 100644 --- a/test/Transforms/InstCombine/fmul.ll +++ b/test/Transforms/InstCombine/fmul.ll @@ -24,10 +24,10 @@ define float @test2(float %x) { define float @test3(float %x, float %y) { %sub1 = fsub float -0.000000e+00, %x %sub2 = fsub float -0.000000e+00, %y - %mul = fmul float %sub1, %sub2 + %mul = fmul fast float %sub1, %sub2 ret float %mul ; CHECK-LABEL: @test3( -; CHECK: fmul float %x, %y +; CHECK: fmul fast float %x, %y } ; (0.0 - X) * (0.0 - Y) => X * Y @@ -104,4 +104,3 @@ define float @test9(float %x) { ; CHECK: fsub } - -- 2.34.1