241 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=riscv64 -mattr=+a,+zacas,+zabha -run-pass=legalizer %s -o - \3# RUN: | FileCheck %s --check-prefixes=RV32IA-ZABHA4# RUN: llc -mtriple=riscv64 -mattr=+a -run-pass=legalizer %s -o - \5# RUN: | FileCheck %s --check-prefixes=RV32IA6 7---8name: cmpxchg_i89body: |10 bb.0:11 liveins: $x1012 13 ; RV32IA-ZABHA-LABEL: name: cmpxchg_i814 ; RV32IA-ZABHA: liveins: $x1015 ; RV32IA-ZABHA-NEXT: {{ $}}16 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1017 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 018 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 119 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s8))20 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)21 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x1022 ;23 ; RV32IA-LABEL: name: cmpxchg_i824 ; RV32IA: liveins: $x1025 ; RV32IA-NEXT: {{ $}}26 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1027 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 028 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 129 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s8))30 ; RV32IA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)31 ; RV32IA-NEXT: PseudoRET implicit $x1032 %0:_(p0) = COPY $x1033 %1:_(s8) = G_CONSTANT i8 034 %2:_(s8) = G_CONSTANT i8 135 %3:_(s8) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store monotonic (s8))36 %4:_(s64) = G_ANYEXT %337 $x10 = COPY %4(s64)38 PseudoRET implicit $x1039...40---41name: cmpxchg_i1642body: |43 bb.0:44 liveins: $x1045 46 ; RV32IA-ZABHA-LABEL: name: cmpxchg_i1647 ; RV32IA-ZABHA: liveins: $x1048 ; RV32IA-ZABHA-NEXT: {{ $}}49 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1050 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 051 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 152 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s16))53 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)54 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x1055 ;56 ; RV32IA-LABEL: name: cmpxchg_i1657 ; RV32IA: liveins: $x1058 ; RV32IA-NEXT: {{ $}}59 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1060 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 061 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 162 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s16))63 ; RV32IA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)64 ; RV32IA-NEXT: PseudoRET implicit $x1065 %0:_(p0) = COPY $x1066 %1:_(s16) = G_CONSTANT i16 067 %2:_(s16) = G_CONSTANT i16 168 %3:_(s16) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store monotonic (s16))69 %4:_(s64) = G_ANYEXT %370 $x10 = COPY %4(s64)71 PseudoRET implicit $x1072...73---74name: cmpxchg_i3275body: |76 bb.0:77 liveins: $x1078 79 ; RV32IA-ZABHA-LABEL: name: cmpxchg_i3280 ; RV32IA-ZABHA: liveins: $x1081 ; RV32IA-ZABHA-NEXT: {{ $}}82 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1083 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 084 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 185 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s32))86 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)87 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x1088 ;89 ; RV32IA-LABEL: name: cmpxchg_i3290 ; RV32IA: liveins: $x1091 ; RV32IA-NEXT: {{ $}}92 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x1093 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 094 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 195 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s32))96 ; RV32IA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)97 ; RV32IA-NEXT: PseudoRET implicit $x1098 %0:_(p0) = COPY $x1099 %1:_(s32) = G_CONSTANT i32 0100 %2:_(s32) = G_CONSTANT i32 1101 %3:_(s32) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store monotonic (s32))102 %4:_(s64) = G_ANYEXT %3103 $x10 = COPY %4(s64)104 PseudoRET implicit $x10105...106---107name: cmpxchg_i64108body: |109 bb.0:110 liveins: $x10111 112 ; RV32IA-ZABHA-LABEL: name: cmpxchg_i64113 ; RV32IA-ZABHA: liveins: $x10114 ; RV32IA-ZABHA-NEXT: {{ $}}115 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10116 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0117 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1118 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s64))119 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)120 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x10121 ;122 ; RV32IA-LABEL: name: cmpxchg_i64123 ; RV32IA: liveins: $x10124 ; RV32IA-NEXT: {{ $}}125 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10126 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0127 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1128 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s64))129 ; RV32IA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)130 ; RV32IA-NEXT: PseudoRET implicit $x10131 %0:_(p0) = COPY $x10132 %1:_(s64) = G_CONSTANT i64 0133 %2:_(s64) = G_CONSTANT i64 1134 %3:_(s64) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store monotonic (s64))135 $x10 = COPY %3(s64)136 PseudoRET implicit $x10137...138---139name: cmpxchg_with_success_i32140 141body: |142 bb.0:143 liveins: $x10144 145 ; RV32IA-ZABHA-LABEL: name: cmpxchg_with_success_i32146 ; RV32IA-ZABHA: liveins: $x10147 ; RV32IA-ZABHA-NEXT: {{ $}}148 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10149 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0150 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1151 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s32))152 ; RV32IA-ZABHA-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[ATOMIC_CMPXCHG]], 32153 ; RV32IA-ZABHA-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[SEXT_INREG]](s64), [[C]]154 ; RV32IA-ZABHA-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2155 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)156 ; RV32IA-ZABHA-NEXT: $x11 = COPY [[ICMP]](s64)157 ; RV32IA-ZABHA-NEXT: PseudoCALL target-flags(riscv-call) &__muldi3, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10158 ; RV32IA-ZABHA-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2159 ; RV32IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10160 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[COPY1]](s64)161 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x10162 ;163 ; RV32IA-LABEL: name: cmpxchg_with_success_i32164 ; RV32IA: liveins: $x10165 ; RV32IA-NEXT: {{ $}}166 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10167 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0168 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1169 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s32))170 ; RV32IA-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s64) = G_SEXT_INREG [[ATOMIC_CMPXCHG]], 32171 ; RV32IA-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[SEXT_INREG]](s64), [[C]]172 ; RV32IA-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2173 ; RV32IA-NEXT: $x10 = COPY [[ATOMIC_CMPXCHG]](s64)174 ; RV32IA-NEXT: $x11 = COPY [[ICMP]](s64)175 ; RV32IA-NEXT: PseudoCALL target-flags(riscv-call) &__muldi3, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10176 ; RV32IA-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2177 ; RV32IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x10178 ; RV32IA-NEXT: $x10 = COPY [[COPY1]](s64)179 ; RV32IA-NEXT: PseudoRET implicit $x10180 %0:_(p0) = COPY $x10181 %1:_(s32) = G_CONSTANT i32 0182 %2:_(s32) = G_CONSTANT i32 1183 %3:_(s32), %4:_(s1) = G_ATOMIC_CMPXCHG_WITH_SUCCESS %0, %1, %2 :: (load store monotonic (s32))184 %5:_(s32) = G_ANYEXT %4185 %6:_(s32) = G_MUL %3, %5186 %7:_(s64) = G_ANYEXT %6187 $x10 = COPY %7(s64)188 PseudoRET implicit $x10189...190---191name: cmpxchg_with_success_i64192 193body: |194 bb.0:195 liveins: $x10196 197 ; RV32IA-ZABHA-LABEL: name: cmpxchg_with_success_i64198 ; RV32IA-ZABHA: liveins: $x10199 ; RV32IA-ZABHA-NEXT: {{ $}}200 ; RV32IA-ZABHA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10201 ; RV32IA-ZABHA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0202 ; RV32IA-ZABHA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1203 ; RV32IA-ZABHA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s64))204 ; RV32IA-ZABHA-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[ATOMIC_CMPXCHG]](s64), [[C]]205 ; RV32IA-ZABHA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY [[ATOMIC_CMPXCHG]](s64)206 ; RV32IA-ZABHA-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2207 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[COPY1]](s64)208 ; RV32IA-ZABHA-NEXT: $x11 = COPY [[ICMP]](s64)209 ; RV32IA-ZABHA-NEXT: PseudoCALL target-flags(riscv-call) &__muldi3, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10210 ; RV32IA-ZABHA-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2211 ; RV32IA-ZABHA-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x10212 ; RV32IA-ZABHA-NEXT: $x10 = COPY [[COPY2]](s64)213 ; RV32IA-ZABHA-NEXT: PseudoRET implicit $x10214 ;215 ; RV32IA-LABEL: name: cmpxchg_with_success_i64216 ; RV32IA: liveins: $x10217 ; RV32IA-NEXT: {{ $}}218 ; RV32IA-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x10219 ; RV32IA-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0220 ; RV32IA-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1221 ; RV32IA-NEXT: [[ATOMIC_CMPXCHG:%[0-9]+]]:_(s64) = G_ATOMIC_CMPXCHG [[COPY]](p0), [[C]], [[C1]] :: (load store monotonic (s64))222 ; RV32IA-NEXT: [[ICMP:%[0-9]+]]:_(s64) = G_ICMP intpred(eq), [[ATOMIC_CMPXCHG]](s64), [[C]]223 ; RV32IA-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY [[ATOMIC_CMPXCHG]](s64)224 ; RV32IA-NEXT: ADJCALLSTACKDOWN 0, 0, implicit-def $x2, implicit $x2225 ; RV32IA-NEXT: $x10 = COPY [[COPY1]](s64)226 ; RV32IA-NEXT: $x11 = COPY [[ICMP]](s64)227 ; RV32IA-NEXT: PseudoCALL target-flags(riscv-call) &__muldi3, csr_ilp32_lp64, implicit-def $x1, implicit $x10, implicit $x11, implicit-def $x10228 ; RV32IA-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $x2, implicit $x2229 ; RV32IA-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $x10230 ; RV32IA-NEXT: $x10 = COPY [[COPY2]](s64)231 ; RV32IA-NEXT: PseudoRET implicit $x10232 %0:_(p0) = COPY $x10233 %1:_(s64) = G_CONSTANT i64 0234 %2:_(s64) = G_CONSTANT i64 1235 %3:_(s64), %4:_(s1) = G_ATOMIC_CMPXCHG_WITH_SUCCESS %0, %1, %2 :: (load store monotonic (s64))236 %5:_(s64) = G_ANYEXT %4237 %6:_(s64) = G_MUL %3, %5238 $x10 = COPY %6(s64)239 PseudoRET implicit $x10240...241