Skip to content

Commit 4ba1ed2

Browse files
committed
Push fneg into RHS instead of LHS
This is better because we canonicalize fneg to the right, so this will cancel out two fnegs.
1 parent 6f90ac1 commit 4ba1ed2

File tree

2 files changed

+13
-16
lines changed

2 files changed

+13
-16
lines changed

llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2719,8 +2719,10 @@ Instruction *InstCombinerImpl::hoistFNegAboveFMulFDiv(Value *FNegOp,
27192719
Instruction &FMFSource) {
27202720
Value *X, *Y;
27212721
if (match(FNegOp, m_FMul(m_Value(X), m_Value(Y)))) {
2722+
// Push into RHS which is more likely to simplify (const or another fneg).
2723+
// FIXME: It would be better to invert the transform.
27222724
return cast<Instruction>(Builder.CreateFMulFMF(
2723-
Builder.CreateFNegFMF(X, &FMFSource), Y, &FMFSource));
2725+
X, Builder.CreateFNegFMF(Y, &FMFSource), &FMFSource));
27242726
}
27252727

27262728
if (match(FNegOp, m_FDiv(m_Value(X), m_Value(Y)))) {

llvm/test/Transforms/InstCombine/fast-basictest.ll

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -549,9 +549,8 @@ define float @test16_reassoc(float %a, float %b, float %z) {
549549

550550
define float @test17(float %a, float %b, float %z) {
551551
; CHECK-LABEL: @test17(
552-
; CHECK-NEXT: [[C:%.*]] = fmul fast float [[Z:%.*]], -4.000000e+01
553-
; CHECK-NEXT: [[TMP1:%.*]] = fneg fast float [[A:%.*]]
554-
; CHECK-NEXT: [[F:%.*]] = fmul fast float [[C]], [[TMP1]]
552+
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[Z:%.*]], 4.000000e+01
553+
; CHECK-NEXT: [[F:%.*]] = fmul fast float [[A:%.*]], [[TMP1]]
555554
; CHECK-NEXT: ret float [[F]]
556555
;
557556
%d = fmul fast float %z, 4.000000e+01
@@ -563,9 +562,8 @@ define float @test17(float %a, float %b, float %z) {
563562

564563
define float @test17_unary_fneg(float %a, float %b, float %z) {
565564
; CHECK-LABEL: @test17_unary_fneg(
566-
; CHECK-NEXT: [[C:%.*]] = fmul fast float [[Z:%.*]], -4.000000e+01
567-
; CHECK-NEXT: [[TMP1:%.*]] = fneg fast float [[A:%.*]]
568-
; CHECK-NEXT: [[F:%.*]] = fmul fast float [[C]], [[TMP1]]
565+
; CHECK-NEXT: [[TMP1:%.*]] = fmul fast float [[Z:%.*]], 4.000000e+01
566+
; CHECK-NEXT: [[F:%.*]] = fmul fast float [[A:%.*]], [[TMP1]]
569567
; CHECK-NEXT: ret float [[F]]
570568
;
571569
%d = fmul fast float %z, 4.000000e+01
@@ -577,9 +575,8 @@ define float @test17_unary_fneg(float %a, float %b, float %z) {
577575

578576
define float @test17_reassoc_nsz(float %a, float %b, float %z) {
579577
; CHECK-LABEL: @test17_reassoc_nsz(
580-
; CHECK-NEXT: [[C:%.*]] = fmul reassoc nsz float [[Z:%.*]], -4.000000e+01
581-
; CHECK-NEXT: [[TMP1:%.*]] = fneg reassoc nsz float [[A:%.*]]
582-
; CHECK-NEXT: [[F:%.*]] = fmul reassoc nsz float [[C]], [[TMP1]]
578+
; CHECK-NEXT: [[TMP1:%.*]] = fmul reassoc nsz float [[Z:%.*]], 4.000000e+01
579+
; CHECK-NEXT: [[F:%.*]] = fmul reassoc nsz float [[A:%.*]], [[TMP1]]
583580
; CHECK-NEXT: ret float [[F]]
584581
;
585582
%d = fmul reassoc nsz float %z, 4.000000e+01
@@ -609,9 +606,8 @@ define float @test17_reassoc(float %a, float %b, float %z) {
609606

610607
define float @test17_unary_fneg_no_FMF(float %a, float %b, float %z) {
611608
; CHECK-LABEL: @test17_unary_fneg_no_FMF(
612-
; CHECK-NEXT: [[C:%.*]] = fmul float [[Z:%.*]], -4.000000e+01
613-
; CHECK-NEXT: [[TMP1:%.*]] = fneg float [[A:%.*]]
614-
; CHECK-NEXT: [[F:%.*]] = fmul float [[C]], [[TMP1]]
609+
; CHECK-NEXT: [[TMP1:%.*]] = fmul float [[Z:%.*]], 4.000000e+01
610+
; CHECK-NEXT: [[F:%.*]] = fmul float [[A:%.*]], [[TMP1]]
615611
; CHECK-NEXT: ret float [[F]]
616612
;
617613
%d = fmul float %z, 4.000000e+01
@@ -623,9 +619,8 @@ define float @test17_unary_fneg_no_FMF(float %a, float %b, float %z) {
623619

624620
define float @test17_reassoc_unary_fneg(float %a, float %b, float %z) {
625621
; CHECK-LABEL: @test17_reassoc_unary_fneg(
626-
; CHECK-NEXT: [[C:%.*]] = fmul reassoc float [[Z:%.*]], -4.000000e+01
627-
; CHECK-NEXT: [[TMP1:%.*]] = fneg reassoc float [[A:%.*]]
628-
; CHECK-NEXT: [[F:%.*]] = fmul reassoc float [[C]], [[TMP1]]
622+
; CHECK-NEXT: [[TMP1:%.*]] = fmul reassoc float [[Z:%.*]], 4.000000e+01
623+
; CHECK-NEXT: [[F:%.*]] = fmul reassoc float [[A:%.*]], [[TMP1]]
629624
; CHECK-NEXT: ret float [[F]]
630625
;
631626
%d = fmul reassoc float %z, 4.000000e+01

0 commit comments

Comments
 (0)