232 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple aarch64-unknown-unknown -run-pass=instruction-select -global-isel-abort=1 -verify-machineinstrs %s -o - | FileCheck %s3...4---5name: flip_eq6alignment: 47legalized: true8regBankSelected: true9body: |10 ; CHECK-LABEL: name: flip_eq11 ; CHECK: bb.0:12 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)13 ; CHECK-NEXT: liveins: $x014 ; CHECK-NEXT: {{ $}}15 ; CHECK-NEXT: %copy:gpr64all = COPY $x016 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_3217 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]18 ; CHECK-NEXT: TBNZW [[COPY1]], 3, %bb.119 ; CHECK-NEXT: B %bb.020 ; CHECK-NEXT: {{ $}}21 ; CHECK-NEXT: bb.1:22 ; CHECK-NEXT: RET_ReallyLR23 bb.0:24 successors: %bb.0, %bb.125 liveins: $x026 %copy:gpr(s64) = COPY $x027 28 ; Check bit 3.29 %bit:gpr(s64) = G_CONSTANT i64 830 %zero:gpr(s64) = G_CONSTANT i64 031 32 ; 8 has the third bit set.33 %fold_cst:gpr(s64) = G_CONSTANT i64 834 35 ; This only has the third bit set if %copy does not. So, to walk through36 ; this, we want to use a TBNZW on %copy.37 %fold_me:gpr(s64) = G_XOR %copy, %fold_cst38 39 %and:gpr(s64) = G_AND %fold_me, %bit40 %cmp:gpr(s32) = G_ICMP intpred(eq), %and(s64), %zero41 G_BRCOND %cmp, %bb.142 G_BR %bb.043 bb.1:44 RET_ReallyLR45...46---47name: flip_ne48alignment: 449legalized: true50regBankSelected: true51body: |52 ; CHECK-LABEL: name: flip_ne53 ; CHECK: bb.0:54 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)55 ; CHECK-NEXT: liveins: $x056 ; CHECK-NEXT: {{ $}}57 ; CHECK-NEXT: %copy:gpr64all = COPY $x058 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_3259 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]60 ; CHECK-NEXT: TBZW [[COPY1]], 3, %bb.161 ; CHECK-NEXT: B %bb.062 ; CHECK-NEXT: {{ $}}63 ; CHECK-NEXT: bb.1:64 ; CHECK-NEXT: RET_ReallyLR65 bb.0:66 successors: %bb.0, %bb.167 liveins: $x068 69 ; Same as eq case, but we should get a TBZW instead.70 71 %copy:gpr(s64) = COPY $x072 %bit:gpr(s64) = G_CONSTANT i64 873 %zero:gpr(s64) = G_CONSTANT i64 074 %fold_cst:gpr(s64) = G_CONSTANT i64 875 %fold_me:gpr(s64) = G_XOR %copy, %fold_cst76 %and:gpr(s64) = G_AND %fold_me, %bit77 %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero78 G_BRCOND %cmp, %bb.179 G_BR %bb.080 bb.1:81 RET_ReallyLR82...83---84name: dont_flip_eq85alignment: 486legalized: true87regBankSelected: true88body: |89 ; CHECK-LABEL: name: dont_flip_eq90 ; CHECK: bb.0:91 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)92 ; CHECK-NEXT: liveins: $x093 ; CHECK-NEXT: {{ $}}94 ; CHECK-NEXT: %copy:gpr64all = COPY $x095 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_3296 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]97 ; CHECK-NEXT: TBZW [[COPY1]], 3, %bb.198 ; CHECK-NEXT: B %bb.099 ; CHECK-NEXT: {{ $}}100 ; CHECK-NEXT: bb.1:101 ; CHECK-NEXT: RET_ReallyLR102 bb.0:103 successors: %bb.0, %bb.1104 liveins: $x0105 %copy:gpr(s64) = COPY $x0106 107 ; Check bit 3.108 %bit:gpr(s64) = G_CONSTANT i64 8109 %zero:gpr(s64) = G_CONSTANT i64 0110 111 ; 7 does not have the third bit set.112 %fold_cst:gpr(s64) = G_CONSTANT i64 7113 114 ; This only has the third bit set if %copy does. So, to walk through this,115 ; we should have a TBZW on %copy.116 %fold_me:gpr(s64) = G_XOR %fold_cst, %copy117 118 %and:gpr(s64) = G_AND %fold_me, %bit119 %cmp:gpr(s32) = G_ICMP intpred(eq), %and(s64), %zero120 G_BRCOND %cmp, %bb.1121 G_BR %bb.0122 bb.1:123 RET_ReallyLR124...125---126name: dont_flip_eq_zext127alignment: 4128legalized: true129regBankSelected: true130tracksRegLiveness: true131body: |132 ; CHECK-LABEL: name: dont_flip_eq_zext133 ; CHECK: bb.0:134 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)135 ; CHECK-NEXT: {{ $}}136 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $wzr137 ; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gpr64all = SUBREG_TO_REG 0, [[COPY]], %subreg.sub_32138 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY [[SUBREG_TO_REG]]139 ; CHECK-NEXT: TBNZX [[COPY1]], 63, %bb.1140 ; CHECK-NEXT: B %bb.0141 ; CHECK-NEXT: {{ $}}142 ; CHECK-NEXT: bb.1:143 ; CHECK-NEXT: RET_ReallyLR144 bb.0:145 successors: %bb.0(0x40000000), %bb.1(0x40000000)146 147 %1:gpr(s32) = G_CONSTANT i32 0148 %3:gpr(s32) = G_CONSTANT i32 -1149 %4:gpr(s32) = G_XOR %1, %3150 %5:gpr(s64) = G_ZEXT %4(s32)151 %15:gpr(s64) = G_CONSTANT i64 0152 %13:gpr(s32) = G_ICMP intpred(slt), %5(s64), %15153 G_BRCOND %13, %bb.1154 G_BR %bb.0155 bb.1:156 RET_ReallyLR157...158---159name: dont_flip_ne160alignment: 4161legalized: true162regBankSelected: true163body: |164 ; CHECK-LABEL: name: dont_flip_ne165 ; CHECK: bb.0:166 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)167 ; CHECK-NEXT: liveins: $x0168 ; CHECK-NEXT: {{ $}}169 ; CHECK-NEXT: %copy:gpr64all = COPY $x0170 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_32171 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]172 ; CHECK-NEXT: TBNZW [[COPY1]], 3, %bb.1173 ; CHECK-NEXT: B %bb.0174 ; CHECK-NEXT: {{ $}}175 ; CHECK-NEXT: bb.1:176 ; CHECK-NEXT: RET_ReallyLR177 bb.0:178 successors: %bb.0, %bb.1179 liveins: $x0180 181 ; Same as eq case, but we should get a TBNZW instead.182 183 %copy:gpr(s64) = COPY $x0184 %bit:gpr(s64) = G_CONSTANT i64 8185 %zero:gpr(s64) = G_CONSTANT i64 0186 %fold_cst:gpr(s64) = G_CONSTANT i64 7187 %fold_me:gpr(s64) = G_XOR %fold_cst, %copy188 %and:gpr(s64) = G_AND %fold_me, %bit189 %cmp:gpr(s32) = G_ICMP intpred(ne), %and(s64), %zero190 G_BRCOND %cmp, %bb.1191 G_BR %bb.0192 bb.1:193 RET_ReallyLR194...195---196name: xor_chain197alignment: 4198legalized: true199regBankSelected: true200body: |201 ; CHECK-LABEL: name: xor_chain202 ; CHECK: bb.0:203 ; CHECK-NEXT: successors: %bb.0(0x40000000), %bb.1(0x40000000)204 ; CHECK-NEXT: liveins: $x0205 ; CHECK-NEXT: {{ $}}206 ; CHECK-NEXT: %copy:gpr64all = COPY $x0207 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32all = COPY %copy.sub_32208 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY [[COPY]]209 ; CHECK-NEXT: TBZW [[COPY1]], 3, %bb.1210 ; CHECK-NEXT: B %bb.0211 ; CHECK-NEXT: {{ $}}212 ; CHECK-NEXT: bb.1:213 ; CHECK-NEXT: RET_ReallyLR214 bb.0:215 successors: %bb.0, %bb.1216 liveins: $x0217 %copy:gpr(s64) = COPY $x0218 %bit:gpr(s64) = G_CONSTANT i64 8219 %zero:gpr(s64) = G_CONSTANT i64 0220 %fold_cst:gpr(s64) = G_CONSTANT i64 8221 222 ; The G_XORs cancel each other out, so we should get a TBZW.223 %xor1:gpr(s64) = G_XOR %copy, %fold_cst224 %xor2:gpr(s64) = G_XOR %xor1, %fold_cst225 226 %and:gpr(s64) = G_AND %xor2, %bit227 %cmp:gpr(s32) = G_ICMP intpred(eq), %and(s64), %zero228 G_BRCOND %cmp, %bb.1229 G_BR %bb.0230 bb.1:231 RET_ReallyLR232