3
3
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O0 | FileCheck %s --check-prefixes=CHECK,-O0
4
4
; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+lsfe -O1 | FileCheck %s --check-prefixes=CHECK,-O1
5
5
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
+
6
9
define dso_local half @atomicrmw_fadd_half_aligned_monotonic (ptr %ptr , half %value ) {
7
10
; CHECK-LABEL: atomicrmw_fadd_half_aligned_monotonic:
8
11
; CHECK: ldfadd h0, h0, [x0]
9
12
%r = atomicrmw fadd ptr %ptr , half %value monotonic , align 2
10
13
ret half %r
11
14
}
12
15
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
+
13
23
define dso_local half @atomicrmw_fadd_half_aligned_acquire (ptr %ptr , half %value ) {
14
24
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acquire:
15
25
; CHECK: ldfadda h0, h0, [x0]
@@ -24,6 +34,13 @@ define dso_local half @atomicrmw_fadd_half_aligned_release(ptr %ptr, half %value
24
34
ret half %r
25
35
}
26
36
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
+
27
44
define dso_local half @atomicrmw_fadd_half_aligned_acq_rel (ptr %ptr , half %value ) {
28
45
; CHECK-LABEL: atomicrmw_fadd_half_aligned_acq_rel:
29
46
; CHECK: ldfaddal h0, h0, [x0]
@@ -45,6 +62,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_monotonic(ptr %ptr, bfloa
45
62
ret bfloat %r
46
63
}
47
64
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
+
48
72
define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
49
73
; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acquire:
50
74
; CHECK: ldbfadda h0, h0, [x0]
@@ -59,6 +83,13 @@ define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_release(ptr %ptr, bfloat
59
83
ret bfloat %r
60
84
}
61
85
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
+
62
93
define dso_local bfloat @atomicrmw_fadd_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
63
94
; CHECK-LABEL: atomicrmw_fadd_bfloat_aligned_acq_rel:
64
95
; CHECK: ldbfaddal h0, h0, [x0]
@@ -80,6 +111,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_monotonic(ptr %ptr, float %
80
111
ret float %r
81
112
}
82
113
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
+
83
121
define dso_local float @atomicrmw_fadd_float_aligned_acquire (ptr %ptr , float %value ) {
84
122
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acquire:
85
123
; CHECK: ldfadda s0, s0, [x0]
@@ -94,6 +132,13 @@ define dso_local float @atomicrmw_fadd_float_aligned_release(ptr %ptr, float %va
94
132
ret float %r
95
133
}
96
134
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
+
97
142
define dso_local float @atomicrmw_fadd_float_aligned_acq_rel (ptr %ptr , float %value ) {
98
143
; CHECK-LABEL: atomicrmw_fadd_float_aligned_acq_rel:
99
144
; CHECK: ldfaddal s0, s0, [x0]
@@ -115,6 +160,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_monotonic(ptr %ptr, doubl
115
160
ret double %r
116
161
}
117
162
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
+
118
170
define dso_local double @atomicrmw_fadd_double_aligned_acquire (ptr %ptr , double %value ) {
119
171
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acquire:
120
172
; CHECK: ldfadda d0, d0, [x0]
@@ -129,6 +181,13 @@ define dso_local double @atomicrmw_fadd_double_aligned_release(ptr %ptr, double
129
181
ret double %r
130
182
}
131
183
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
+
132
191
define dso_local double @atomicrmw_fadd_double_aligned_acq_rel (ptr %ptr , double %value ) {
133
192
; CHECK-LABEL: atomicrmw_fadd_double_aligned_acq_rel:
134
193
; CHECK: ldfaddal d0, d0, [x0]
@@ -805,6 +864,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_monotonic(ptr %ptr, half %val
805
864
ret half %r
806
865
}
807
866
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
+
808
874
define dso_local half @atomicrmw_fmax_half_aligned_acquire (ptr %ptr , half %value ) {
809
875
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acquire:
810
876
; CHECK: ldfmaxnma h0, h0, [x0]
@@ -819,6 +885,13 @@ define dso_local half @atomicrmw_fmax_half_aligned_release(ptr %ptr, half %value
819
885
ret half %r
820
886
}
821
887
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
+
822
895
define dso_local half @atomicrmw_fmax_half_aligned_acq_rel (ptr %ptr , half %value ) {
823
896
; CHECK-LABEL: atomicrmw_fmax_half_aligned_acq_rel:
824
897
; CHECK: ldfmaxnmal h0, h0, [x0]
@@ -840,6 +913,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_monotonic(ptr %ptr, bfloa
840
913
ret bfloat %r
841
914
}
842
915
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
+
843
923
define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
844
924
; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acquire:
845
925
; CHECK: ldbfmaxnma h0, h0, [x0]
@@ -854,6 +934,13 @@ define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_release(ptr %ptr, bfloat
854
934
ret bfloat %r
855
935
}
856
936
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
+
857
944
define dso_local bfloat @atomicrmw_fmax_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
858
945
; CHECK-LABEL: atomicrmw_fmax_bfloat_aligned_acq_rel:
859
946
; CHECK: ldbfmaxnmal h0, h0, [x0]
@@ -875,6 +962,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_monotonic(ptr %ptr, float %
875
962
ret float %r
876
963
}
877
964
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
+
878
972
define dso_local float @atomicrmw_fmax_float_aligned_acquire (ptr %ptr , float %value ) {
879
973
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acquire:
880
974
; CHECK: ldfmaxnma s0, s0, [x0]
@@ -889,6 +983,13 @@ define dso_local float @atomicrmw_fmax_float_aligned_release(ptr %ptr, float %va
889
983
ret float %r
890
984
}
891
985
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
+
892
993
define dso_local float @atomicrmw_fmax_float_aligned_acq_rel (ptr %ptr , float %value ) {
893
994
; CHECK-LABEL: atomicrmw_fmax_float_aligned_acq_rel:
894
995
; CHECK: ldfmaxnmal s0, s0, [x0]
@@ -910,6 +1011,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_monotonic(ptr %ptr, doubl
910
1011
ret double %r
911
1012
}
912
1013
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
+
913
1021
define dso_local double @atomicrmw_fmax_double_aligned_acquire (ptr %ptr , double %value ) {
914
1022
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acquire:
915
1023
; CHECK: ldfmaxnma d0, d0, [x0]
@@ -924,6 +1032,13 @@ define dso_local double @atomicrmw_fmax_double_aligned_release(ptr %ptr, double
924
1032
ret double %r
925
1033
}
926
1034
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
+
927
1042
define dso_local double @atomicrmw_fmax_double_aligned_acq_rel (ptr %ptr , double %value ) {
928
1043
; CHECK-LABEL: atomicrmw_fmax_double_aligned_acq_rel:
929
1044
; CHECK: ldfmaxnmal d0, d0, [x0]
@@ -1120,6 +1235,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_monotonic(ptr %ptr, half %val
1120
1235
ret half %r
1121
1236
}
1122
1237
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
+
1123
1245
define dso_local half @atomicrmw_fmin_half_aligned_acquire (ptr %ptr , half %value ) {
1124
1246
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acquire:
1125
1247
; CHECK: ldfminnma h0, h0, [x0]
@@ -1134,6 +1256,13 @@ define dso_local half @atomicrmw_fmin_half_aligned_release(ptr %ptr, half %value
1134
1256
ret half %r
1135
1257
}
1136
1258
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
+
1137
1266
define dso_local half @atomicrmw_fmin_half_aligned_acq_rel (ptr %ptr , half %value ) {
1138
1267
; CHECK-LABEL: atomicrmw_fmin_half_aligned_acq_rel:
1139
1268
; CHECK: ldfminnmal h0, h0, [x0]
@@ -1155,6 +1284,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_monotonic(ptr %ptr, bfloa
1155
1284
ret bfloat %r
1156
1285
}
1157
1286
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
+
1158
1294
define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acquire (ptr %ptr , bfloat %value ) {
1159
1295
; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acquire:
1160
1296
; CHECK: ldbfminnma h0, h0, [x0]
@@ -1169,6 +1305,13 @@ define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_release(ptr %ptr, bfloat
1169
1305
ret bfloat %r
1170
1306
}
1171
1307
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
+
1172
1315
define dso_local bfloat @atomicrmw_fmin_bfloat_aligned_acq_rel (ptr %ptr , bfloat %value ) {
1173
1316
; CHECK-LABEL: atomicrmw_fmin_bfloat_aligned_acq_rel:
1174
1317
; CHECK: ldbfminnmal h0, h0, [x0]
@@ -1190,6 +1333,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_monotonic(ptr %ptr, float %
1190
1333
ret float %r
1191
1334
}
1192
1335
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
+
1193
1343
define dso_local float @atomicrmw_fmin_float_aligned_acquire (ptr %ptr , float %value ) {
1194
1344
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acquire:
1195
1345
; CHECK: ldfminnma s0, s0, [x0]
@@ -1204,6 +1354,13 @@ define dso_local float @atomicrmw_fmin_float_aligned_release(ptr %ptr, float %va
1204
1354
ret float %r
1205
1355
}
1206
1356
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
+
1207
1364
define dso_local float @atomicrmw_fmin_float_aligned_acq_rel (ptr %ptr , float %value ) {
1208
1365
; CHECK-LABEL: atomicrmw_fmin_float_aligned_acq_rel:
1209
1366
; CHECK: ldfminnmal s0, s0, [x0]
@@ -1225,6 +1382,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_monotonic(ptr %ptr, doubl
1225
1382
ret double %r
1226
1383
}
1227
1384
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
+
1228
1392
define dso_local double @atomicrmw_fmin_double_aligned_acquire (ptr %ptr , double %value ) {
1229
1393
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acquire:
1230
1394
; CHECK: ldfminnma d0, d0, [x0]
@@ -1239,6 +1403,13 @@ define dso_local double @atomicrmw_fmin_double_aligned_release(ptr %ptr, double
1239
1403
ret double %r
1240
1404
}
1241
1405
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
+
1242
1413
define dso_local double @atomicrmw_fmin_double_aligned_acq_rel (ptr %ptr , double %value ) {
1243
1414
; CHECK-LABEL: atomicrmw_fmin_double_aligned_acq_rel:
1244
1415
; CHECK: ldfminnmal d0, d0, [x0]
0 commit comments