# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=riscv64 -mattr=+a,+zabha -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=RV64IA-ZABHA # RUN: llc -mtriple=riscv64 -mattr=+a -run-pass=legalizer %s -o - | FileCheck %s --check-prefixes=RV64IA --- name: atomicrmw_add_i8_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_add_i8_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s8)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_add_i8_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s8)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s8) = G_TRUNC %1(s64) %3:_(s8) = G_ATOMICRMW_ADD %0(p0), %2 :: (load store monotonic (s8)) %4:_(s64) = G_ANYEXT %3(s8) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_add_i16_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_add_i16_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s16)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_add_i16_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s16)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s16) = G_TRUNC %1(s64) %3:_(s16) = G_ATOMICRMW_ADD %0(p0), %2 :: (load store monotonic (s16)) %4:_(s64) = G_ANYEXT %3(s16) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_add_i32_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_add_i32_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s32)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_add_i32_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s32)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s32) = G_TRUNC %1(s64) %3:_(s32) = G_ATOMICRMW_ADD %0(p0), %2 :: (load store monotonic (s32)) %4:_(s64) = G_ANYEXT %3(s32) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_add_i64_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_add_i64_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s64)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_add_i64_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[COPY1]] :: (load store monotonic (s64)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s64) = G_ATOMICRMW_ADD %0(p0), %1 :: (load store monotonic (s64)) $x10 = COPY %2(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_sub_i8_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_sub_i8_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-ZABHA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s8)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_sub_i8_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s8)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s8) = G_TRUNC %1(s64) %3:_(s8) = G_ATOMICRMW_SUB %0(p0), %2 :: (load store monotonic (s8)) %4:_(s64) = G_ANYEXT %3(s8) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_sub_i16_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_sub_i16_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-ZABHA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s16)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_sub_i16_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s16)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s16) = G_TRUNC %1(s64) %3:_(s16) = G_ATOMICRMW_SUB %0(p0), %2 :: (load store monotonic (s16)) %4:_(s64) = G_ANYEXT %3(s16) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_sub_i32_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_sub_i32_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-ZABHA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s32)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_sub_i32_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s32)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s32) = G_TRUNC %1(s64) %3:_(s32) = G_ATOMICRMW_SUB %0(p0), %2 :: (load store monotonic (s32)) %4:_(s64) = G_ANYEXT %3(s32) $x10 = COPY %4(s64) PseudoRET implicit $x10 ... --- name: atomicrmw_sub_i64_monotonic body: | bb.0.entry: liveins: $x10, $x11 ; RV64IA-ZABHA-LABEL: name: atomicrmw_sub_i64_monotonic ; RV64IA-ZABHA: liveins: $x10, $x11 ; RV64IA-ZABHA-NEXT: {{ $}} ; RV64IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-ZABHA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-ZABHA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s64)) ; RV64IA-ZABHA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-ZABHA-NEXT: PseudoRET implicit $x10 ; ; RV64IA-LABEL: name: atomicrmw_sub_i64_monotonic ; RV64IA: liveins: $x10, $x11 ; RV64IA-NEXT: {{ $}} ; RV64IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10 ; RV64IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x11 ; RV64IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0 ; RV64IA-NEXT: [[SUB:%[0-9]+]]:_(s64) = G_SUB [[C]], [[COPY1]] ; RV64IA-NEXT: [[ATOMICRMW_ADD:%[0-9]+]]:_(s64) = G_ATOMICRMW_ADD [[COPY]](p0), [[SUB]] :: (load store monotonic (s64)) ; RV64IA-NEXT: $x10 = COPY [[ATOMICRMW_ADD]](s64) ; RV64IA-NEXT: PseudoRET implicit $x10 %0:_(p0) = COPY $x10 %1:_(s64) = COPY $x11 %2:_(s64) = G_ATOMICRMW_SUB %0(p0), %1 :: (load store monotonic (s64)) $x10 = COPY %2(s64) PseudoRET implicit $x10 ...