Skip to content

Commit 9af9245

Browse files
committed
[AArch64][SVE] Extend predicated fadd/fsub patterns to negative zero
This adds -0.0 patterns for fadd and fsub, to go with D147723. The fsub pattern is only added for completeness but with -0.0 being the neutral element the fadd case comes up from vectorized reductions. Differential Revision: https://reviews.llvm.org/D147724
1 parent b28f407 commit 9af9245

File tree

2 files changed

+10
-26
lines changed

2 files changed

+10
-26
lines changed

llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,12 +264,14 @@ def AArch64fmul_m1 : EitherVSelectOrPassthruPatFrags<int_aarch64_sve_fmul, AArch
264264
def AArch64fadd_m1 : PatFrags<(ops node:$pg, node:$op1, node:$op2), [
265265
(int_aarch64_sve_fadd node:$pg, node:$op1, node:$op2),
266266
(vselect node:$pg, (AArch64fadd_p (SVEAllActive), node:$op1, node:$op2), node:$op1),
267-
(AArch64fadd_p_nsz (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDup0)))
267+
(AArch64fadd_p_nsz (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDup0))),
268+
(AArch64fadd_p (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDupNeg0)))
268269
]>;
269270
def AArch64fsub_m1 : PatFrags<(ops node:$pg, node:$op1, node:$op2), [
270271
(int_aarch64_sve_fsub node:$pg, node:$op1, node:$op2),
271272
(vselect node:$pg, (AArch64fsub_p (SVEAllActive), node:$op1, node:$op2), node:$op1),
272-
(AArch64fsub_p (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDup0)))
273+
(AArch64fsub_p (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDup0))),
274+
(AArch64fsub_p_nsz (SVEAllActive), node:$op1, (vselect node:$pg, node:$op2, (SVEDupNeg0)))
273275
]>;
274276

275277
def AArch64shadd : PatFrags<(ops node:$pg, node:$op1, node:$op2),

llvm/test/CodeGen/AArch64/sve-fp-combine.ll

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -889,10 +889,7 @@ define <vscale x 2 x double> @fsub_d_sel(<vscale x 2 x double> %a, <vscale x 2 x
889889
define <vscale x 8 x half> @fadd_h_sel_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {
890890
; CHECK-LABEL: fadd_h_sel_negzero:
891891
; CHECK: // %bb.0:
892-
; CHECK-NEXT: mov w8, #32768 // =0x8000
893-
; CHECK-NEXT: mov z2.h, w8
894-
; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h
895-
; CHECK-NEXT: fadd z0.h, z0.h, z1.h
892+
; CHECK-NEXT: fadd z0.h, p0/m, z0.h, z1.h
896893
; CHECK-NEXT: ret
897894
%nz = fneg <vscale x 8 x half> zeroinitializer
898895
%sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> %nz
@@ -903,10 +900,7 @@ define <vscale x 8 x half> @fadd_h_sel_negzero(<vscale x 8 x half> %a, <vscale x
903900
define <vscale x 4 x float> @fadd_s_sel_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {
904901
; CHECK-LABEL: fadd_s_sel_negzero:
905902
; CHECK: // %bb.0:
906-
; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000
907-
; CHECK-NEXT: mov z2.s, w8
908-
; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s
909-
; CHECK-NEXT: fadd z0.s, z0.s, z1.s
903+
; CHECK-NEXT: fadd z0.s, p0/m, z0.s, z1.s
910904
; CHECK-NEXT: ret
911905
%nz = fneg <vscale x 4 x float> zeroinitializer
912906
%sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> %nz
@@ -917,10 +911,7 @@ define <vscale x 4 x float> @fadd_s_sel_negzero(<vscale x 4 x float> %a, <vscale
917911
define <vscale x 2 x double> @fadd_d_sel_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {
918912
; CHECK-LABEL: fadd_d_sel_negzero:
919913
; CHECK: // %bb.0:
920-
; CHECK-NEXT: mov x8, #-9223372036854775808 // =0x8000000000000000
921-
; CHECK-NEXT: mov z2.d, x8
922-
; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d
923-
; CHECK-NEXT: fadd z0.d, z0.d, z1.d
914+
; CHECK-NEXT: fadd z0.d, p0/m, z0.d, z1.d
924915
; CHECK-NEXT: ret
925916
%nz = fneg <vscale x 2 x double> zeroinitializer
926917
%sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> %nz
@@ -931,10 +922,7 @@ define <vscale x 2 x double> @fadd_d_sel_negzero(<vscale x 2 x double> %a, <vsca
931922
define <vscale x 8 x half> @fsub_h_sel_negzero(<vscale x 8 x half> %a, <vscale x 8 x half> %b, <vscale x 8 x i1> %mask) {
932923
; CHECK-LABEL: fsub_h_sel_negzero:
933924
; CHECK: // %bb.0:
934-
; CHECK-NEXT: mov w8, #32768 // =0x8000
935-
; CHECK-NEXT: mov z2.h, w8
936-
; CHECK-NEXT: sel z1.h, p0, z1.h, z2.h
937-
; CHECK-NEXT: fsub z0.h, z0.h, z1.h
925+
; CHECK-NEXT: fsub z0.h, p0/m, z0.h, z1.h
938926
; CHECK-NEXT: ret
939927
%nz = fneg <vscale x 8 x half> zeroinitializer
940928
%sel = select <vscale x 8 x i1> %mask, <vscale x 8 x half> %b, <vscale x 8 x half> %nz
@@ -945,10 +933,7 @@ define <vscale x 8 x half> @fsub_h_sel_negzero(<vscale x 8 x half> %a, <vscale x
945933
define <vscale x 4 x float> @fsub_s_sel_negzero(<vscale x 4 x float> %a, <vscale x 4 x float> %b, <vscale x 4 x i1> %mask) {
946934
; CHECK-LABEL: fsub_s_sel_negzero:
947935
; CHECK: // %bb.0:
948-
; CHECK-NEXT: mov w8, #-2147483648 // =0x80000000
949-
; CHECK-NEXT: mov z2.s, w8
950-
; CHECK-NEXT: sel z1.s, p0, z1.s, z2.s
951-
; CHECK-NEXT: fsub z0.s, z0.s, z1.s
936+
; CHECK-NEXT: fsub z0.s, p0/m, z0.s, z1.s
952937
; CHECK-NEXT: ret
953938
%nz = fneg <vscale x 4 x float> zeroinitializer
954939
%sel = select <vscale x 4 x i1> %mask, <vscale x 4 x float> %b, <vscale x 4 x float> %nz
@@ -959,10 +944,7 @@ define <vscale x 4 x float> @fsub_s_sel_negzero(<vscale x 4 x float> %a, <vscale
959944
define <vscale x 2 x double> @fsub_d_sel_negzero(<vscale x 2 x double> %a, <vscale x 2 x double> %b, <vscale x 2 x i1> %mask) {
960945
; CHECK-LABEL: fsub_d_sel_negzero:
961946
; CHECK: // %bb.0:
962-
; CHECK-NEXT: mov x8, #-9223372036854775808 // =0x8000000000000000
963-
; CHECK-NEXT: mov z2.d, x8
964-
; CHECK-NEXT: sel z1.d, p0, z1.d, z2.d
965-
; CHECK-NEXT: fsub z0.d, z0.d, z1.d
947+
; CHECK-NEXT: fsub z0.d, p0/m, z0.d, z1.d
966948
; CHECK-NEXT: ret
967949
%nz = fneg <vscale x 2 x double> zeroinitializer
968950
%sel = select <vscale x 2 x i1> %mask, <vscale x 2 x double> %b, <vscale x 2 x double> %nz

0 commit comments

Comments
 (0)