Skip to content

Commit fe83969

Browse files
committedAug 8, 2018
[InstCombine] fold fadd+fsub with common operand
This is a sibling to the simplify from: https://reviews.llvm.org/rL339174 llvm-svn: 339267
1 parent 2054dd7 commit fe83969

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed
 

‎llvm/lib/Transforms/InstCombine/InstCombineAddSub.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1911,6 +1911,11 @@ Instruction *InstCombiner::visitFSub(BinaryOperator &I) {
19111911
if (match(Op0, m_FSub(m_Specific(Op1), m_Value(X))))
19121912
return BinaryOperator::CreateFNegFMF(X, &I);
19131913

1914+
// Y - (X + Y) --> -X
1915+
// Y - (Y + X) --> -X
1916+
if (match(Op1, m_c_FAdd(m_Specific(Op0), m_Value(X))))
1917+
return BinaryOperator::CreateFNegFMF(X, &I);
1918+
19141919
// TODO: This performs reassociative folds for FP ops. Some fraction of the
19151920
// functionality has been subsumed by simple pattern matching here and in
19161921
// InstSimplify. We should let a dedicated reassociation pass handle more

‎llvm/test/Transforms/InstCombine/fast-math.ll

+8-10
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,8 @@ define float @fold8_reassoc(float %f1) {
269269

270270
define float @fsub_fadd_common_op_fneg(float %x, float %y) {
271271
; CHECK-LABEL: @fsub_fadd_common_op_fneg(
272-
; CHECK-NEXT: [[TMP1:%.*]] = fsub fast float -0.000000e+00, [[X:%.*]]
273-
; CHECK-NEXT: ret float [[TMP1]]
272+
; CHECK-NEXT: [[R:%.*]] = fsub fast float -0.000000e+00, [[X:%.*]]
273+
; CHECK-NEXT: ret float [[R]]
274274
;
275275
%a = fadd float %x, %y
276276
%r = fsub fast float %y, %a
@@ -283,8 +283,8 @@ define float @fsub_fadd_common_op_fneg(float %x, float %y) {
283283

284284
define float @fsub_fadd_common_op_fneg_reassoc_nsz(float %x, float %y) {
285285
; CHECK-LABEL: @fsub_fadd_common_op_fneg_reassoc_nsz(
286-
; CHECK-NEXT: [[TMP1:%.*]] = fsub reassoc nsz float -0.000000e+00, [[X:%.*]]
287-
; CHECK-NEXT: ret float [[TMP1]]
286+
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz float -0.000000e+00, [[X:%.*]]
287+
; CHECK-NEXT: ret float [[R]]
288288
;
289289
%a = fadd float %x, %y
290290
%r = fsub reassoc nsz float %y, %a
@@ -295,8 +295,7 @@ define float @fsub_fadd_common_op_fneg_reassoc_nsz(float %x, float %y) {
295295

296296
define <2 x float> @fsub_fadd_common_op_fneg_vec(<2 x float> %x, <2 x float> %y) {
297297
; CHECK-LABEL: @fsub_fadd_common_op_fneg_vec(
298-
; CHECK-NEXT: [[A:%.*]] = fadd <2 x float> [[X:%.*]], [[Y:%.*]]
299-
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz <2 x float> [[Y]], [[A]]
298+
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
300299
; CHECK-NEXT: ret <2 x float> [[R]]
301300
;
302301
%a = fadd <2 x float> %x, %y
@@ -309,8 +308,8 @@ define <2 x float> @fsub_fadd_common_op_fneg_vec(<2 x float> %x, <2 x float> %y)
309308

310309
define float @fsub_fadd_common_op_fneg_commute(float %x, float %y) {
311310
; CHECK-LABEL: @fsub_fadd_common_op_fneg_commute(
312-
; CHECK-NEXT: [[TMP1:%.*]] = fsub reassoc nsz float -0.000000e+00, [[X:%.*]]
313-
; CHECK-NEXT: ret float [[TMP1]]
311+
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz float -0.000000e+00, [[X:%.*]]
312+
; CHECK-NEXT: ret float [[R]]
314313
;
315314
%a = fadd float %y, %x
316315
%r = fsub reassoc nsz float %y, %a
@@ -321,8 +320,7 @@ define float @fsub_fadd_common_op_fneg_commute(float %x, float %y) {
321320

322321
define <2 x float> @fsub_fadd_common_op_fneg_commute_vec(<2 x float> %x, <2 x float> %y) {
323322
; CHECK-LABEL: @fsub_fadd_common_op_fneg_commute_vec(
324-
; CHECK-NEXT: [[A:%.*]] = fadd <2 x float> [[Y:%.*]], [[X:%.*]]
325-
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz <2 x float> [[Y]], [[A]]
323+
; CHECK-NEXT: [[R:%.*]] = fsub reassoc nsz <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
326324
; CHECK-NEXT: ret <2 x float> [[R]]
327325
;
328326
%a = fadd <2 x float> %y, %x

0 commit comments

Comments
 (0)
Please sign in to comment.