[llvm] r199420 - Teach InstCombine that (fmul X, -1.0) can be simplified to (fneg X), which LLVM expresses as (fsub -0.0, X).
Owen Anderson
resistor at mac.com
Thu Jan 16 12:36:43 PST 2014
Author: resistor
Date: Thu Jan 16 14:36:42 2014
New Revision: 199420
URL: http://llvm.org/viewvc/llvm-project?rev=199420&view=rev
Log:
Teach InstCombine that (fmul X, -1.0) can be simplified to (fneg X), which LLVM expresses as (fsub -0.0, X).
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
llvm/trunk/test/Transforms/InstCombine/fmul.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp?rev=199420&r1=199419&r2=199420&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp Thu Jan 16 14:36:42 2014
@@ -426,6 +426,16 @@ Instruction *InstCombiner::visitFMul(Bin
return NV;
ConstantFP *C = dyn_cast<ConstantFP>(Op1);
+
+ // (fmul X, -1.0) --> (fsub -0.0, X)
+ if (C && C->isExactlyValue(-1.0)) {
+ Instruction *RI = BinaryOperator::CreateFSub(
+ ConstantFP::getNegativeZero(C->getType()),
+ Op0);
+ RI->copyFastMathFlags(&I);
+ return RI;
+ }
+
if (C && AllowReassociate && C->getValueAPF().isFiniteNonZero()) {
// Let MDC denote an expression in one of these forms:
// X * C, C/X, X/C, where C is a constant.
Modified: llvm/trunk/test/Transforms/InstCombine/fmul.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/fmul.ll?rev=199420&r1=199419&r2=199420&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/fmul.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/fmul.ll Thu Jan 16 14:36:42 2014
@@ -93,3 +93,15 @@ for.body:
for.end: ; preds = %for.cond
ret void
}
+
+; X * -1.0 => -0.0 - X
+define float @test9(float %x) {
+ %mul = fmul float %x, -1.0
+ ret float %mul
+
+; CHECK-LABEL: @test9(
+; CHECK-NOT: fmul
+; CHECK: fsub
+}
+
+
More information about the llvm-commits
mailing list