@@ -259,26 +259,20 @@ defm ATOMIC_LOAD32_U_I64 : AtomicLoad<I64, "i64.atomic.load32_u", 0x16>;
259
259
// therefore don't have the extension type field. So instead of matching that,
260
260
// we match the patterns that the type legalizer expands them to.
261
261
262
- // We directly match zext patterns and select the zext atomic loads.
263
- // i32 (zext (i8 (atomic_load_8))) gets legalized to
264
- // i32 (and (i32 (atomic_load_8)), 255)
265
- // These can be selected to a single zero-extending atomic load instruction.
266
- def zext_aload_8_32 :
267
- PatFrag<(ops node:$addr), (and (i32 (atomic_load_8 node:$addr)), 255)>;
268
- def zext_aload_16_32 :
269
- PatFrag<(ops node:$addr), (and (i32 (atomic_load_16 node:$addr)), 65535)>;
270
262
// Unlike regular loads, extension to i64 is handled differently than i32.
271
263
// i64 (zext (i8 (atomic_load_8))) gets legalized to
272
264
// i64 (and (i64 (anyext (i32 (atomic_load_8)))), 255)
265
+ // Extension to i32 is elided by SelectionDAG as our atomic loads are
266
+ // zero-extending.
273
267
def zext_aload_8_64 :
274
268
PatFrag<(ops node:$addr),
275
- (and ( i64 (anyext (i32 (atomic_load_8 node:$addr)))), 255 )>;
269
+ (i64 (zext (i32 (atomic_load_8 node:$addr))))>;
276
270
def zext_aload_16_64 :
277
271
PatFrag<(ops node:$addr),
278
- (and ( i64 (anyext (i32 (atomic_load_16 node:$addr)))), 65535 )>;
272
+ (i64 (zext (i32 (atomic_load_16 node:$addr))))>;
279
273
def zext_aload_32_64 :
280
274
PatFrag<(ops node:$addr),
281
- (zext (i32 (atomic_load node:$addr)))>;
275
+ (i64 ( zext (i32 (atomic_load_32 node:$addr) )))>;
282
276
283
277
// We don't have single sext atomic load instructions. So for sext loads, we
284
278
// match bare subword loads (for 32-bit results) and anyext loads (for 64-bit
@@ -290,8 +284,6 @@ def sext_aload_16_64 :
290
284
PatFrag<(ops node:$addr), (anyext (i32 (atomic_load_16 node:$addr)))>;
291
285
292
286
// Select zero-extending loads with no constant offset.
293
- defm : LoadPatNoOffset<i32, zext_aload_8_32, "ATOMIC_LOAD8_U_I32">;
294
- defm : LoadPatNoOffset<i32, zext_aload_16_32, "ATOMIC_LOAD16_U_I32">;
295
287
defm : LoadPatNoOffset<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
296
288
defm : LoadPatNoOffset<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
297
289
defm : LoadPatNoOffset<i64, zext_aload_32_64, "ATOMIC_LOAD32_U_I64">;
@@ -304,10 +296,6 @@ defm : LoadPatNoOffset<i64, sext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
304
296
// 32->64 sext load gets selected as i32.atomic.load, i64.extend_i32_s
305
297
306
298
// Zero-extending loads with constant offset
307
- defm : LoadPatImmOff<i32, zext_aload_8_32, regPlusImm, "ATOMIC_LOAD8_U_I32">;
308
- defm : LoadPatImmOff<i32, zext_aload_16_32, regPlusImm, "ATOMIC_LOAD16_U_I32">;
309
- defm : LoadPatImmOff<i32, zext_aload_8_32, or_is_add, "ATOMIC_LOAD8_U_I32">;
310
- defm : LoadPatImmOff<i32, zext_aload_16_32, or_is_add, "ATOMIC_LOAD16_U_I32">;
311
299
defm : LoadPatImmOff<i64, zext_aload_8_64, regPlusImm, "ATOMIC_LOAD8_U_I64">;
312
300
defm : LoadPatImmOff<i64, zext_aload_16_64, regPlusImm, "ATOMIC_LOAD16_U_I64">;
313
301
defm : LoadPatImmOff<i64, zext_aload_32_64, regPlusImm, "ATOMIC_LOAD32_U_I64">;
@@ -327,8 +315,6 @@ defm : LoadPatImmOff<i64, sext_aload_16_64, or_is_add, "ATOMIC_LOAD16_U_I64">;
327
315
// No 32->64 patterns, just use i32.atomic.load and i64.extend_s/i64
328
316
329
317
// Extending loads with just a constant offset
330
- defm : LoadPatOffsetOnly<i32, zext_aload_8_32, "ATOMIC_LOAD8_U_I32">;
331
- defm : LoadPatOffsetOnly<i32, zext_aload_16_32, "ATOMIC_LOAD16_U_I32">;
332
318
defm : LoadPatOffsetOnly<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
333
319
defm : LoadPatOffsetOnly<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
334
320
defm : LoadPatOffsetOnly<i64, zext_aload_32_64, "ATOMIC_LOAD32_U_I64">;
@@ -337,8 +323,6 @@ defm : LoadPatOffsetOnly<i32, atomic_load_16, "ATOMIC_LOAD16_U_I32">;
337
323
defm : LoadPatOffsetOnly<i64, sext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
338
324
defm : LoadPatOffsetOnly<i64, sext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
339
325
340
- defm : LoadPatGlobalAddrOffOnly<i32, zext_aload_8_32, "ATOMIC_LOAD8_U_I32">;
341
- defm : LoadPatGlobalAddrOffOnly<i32, zext_aload_16_32, "ATOMIC_LOAD16_U_I32">;
342
326
defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
343
327
defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
344
328
defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_32_64, "ATOMIC_LOAD32_U_I64">;
@@ -651,22 +635,13 @@ defm : BinRMWPattern<atomic_swap_32, atomic_swap_64,
651
635
// These are combined patterns of truncating store patterns and zero-extending
652
636
// load patterns above.
653
637
class zext_bin_rmw_8_32<PatFrag kind> :
654
- PatFrag<(ops node:$addr, node:$val),
655
- (and (i32 (kind node:$addr, node:$val)), 255)>;
656
- class zext_bin_rmw_16_32<PatFrag kind> :
657
- PatFrag<(ops node:$addr, node:$val),
658
- (and (i32 (kind node:$addr, node:$val)), 65535)>;
638
+ PatFrag<(ops node:$addr, node:$val), (i32 (kind node:$addr, node:$val))>;
639
+ class zext_bin_rmw_16_32<PatFrag kind> : zext_bin_rmw_8_32<kind>;
659
640
class zext_bin_rmw_8_64<PatFrag kind> :
660
- PatFrag<(ops node:$addr, node:$val),
661
- (and (i64 (anyext (i32 (kind node:$addr,
662
- (i32 (trunc (i64 node:$val))))))), 255)>;
663
- class zext_bin_rmw_16_64<PatFrag kind> :
664
- PatFrag<(ops node:$addr, node:$val),
665
- (and (i64 (anyext (i32 (kind node:$addr,
666
- (i32 (trunc (i64 node:$val))))))), 65535)>;
667
- class zext_bin_rmw_32_64<PatFrag kind> :
668
641
PatFrag<(ops node:$addr, node:$val),
669
642
(zext (i32 (kind node:$addr, (i32 (trunc (i64 node:$val))))))>;
643
+ class zext_bin_rmw_16_64<PatFrag kind> : zext_bin_rmw_8_64<kind>;
644
+ class zext_bin_rmw_32_64<PatFrag kind> : zext_bin_rmw_8_64<kind>;
670
645
671
646
// Truncating & sign-extending binary RMW patterns.
672
647
// These are combined patterns of truncating store patterns and sign-extending
@@ -887,10 +862,8 @@ defm : TerRMWPattern<atomic_cmp_swap_32, atomic_cmp_swap_64,
887
862
// additional nodes such as anyext or assertzext depending on operand types.
888
863
class zext_ter_rmw_8_32<PatFrag kind> :
889
864
PatFrag<(ops node:$addr, node:$exp, node:$new),
890
- (and (i32 (kind node:$addr, node:$exp, node:$new)), 255)>;
891
- class zext_ter_rmw_16_32<PatFrag kind> :
892
- PatFrag<(ops node:$addr, node:$exp, node:$new),
893
- (and (i32 (kind node:$addr, node:$exp, node:$new)), 65535)>;
865
+ (i32 (kind node:$addr, node:$exp, node:$new))>;
866
+ class zext_ter_rmw_16_32<PatFrag kind> : zext_ter_rmw_8_32<kind>;
894
867
class zext_ter_rmw_8_64<PatFrag kind> :
895
868
PatFrag<(ops node:$addr, node:$exp, node:$new),
896
869
(zext (i32 (assertzext (i32 (kind node:$addr,
0 commit comments