Skip to content

Commit 5db67e1

Browse files
authored
[GlobalISel] Add a fadd 0.0 combine with nsz (#153748)
This is surprisingly helpful, coming up a lot from fadd reductions.
1 parent bcf09c1 commit 5db67e1

File tree

3 files changed

+18
-30
lines changed

3 files changed

+18
-30
lines changed

llvm/include/llvm/Target/GlobalISel/Combine.td

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,13 @@ def right_identity_neg_zero_fp: GICombineRule<
560560
(apply (GIReplaceReg $dst, $x))
561561
>;
562562

563+
def right_identity_neg_zero_fp_nsz: GICombineRule<
564+
(defs root:$dst),
565+
(match (G_FADD $dst, $x, $y, (MIFlags FmNsz)):$root,
566+
[{ return Helper.matchConstantFPOp(${y}, 0.0); }]),
567+
(apply (GIReplaceReg $dst, $x))
568+
>;
569+
563570
// Fold x op 1 -> x
564571
def right_identity_one_int: GICombineRule<
565572
(defs root:$dst),
@@ -2003,7 +2010,7 @@ def identity_combines : GICombineGroup<[select_same_val, right_identity_zero,
20032010
trunc_buildvector_fold,
20042011
trunc_lshr_buildvector_fold,
20052012
bitcast_bitcast_fold, fptrunc_fpext_fold,
2006-
right_identity_neg_zero_fp,
2013+
right_identity_neg_zero_fp, right_identity_neg_zero_fp_nsz,
20072014
right_identity_neg_one_fp]>;
20082015

20092016
def const_combines : GICombineGroup<[constant_fold_fp_ops, const_ptradd_to_i2p,

llvm/test/CodeGen/AArch64/fadd-combines.ll

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -497,29 +497,17 @@ declare void @use(double)
497497

498498

499499
define float @faddvf32_zero_nsz(float %a) {
500-
; CHECK-SD-LABEL: faddvf32_zero_nsz:
501-
; CHECK-SD: // %bb.0:
502-
; CHECK-SD-NEXT: ret
503-
;
504-
; CHECK-GI-LABEL: faddvf32_zero_nsz:
505-
; CHECK-GI: // %bb.0:
506-
; CHECK-GI-NEXT: movi d1, #0000000000000000
507-
; CHECK-GI-NEXT: fadd s0, s0, s1
508-
; CHECK-GI-NEXT: ret
500+
; CHECK-LABEL: faddvf32_zero_nsz:
501+
; CHECK: // %bb.0:
502+
; CHECK-NEXT: ret
509503
%b = fadd nsz float %a, 0.0
510504
ret float %b
511505
}
512506

513507
define <2 x double> @faddv2f64_zero_nsz(<2 x double> %a) {
514-
; CHECK-SD-LABEL: faddv2f64_zero_nsz:
515-
; CHECK-SD: // %bb.0:
516-
; CHECK-SD-NEXT: ret
517-
;
518-
; CHECK-GI-LABEL: faddv2f64_zero_nsz:
519-
; CHECK-GI: // %bb.0:
520-
; CHECK-GI-NEXT: movi v1.2d, #0000000000000000
521-
; CHECK-GI-NEXT: fadd v0.2d, v0.2d, v1.2d
522-
; CHECK-GI-NEXT: ret
508+
; CHECK-LABEL: faddv2f64_zero_nsz:
509+
; CHECK: // %bb.0:
510+
; CHECK-NEXT: ret
523511
%b = fadd nsz <2 x double> %a, zeroinitializer
524512
ret <2 x double> %b
525513
}

llvm/test/CodeGen/AArch64/vecreduce-fadd.ll

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -209,17 +209,10 @@ define double @add_D(<2 x double> %bin.rdx) {
209209
}
210210

211211
define double @add_D_pos0(<2 x double> %bin.rdx) {
212-
; CHECK-SD-LABEL: add_D_pos0:
213-
; CHECK-SD: // %bb.0:
214-
; CHECK-SD-NEXT: faddp d0, v0.2d
215-
; CHECK-SD-NEXT: ret
216-
;
217-
; CHECK-GI-LABEL: add_D_pos0:
218-
; CHECK-GI: // %bb.0:
219-
; CHECK-GI-NEXT: movi d1, #0000000000000000
220-
; CHECK-GI-NEXT: faddp d0, v0.2d
221-
; CHECK-GI-NEXT: fadd d0, d0, d1
222-
; CHECK-GI-NEXT: ret
212+
; CHECK-LABEL: add_D_pos0:
213+
; CHECK: // %bb.0:
214+
; CHECK-NEXT: faddp d0, v0.2d
215+
; CHECK-NEXT: ret
223216
%r = call fast double @llvm.vector.reduce.fadd.f64.v2f64(double 0.0, <2 x double> %bin.rdx)
224217
ret double %r
225218
}

0 commit comments

Comments
 (0)