@@ -259,26 +259,20 @@ defm ATOMIC_LOAD32_U_I64 : AtomicLoad<I64, "i64.atomic.load32_u", 0x16>;
259259// therefore don't have the extension type field. So instead of matching that,
260260// we match the patterns that the type legalizer expands them to.
261261
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)>;
270262// Unlike regular loads, extension to i64 is handled differently than i32.
271263// i64 (zext (i8 (atomic_load_8))) gets legalized to
272264// 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.
273267def zext_aload_8_64 :
274268 PatFrag<(ops node:$addr),
275- (and ( i64 (anyext (i32 (atomic_load_8 node:$addr)))), 255 )>;
269+ (i64 (zext (i32 (atomic_load_8 node:$addr))))>;
276270def zext_aload_16_64 :
277271 PatFrag<(ops node:$addr),
278- (and ( i64 (anyext (i32 (atomic_load_16 node:$addr)))), 65535 )>;
272+ (i64 (zext (i32 (atomic_load_16 node:$addr))))>;
279273def zext_aload_32_64 :
280274 PatFrag<(ops node:$addr),
281- (zext (i32 (atomic_load node:$addr)))>;
275+ (i64 ( zext (i32 (atomic_load_32 node:$addr) )))>;
282276
283277// We don't have single sext atomic load instructions. So for sext loads, we
284278// match bare subword loads (for 32-bit results) and anyext loads (for 64-bit
@@ -290,8 +284,6 @@ def sext_aload_16_64 :
290284 PatFrag<(ops node:$addr), (anyext (i32 (atomic_load_16 node:$addr)))>;
291285
292286// 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">;
295287defm : LoadPatNoOffset<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
296288defm : LoadPatNoOffset<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
297289defm : 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">;
304296// 32->64 sext load gets selected as i32.atomic.load, i64.extend_i32_s
305297
306298// 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">;
311299defm : LoadPatImmOff<i64, zext_aload_8_64, regPlusImm, "ATOMIC_LOAD8_U_I64">;
312300defm : LoadPatImmOff<i64, zext_aload_16_64, regPlusImm, "ATOMIC_LOAD16_U_I64">;
313301defm : 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">;
327315// No 32->64 patterns, just use i32.atomic.load and i64.extend_s/i64
328316
329317// 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">;
332318defm : LoadPatOffsetOnly<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
333319defm : LoadPatOffsetOnly<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
334320defm : LoadPatOffsetOnly<i64, zext_aload_32_64, "ATOMIC_LOAD32_U_I64">;
@@ -337,8 +323,6 @@ defm : LoadPatOffsetOnly<i32, atomic_load_16, "ATOMIC_LOAD16_U_I32">;
337323defm : LoadPatOffsetOnly<i64, sext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
338324defm : LoadPatOffsetOnly<i64, sext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
339325
340- defm : LoadPatGlobalAddrOffOnly<i32, zext_aload_8_32, "ATOMIC_LOAD8_U_I32">;
341- defm : LoadPatGlobalAddrOffOnly<i32, zext_aload_16_32, "ATOMIC_LOAD16_U_I32">;
342326defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_8_64, "ATOMIC_LOAD8_U_I64">;
343327defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_16_64, "ATOMIC_LOAD16_U_I64">;
344328defm : LoadPatGlobalAddrOffOnly<i64, zext_aload_32_64, "ATOMIC_LOAD32_U_I64">;
@@ -651,22 +635,13 @@ defm : BinRMWPattern<atomic_swap_32, atomic_swap_64,
651635// These are combined patterns of truncating store patterns and zero-extending
652636// load patterns above.
653637class 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>;
659640class 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> :
668641 PatFrag<(ops node:$addr, node:$val),
669642 (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>;
670645
671646// Truncating & sign-extending binary RMW patterns.
672647// 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,
887862// additional nodes such as anyext or assertzext depending on operand types.
888863class zext_ter_rmw_8_32<PatFrag kind> :
889864 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>;
894867class zext_ter_rmw_8_64<PatFrag kind> :
895868 PatFrag<(ops node:$addr, node:$exp, node:$new),
896869 (zext (i32 (assertzext (i32 (kind node:$addr,
0 commit comments