33; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
44; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
55
6+ ; NOTE: '_unused' tests are added to ensure we do not lower to ST[F]ADD when the destination register is WZR/XZR.
7+ ; See discussion on https://github.com/llvm/llvm-project/pull/131174
8+
69define dso_local half @atomicrmw_fadd_half_aligned_monotonic (ptr %ptr , half %value ) {
710; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
811; CHECK: ldfadd h0, h0, [x0]
912 %r = atomicrmw fadd ptr %ptr , half %value monotonic , align 2
1013 ret half %r
1114}
1215
16+ define dso_local void @atomicrmw_fadd_half_aligned_monotonic_unused (ptr %ptr , half %value ) {
17+ ; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic_unused:
18+ ; CHECK: ldfadd h0, h0, [x0]
19+ %r = atomicrmw fadd ptr %ptr , half %value monotonic , align 2
20+ ret void
21+ }
22+
1323define dso_local half @atomicrmw_fadd_half_aligned_acquire (ptr %ptr , half %value ) {
1424; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
1525; CHECK: ldfadda h0, h0, [x0]
@@ -24,6 +34,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value
2434 ret half %r
2535}
2636
37+ define dso_local void @atomicrmw_fadd_half_aligned_release_unused (ptr %ptr , half %value ) {
38+ ; CHECK-LABEL: atomicrmw_fadd_half_aligned_release_unused:
39+ ; CHECK: ldfaddl h0, h0, [x0]
40+ %r = atomicrmw fadd ptr %ptr , half %value release , align 2
41+ ret void
42+ }
43+
2744define dso_local half @atomicrmw_fadd_half_aligned_acq_rel (ptr %ptr , half %value ) {
2845; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
2946; CHECK: ldfaddal h0, h0, [x0]
@@ -45,6 +62,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa
4562 ret bfloat %r
4663}
4764
65+ define dso_local void @atomicrmw_fadd_bfloat_aligned_monotonic_unused (ptr %ptr , bfloat %value ) {
66+ ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_monotonic_unused:
67+ ; CHECK: ldbfadd h0, h0, [x0]
68+ %r = atomicrmw fadd ptr %ptr , bfloat %value monotonic , align 2
69+ ret void
70+ }
71+
4872define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
4973; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
5074; CHECK: ldbfadda h0, h0, [x0]
@@ -59,6 +83,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat
5983 ret bfloat %r
6084}
6185
86+ define dso_local void @atomicrmw_fadd_bfloat_aligned_release_unused (ptr %ptr , bfloat %value ) {
87+ ; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_release_unused:
88+ ; CHECK: ldbfaddl h0, h0, [x0]
89+ %r = atomicrmw fadd ptr %ptr , bfloat %value release , align 2
90+ ret void
91+ }
92+
6293define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
6394; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
6495; CHECK: ldbfaddal h0, h0, [x0]
@@ -80,6 +111,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %
80111 ret float %r
81112}
82113
114+ define dso_local void @atomicrmw_fadd_float_aligned_monotonic_unused (ptr %ptr , float %value ) {
115+ ; CHECK-LABEL: atomicrmw_fadd_float_aligned_monotonic_unused:
116+ ; CHECK: ldfadd s0, s0, [x0]
117+ %r = atomicrmw fadd ptr %ptr , float %value monotonic , align 4
118+ ret void
119+ }
120+
83121define dso_local float @atomicrmw_fadd_float_aligned_acquire (ptr %ptr , float %value ) {
84122; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
85123; CHECK: ldfadda s0, s0, [x0]
@@ -94,6 +132,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va
94132 ret float %r
95133}
96134
135+ define dso_local void @atomicrmw_fadd_float_aligned_release_unused (ptr %ptr , float %value ) {
136+ ; CHECK-LABEL: atomicrmw_fadd_float_aligned_release_unused:
137+ ; CHECK: ldfaddl s0, s0, [x0]
138+ %r = atomicrmw fadd ptr %ptr , float %value release , align 4
139+ ret void
140+ }
141+
97142define dso_local float @atomicrmw_fadd_float_aligned_acq_rel (ptr %ptr , float %value ) {
98143; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
99144; CHECK: ldfaddal s0, s0, [x0]
@@ -115,6 +160,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl
115160 ret double %r
116161}
117162
163+ define dso_local void @atomicrmw_fadd_double_aligned_monotonic_unused (ptr %ptr , double %value ) {
164+ ; CHECK-LABEL: atomicrmw_fadd_double_aligned_monotonic_unused:
165+ ; CHECK: ldfadd d0, d0, [x0]
166+ %r = atomicrmw fadd ptr %ptr , double %value monotonic , align 8
167+ ret void
168+ }
169+
118170define dso_local double @atomicrmw_fadd_double_aligned_acquire (ptr %ptr , double %value ) {
119171; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
120172; CHECK: ldfadda d0, d0, [x0]
@@ -129,6 +181,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double
129181 ret double %r
130182}
131183
184+ define dso_local void @atomicrmw_fadd_double_aligned_release_unused (ptr %ptr , double %value ) {
185+ ; CHECK-LABEL: atomicrmw_fadd_double_aligned_release_unused:
186+ ; CHECK: ldfaddl d0, d0, [x0]
187+ %r = atomicrmw fadd ptr %ptr , double %value release , align 8
188+ ret void
189+ }
190+
132191define dso_local double @atomicrmw_fadd_double_aligned_acq_rel (ptr %ptr , double %value ) {
133192; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
134193; CHECK: ldfaddal d0, d0, [x0]
@@ -805,6 +864,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val
805864 ret half %r
806865}
807866
867+ define dso_local void @atomicrmw_fmax_half_aligned_monotonic_unused (ptr %ptr , half %value ) {
868+ ; CHECK-LABEL: atomicrmw_fmax_half_aligned_monotonic_unused:
869+ ; CHECK: ldfmaxnm h0, h0, [x0]
870+ %r = atomicrmw fmax ptr %ptr , half %value monotonic , align 2
871+ ret void
872+ }
873+
808874define dso_local half @atomicrmw_fmax_half_aligned_acquire (ptr %ptr , half %value ) {
809875; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
810876; CHECK: ldfmaxnma h0, h0, [x0]
@@ -819,6 +885,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value
819885 ret half %r
820886}
821887
888+ define dso_local void @atomicrmw_fmax_half_aligned_release_unused (ptr %ptr , half %value ) {
889+ ; CHECK-LABEL: atomicrmw_fmax_half_aligned_release_unused:
890+ ; CHECK: ldfmaxnml h0, h0, [x0]
891+ %r = atomicrmw fmax ptr %ptr , half %value release , align 2
892+ ret void
893+ }
894+
822895define dso_local half @atomicrmw_fmax_half_aligned_acq_rel (ptr %ptr , half %value ) {
823896; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
824897; CHECK: ldfmaxnmal h0, h0, [x0]
@@ -840,6 +913,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa
840913 ret bfloat %r
841914}
842915
916+ define dso_local void @atomicrmw_fmax_bfloat_aligned_monotonic_unused (ptr %ptr , bfloat %value ) {
917+ ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_monotonic_unused:
918+ ; CHECK: ldbfmaxnm h0, h0, [x0]
919+ %r = atomicrmw fmax ptr %ptr , bfloat %value monotonic , align 2
920+ ret void
921+ }
922+
843923define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
844924; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
845925; CHECK: ldbfmaxnma h0, h0, [x0]
@@ -854,6 +934,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat
854934 ret bfloat %r
855935}
856936
937+ define dso_local void @atomicrmw_fmax_bfloat_aligned_release_unused (ptr %ptr , bfloat %value ) {
938+ ; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_release_unused:
939+ ; CHECK: ldbfmaxnml h0, h0, [x0]
940+ %r = atomicrmw fmax ptr %ptr , bfloat %value release , align 2
941+ ret void
942+ }
943+
857944define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
858945; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
859946; CHECK: ldbfmaxnmal h0, h0, [x0]
@@ -875,6 +962,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %
875962 ret float %r
876963}
877964
965+ define dso_local void @atomicrmw_fmax_float_aligned_monotonic_unused (ptr %ptr , float %value ) {
966+ ; CHECK-LABEL: atomicrmw_fmax_float_aligned_monotonic_unused:
967+ ; CHECK: ldfmaxnm s0, s0, [x0]
968+ %r = atomicrmw fmax ptr %ptr , float %value monotonic , align 4
969+ ret void
970+ }
971+
878972define dso_local float @atomicrmw_fmax_float_aligned_acquire (ptr %ptr , float %value ) {
879973; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
880974; CHECK: ldfmaxnma s0, s0, [x0]
@@ -889,6 +983,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va
889983 ret float %r
890984}
891985
986+ define dso_local void @atomicrmw_fmax_float_aligned_release_unused (ptr %ptr , float %value ) {
987+ ; CHECK-LABEL: atomicrmw_fmax_float_aligned_release_unused:
988+ ; CHECK: ldfmaxnml s0, s0, [x0]
989+ %r = atomicrmw fmax ptr %ptr , float %value release , align 4
990+ ret void
991+ }
992+
892993define dso_local float @atomicrmw_fmax_float_aligned_acq_rel (ptr %ptr , float %value ) {
893994; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
894995; CHECK: ldfmaxnmal s0, s0, [x0]
@@ -910,6 +1011,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl
9101011 ret double %r
9111012}
9121013
1014+ define dso_local void @atomicrmw_fmax_double_aligned_monotonic_unused (ptr %ptr , double %value ) {
1015+ ; CHECK-LABEL: atomicrmw_fmax_double_aligned_monotonic_unused:
1016+ ; CHECK: ldfmaxnm d0, d0, [x0]
1017+ %r = atomicrmw fmax ptr %ptr , double %value monotonic , align 8
1018+ ret void
1019+ }
1020+
9131021define dso_local double @atomicrmw_fmax_double_aligned_acquire (ptr %ptr , double %value ) {
9141022; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
9151023; CHECK: ldfmaxnma d0, d0, [x0]
@@ -924,6 +1032,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double
9241032 ret double %r
9251033}
9261034
1035+ define dso_local void @atomicrmw_fmax_double_aligned_release_unused (ptr %ptr , double %value ) {
1036+ ; CHECK-LABEL: atomicrmw_fmax_double_aligned_release_unused:
1037+ ; CHECK: ldfmaxnml d0, d0, [x0]
1038+ %r = atomicrmw fmax ptr %ptr , double %value release , align 8
1039+ ret void
1040+ }
1041+
9271042define dso_local double @atomicrmw_fmax_double_aligned_acq_rel (ptr %ptr , double %value ) {
9281043; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
9291044; CHECK: ldfmaxnmal d0, d0, [x0]
@@ -1120,6 +1235,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val
11201235 ret half %r
11211236}
11221237
1238+ define dso_local void @atomicrmw_fmin_half_aligned_monotonic_unused (ptr %ptr , half %value ) {
1239+ ; CHECK-LABEL: atomicrmw_fmin_half_aligned_monotonic_unused:
1240+ ; CHECK: ldfminnm h0, h0, [x0]
1241+ %r = atomicrmw fmin ptr %ptr , half %value monotonic , align 2
1242+ ret void
1243+ }
1244+
11231245define dso_local half @atomicrmw_fmin_half_aligned_acquire (ptr %ptr , half %value ) {
11241246; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
11251247; CHECK: ldfminnma h0, h0, [x0]
@@ -1134,6 +1256,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value
11341256 ret half %r
11351257}
11361258
1259+ define dso_local void @atomicrmw_fmin_half_aligned_release_unused (ptr %ptr , half %value ) {
1260+ ; CHECK-LABEL: atomicrmw_fmin_half_aligned_release_unused:
1261+ ; CHECK: ldfminnml h0, h0, [x0]
1262+ %r = atomicrmw fmin ptr %ptr , half %value release , align 2
1263+ ret void
1264+ }
1265+
11371266define dso_local half @atomicrmw_fmin_half_aligned_acq_rel (ptr %ptr , half %value ) {
11381267; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
11391268; CHECK: ldfminnmal h0, h0, [x0]
@@ -1155,6 +1284,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa
11551284 ret bfloat %r
11561285}
11571286
1287+ define dso_local void @atomicrmw_fmin_bfloat_aligned_monotonic_unused (ptr %ptr , bfloat %value ) {
1288+ ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_monotonic_unused:
1289+ ; CHECK: ldbfminnm h0, h0, [x0]
1290+ %r = atomicrmw fmin ptr %ptr , bfloat %value monotonic , align 2
1291+ ret void
1292+ }
1293+
11581294define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
11591295; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
11601296; CHECK: ldbfminnma h0, h0, [x0]
@@ -1169,6 +1305,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat
11691305 ret bfloat %r
11701306}
11711307
1308+ define dso_local void @atomicrmw_fmin_bfloat_aligned_release_unused (ptr %ptr , bfloat %value ) {
1309+ ; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_release_unused:
1310+ ; CHECK: ldbfminnml h0, h0, [x0]
1311+ %r = atomicrmw fmin ptr %ptr , bfloat %value release , align 2
1312+ ret void
1313+ }
1314+
11721315define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
11731316; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
11741317; CHECK: ldbfminnmal h0, h0, [x0]
@@ -1190,6 +1333,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %
11901333 ret float %r
11911334}
11921335
1336+ define dso_local void @atomicrmw_fmin_float_aligned_monotonic_unused (ptr %ptr , float %value ) {
1337+ ; CHECK-LABEL: atomicrmw_fmin_float_aligned_monotonic_unused:
1338+ ; CHECK: ldfminnm s0, s0, [x0]
1339+ %r = atomicrmw fmin ptr %ptr , float %value monotonic , align 4
1340+ ret void
1341+ }
1342+
11931343define dso_local float @atomicrmw_fmin_float_aligned_acquire (ptr %ptr , float %value ) {
11941344; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
11951345; CHECK: ldfminnma s0, s0, [x0]
@@ -1204,6 +1354,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va
12041354 ret float %r
12051355}
12061356
1357+ define dso_local void @atomicrmw_fmin_float_aligned_release_unused (ptr %ptr , float %value ) {
1358+ ; CHECK-LABEL: atomicrmw_fmin_float_aligned_release_unused:
1359+ ; CHECK: ldfminnml s0, s0, [x0]
1360+ %r = atomicrmw fmin ptr %ptr , float %value release , align 4
1361+ ret void
1362+ }
1363+
12071364define dso_local float @atomicrmw_fmin_float_aligned_acq_rel (ptr %ptr , float %value ) {
12081365; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
12091366; CHECK: ldfminnmal s0, s0, [x0]
@@ -1225,6 +1382,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl
12251382 ret double %r
12261383}
12271384
1385+ define dso_local void @atomicrmw_fmin_double_aligned_monotonic_unused (ptr %ptr , double %value ) {
1386+ ; CHECK-LABEL: atomicrmw_fmin_double_aligned_monotonic_unused:
1387+ ; CHECK: ldfminnm d0, d0, [x0]
1388+ %r = atomicrmw fmin ptr %ptr , double %value monotonic , align 8
1389+ ret void
1390+ }
1391+
12281392define dso_local double @atomicrmw_fmin_double_aligned_acquire (ptr %ptr , double %value ) {
12291393; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
12301394; CHECK: ldfminnma d0, d0, [x0]
@@ -1239,6 +1403,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double
12391403 ret double %r
12401404}
12411405
1406+ define dso_local void @atomicrmw_fmin_double_aligned_release_unused (ptr %ptr , double %value ) {
1407+ ; CHECK-LABEL: atomicrmw_fmin_double_aligned_release_unused:
1408+ ; CHECK: ldfminnml d0, d0, [x0]
1409+ %r = atomicrmw fmin ptr %ptr , double %value release , align 8
1410+ ret void
1411+ }
1412+
12421413define dso_local double @atomicrmw_fmin_double_aligned_acq_rel (ptr %ptr , double %value ) {
12431414; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
12441415; CHECK: ldfminnmal d0, d0, [x0]
0 commit comments