1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5 2# RUN: llc -mtriple=x86_64 -run-pass x86-flags-copy-lowering -mattr=+ndd -verify-machineinstrs -o - %s | FileCheck --check-prefixes=CHECK,NDD %s 3# RUN: llc -mtriple=x86_64 -run-pass x86-flags-copy-lowering -mattr=+ndd,+nf -verify-machineinstrs -o - %s | FileCheck --check-prefixes=CHECK,NDD-NF %s 4# Lower various interesting copy patterns of EFLAGS without using LAHF/SAHF. 5 6... 7--- 8name: test_adc 9body: | 10 bb.0: 11 liveins: $rdi, $rsi 12 13 ; CHECK-LABEL: name: test_adc 14 ; CHECK: liveins: $rdi, $rsi 15 ; CHECK-NEXT: {{ $}} 16 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 17 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 18 ; CHECK-NEXT: [[ADD64rr_ND:%[0-9]+]]:gr64 = ADD64rr_ND [[COPY]], [[COPY1]], implicit-def $eflags 19 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 20 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 21 ; CHECK-NEXT: dead [[ADD8ri_ND:%[0-9]+]]:gr8 = ADD8ri_ND [[SETCCr]], 255, implicit-def $eflags 22 ; CHECK-NEXT: [[ADC64ri32_ND:%[0-9]+]]:gr64 = ADC64ri32_ND [[ADD64rr_ND]], 42, implicit-def $eflags, implicit killed $eflags 23 ; CHECK-NEXT: [[ADC64ri32_ND1:%[0-9]+]]:gr64 = ADC64ri32_ND [[ADC64ri32_ND]], 42, implicit-def $eflags, implicit $eflags 24 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[ADC64ri32_ND1]] 25 ; CHECK-NEXT: RET 0 26 %0:gr64 = COPY $rdi 27 %1:gr64 = COPY $rsi 28 %2:gr64 = ADD64rr_ND %0, %1, implicit-def $eflags 29 %3:gr64 = COPY $eflags 30 31 INLINEASM &nop, 1, 12, implicit-def dead $eflags 32 33 $eflags = COPY %3 34 %4:gr64 = ADC64ri32_ND %2:gr64, 42, implicit-def $eflags, implicit $eflags 35 %5:gr64 = ADC64ri32_ND %4:gr64, 42, implicit-def $eflags, implicit $eflags 36 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 37 38 RET 0 39 40... 41--- 42name: test_sbb 43body: | 44 bb.0: 45 liveins: $rdi, $rsi 46 47 ; CHECK-LABEL: name: test_sbb 48 ; CHECK: liveins: $rdi, $rsi 49 ; CHECK-NEXT: {{ $}} 50 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 51 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 52 ; CHECK-NEXT: [[SUB64rr_ND:%[0-9]+]]:gr64 = SUB64rr_ND [[COPY]], [[COPY1]], implicit-def $eflags 53 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 54 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 55 ; CHECK-NEXT: dead [[ADD8ri_ND:%[0-9]+]]:gr8 = ADD8ri_ND [[SETCCr]], 255, implicit-def $eflags 56 ; CHECK-NEXT: [[SBB64ri32_ND:%[0-9]+]]:gr64 = SBB64ri32_ND [[SUB64rr_ND]], 42, implicit-def $eflags, implicit killed $eflags 57 ; CHECK-NEXT: [[SBB64ri32_ND1:%[0-9]+]]:gr64 = SBB64ri32_ND [[SBB64ri32_ND]], 42, implicit-def dead $eflags, implicit killed $eflags 58 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[SBB64ri32_ND1]] 59 ; CHECK-NEXT: RET 0 60 %0:gr64 = COPY $rdi 61 %1:gr64 = COPY $rsi 62 %2:gr64 = SUB64rr_ND %0, %1, implicit-def $eflags 63 %3:gr64 = COPY killed $eflags 64 65 INLINEASM &nop, 1, 12, implicit-def dead $eflags 66 67 $eflags = COPY %3 68 %4:gr64 = SBB64ri32_ND %2:gr64, 42, implicit-def $eflags, implicit killed $eflags 69 %5:gr64 = SBB64ri32_ND %4:gr64, 42, implicit-def dead $eflags, implicit killed $eflags 70 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 71 72 RET 0 73 74... 75--- 76name: test_rcl 77body: | 78 bb.0: 79 liveins: $rdi, $rsi 80 81 ; CHECK-LABEL: name: test_rcl 82 ; CHECK: liveins: $rdi, $rsi 83 ; CHECK-NEXT: {{ $}} 84 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 85 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 86 ; CHECK-NEXT: [[ADD64rr_ND:%[0-9]+]]:gr64 = ADD64rr_ND [[COPY]], [[COPY1]], implicit-def $eflags 87 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 88 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 89 ; CHECK-NEXT: dead [[ADD8ri_ND:%[0-9]+]]:gr8 = ADD8ri_ND [[SETCCr]], 255, implicit-def $eflags 90 ; CHECK-NEXT: [[RCL64r1_ND:%[0-9]+]]:gr64 = RCL64r1_ND [[ADD64rr_ND]], implicit-def $eflags, implicit killed $eflags 91 ; CHECK-NEXT: [[RCL64r1_ND1:%[0-9]+]]:gr64 = RCL64r1_ND [[RCL64r1_ND]], implicit-def $eflags, implicit $eflags 92 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCL64r1_ND1]] 93 ; CHECK-NEXT: RET 0 94 %0:gr64 = COPY $rdi 95 %1:gr64 = COPY $rsi 96 %2:gr64 = ADD64rr_ND %0, %1, implicit-def $eflags 97 %3:gr64 = COPY $eflags 98 99 INLINEASM &nop, 1, 12, implicit-def dead $eflags 100 101 $eflags = COPY %3 102 %4:gr64 = RCL64r1_ND %2:gr64, implicit-def $eflags, implicit $eflags 103 %5:gr64 = RCL64r1_ND %4:gr64, implicit-def $eflags, implicit $eflags 104 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 105 106 RET 0 107 108... 109--- 110name: test_rcr 111body: | 112 bb.0: 113 liveins: $rdi, $rsi 114 115 ; CHECK-LABEL: name: test_rcr 116 ; CHECK: liveins: $rdi, $rsi 117 ; CHECK-NEXT: {{ $}} 118 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 119 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 120 ; CHECK-NEXT: [[ADD64rr_ND:%[0-9]+]]:gr64 = ADD64rr_ND [[COPY]], [[COPY1]], implicit-def $eflags 121 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 122 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 123 ; CHECK-NEXT: dead [[ADD8ri_ND:%[0-9]+]]:gr8 = ADD8ri_ND [[SETCCr]], 255, implicit-def $eflags 124 ; CHECK-NEXT: [[RCR64r1_ND:%[0-9]+]]:gr64 = RCR64r1_ND [[ADD64rr_ND]], implicit-def $eflags, implicit killed $eflags 125 ; CHECK-NEXT: [[RCR64r1_ND1:%[0-9]+]]:gr64 = RCR64r1_ND [[RCR64r1_ND]], implicit-def $eflags, implicit $eflags 126 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCR64r1_ND1]] 127 ; CHECK-NEXT: RET 0 128 %0:gr64 = COPY $rdi 129 %1:gr64 = COPY $rsi 130 %2:gr64 = ADD64rr_ND %0, %1, implicit-def $eflags 131 %3:gr64 = COPY $eflags 132 133 INLINEASM &nop, 1, 12, implicit-def dead $eflags 134 135 $eflags = COPY %3 136 %4:gr64 = RCR64r1_ND %2:gr64, implicit-def $eflags, implicit $eflags 137 %5:gr64 = RCR64r1_ND %4:gr64, implicit-def $eflags, implicit $eflags 138 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 139 140 RET 0 141 142... 143--- 144name: test_cmov 145body: | 146 bb.0: 147 liveins: $rdi, $rsi 148 149 ; CHECK-LABEL: name: test_cmov 150 ; CHECK: liveins: $rdi, $rsi 151 ; CHECK-NEXT: {{ $}} 152 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 153 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 154 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags 155 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 156 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 157 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags 158 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 159 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 160 ; CHECK-NEXT: [[CMOV64rr_ND:%[0-9]+]]:gr64 = CMOV64rr_ND [[COPY]], [[COPY1]], 5, implicit killed $eflags 161 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags 162 ; CHECK-NEXT: [[CMOV64rr_ND1:%[0-9]+]]:gr64 = CMOV64rr_ND [[COPY]], [[COPY1]], 5, implicit killed $eflags 163 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags 164 ; CHECK-NEXT: [[CMOV64rr_ND2:%[0-9]+]]:gr64 = CMOV64rr_ND [[COPY]], [[COPY1]], 5, implicit killed $eflags 165 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags 166 ; CHECK-NEXT: [[CMOV64rr_ND3:%[0-9]+]]:gr64 = CMOV64rr_ND [[COPY]], [[COPY1]], 4, implicit killed $eflags 167 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr_ND]] 168 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr_ND1]] 169 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr_ND2]] 170 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr_ND3]] 171 ; CHECK-NEXT: RET 0 172 %0:gr64 = COPY $rdi 173 %1:gr64 = COPY $rsi 174 CMP64rr %0, %1, implicit-def $eflags 175 %2:gr64 = COPY $eflags 176 177 INLINEASM &nop, 1, 12, implicit-def dead $eflags 178 179 $eflags = COPY %2 180 %3:gr64 = CMOV64rr_ND %0, %1, 7, implicit $eflags 181 %4:gr64 = CMOV64rr_ND %0, %1, 2, implicit $eflags 182 %5:gr64 = CMOV64rr_ND %0, %1, 4, implicit $eflags 183 %6:gr64 = CMOV64rr_ND %0, %1, 5, implicit killed $eflags 184 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3 185 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4 186 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 187 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6 188 189 RET 0 190... 191--- 192name: test_cfcmov 193body: | 194 bb.0: 195 liveins: $rdi, $rsi 196 197 ; CHECK-LABEL: name: test_cfcmov 198 ; CHECK: liveins: $rdi, $rsi 199 ; CHECK-NEXT: {{ $}} 200 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi 201 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi 202 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags 203 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 204 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 205 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags 206 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags 207 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 208 ; CHECK-NEXT: [[CFCMOV64rr:%[0-9]+]]:gr64 = CFCMOV64rr [[COPY1]], 5, implicit killed $eflags 209 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags 210 ; CHECK-NEXT: [[CFCMOV64rr1:%[0-9]+]]:gr64 = CFCMOV64rr [[COPY1]], 5, implicit killed $eflags 211 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags 212 ; CHECK-NEXT: [[CFCMOV64rr_ND:%[0-9]+]]:gr64 = CFCMOV64rr_ND [[COPY]], [[COPY1]], 5, implicit killed $eflags 213 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags 214 ; CHECK-NEXT: [[CFCMOV64rr_ND1:%[0-9]+]]:gr64 = CFCMOV64rr_ND [[COPY]], [[COPY1]], 4, implicit killed $eflags 215 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CFCMOV64rr]] 216 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CFCMOV64rr1]] 217 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CFCMOV64rr_ND]] 218 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CFCMOV64rr_ND1]] 219 ; CHECK-NEXT: RET 0 220 %0:gr64 = COPY $rdi 221 %1:gr64 = COPY $rsi 222 CMP64rr %0, %1, implicit-def $eflags 223 %2:gr64 = COPY $eflags 224 225 INLINEASM &nop, 1, 12, implicit-def dead $eflags 226 227 $eflags = COPY %2 228 %3:gr64 = CFCMOV64rr %1, 7, implicit $eflags 229 %4:gr64 = CFCMOV64rr %1, 2, implicit $eflags 230 %5:gr64 = CFCMOV64rr_ND %0, %1, 4, implicit $eflags 231 %6:gr64 = CFCMOV64rr_ND %0, %1, 5, implicit killed $eflags 232 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3 233 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4 234 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 235 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6 236 237 RET 0 238... 239--- 240name: test_ccmp 241body: | 242 bb.0: 243 liveins: $edi 244 245 ; NDD-LABEL: name: test_ccmp 246 ; NDD: liveins: $edi 247 ; NDD-NEXT: {{ $}} 248 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 249 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 1, implicit $eflags 250 ; NDD-NEXT: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr $edi, $edi, implicit-def dead $eflags 251 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 252 ; NDD-NEXT: CCMP32rr [[ADD32rr]], [[ADD32rr]], 0, 5, implicit-def $eflags, implicit killed $eflags 253 ; NDD-NEXT: RET 0, $al 254 ; 255 ; NDD-NF-LABEL: name: test_ccmp 256 ; NDD-NF: liveins: $edi 257 ; NDD-NF-NEXT: {{ $}} 258 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 259 ; NDD-NF-NEXT: [[ADD32rr_NF:%[0-9]+]]:gr32 = ADD32rr_NF $edi, $edi 260 ; NDD-NF-NEXT: CCMP32rr [[ADD32rr_NF]], [[ADD32rr_NF]], 0, 1, implicit-def $eflags, implicit $eflags 261 ; NDD-NF-NEXT: RET 0, $al 262 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 263 %1:gr64 = COPY $eflags 264 %2:gr32 = ADD32rr $edi, $edi, implicit-def dead $eflags 265 $eflags = COPY %1 266 CCMP32rr %2, %2, 0, 1, implicit-def $eflags, implicit $eflags 267 RET 0, $al 268 269... 270--- 271name: test_ctest 272body: | 273 bb.0: 274 liveins: $edi 275 276 ; NDD-LABEL: name: test_ctest 277 ; NDD: liveins: $edi 278 ; NDD-NEXT: {{ $}} 279 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 280 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 1, implicit $eflags 281 ; NDD-NEXT: [[ADD32rr:%[0-9]+]]:gr32 = ADD32rr $edi, $edi, implicit-def dead $eflags 282 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 283 ; NDD-NEXT: CTEST32rr [[ADD32rr]], [[ADD32rr]], 0, 5, implicit-def $eflags, implicit killed $eflags 284 ; NDD-NEXT: RET 0, $al 285 ; 286 ; NDD-NF-LABEL: name: test_ctest 287 ; NDD-NF: liveins: $edi 288 ; NDD-NF-NEXT: {{ $}} 289 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 290 ; NDD-NF-NEXT: [[ADD32rr_NF:%[0-9]+]]:gr32 = ADD32rr_NF $edi, $edi 291 ; NDD-NF-NEXT: CTEST32rr [[ADD32rr_NF]], [[ADD32rr_NF]], 0, 1, implicit-def $eflags, implicit $eflags 292 ; NDD-NF-NEXT: RET 0, $al 293 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 294 %1:gr64 = COPY $eflags 295 %2:gr32 = ADD32rr $edi, $edi, implicit-def dead $eflags 296 $eflags = COPY %1 297 CTEST32rr %2, %2, 0, 1, implicit-def $eflags, implicit $eflags 298 RET 0, $al 299 300... 301--- 302name: test_evitable_clobber 303body: | 304 bb.0: 305 liveins: $edi 306 307 ; NDD-LABEL: name: test_evitable_clobber 308 ; NDD: liveins: $edi 309 ; NDD-NEXT: {{ $}} 310 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 311 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 312 ; NDD-NEXT: [[ADD32rr_ND:%[0-9]+]]:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 313 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 314 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_ND]], 5, implicit killed $eflags 315 ; NDD-NEXT: RET 0, $al 316 ; 317 ; NDD-NF-LABEL: name: test_evitable_clobber 318 ; NDD-NF: liveins: $edi 319 ; NDD-NF-NEXT: {{ $}} 320 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 321 ; NDD-NF-NEXT: [[ADD32rr_NF_ND:%[0-9]+]]:gr32 = ADD32rr_NF_ND $edi, $edi 322 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_NF_ND]], 7, implicit $eflags 323 ; NDD-NF-NEXT: RET 0, $al 324 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 325 %1:gr64 = COPY $eflags 326 %2:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 327 $eflags = COPY %1 328 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 329 RET 0, $al 330 331... 332--- 333name: test_inevitable_clobber 334body: | 335 bb.0: 336 liveins: $edi 337 338 ; CHECK-LABEL: name: test_inevitable_clobber 339 ; CHECK: liveins: $edi 340 ; CHECK-NEXT: {{ $}} 341 ; CHECK-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 342 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 343 ; CHECK-NEXT: [[ADC32rr_ND:%[0-9]+]]:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 344 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 345 ; CHECK-NEXT: $eax = CMOV32rr_ND $edi, [[ADC32rr_ND]], 5, implicit killed $eflags 346 ; CHECK-NEXT: RET 0, $al 347 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 348 %1:gr64 = COPY $eflags 349 %2:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 350 $eflags = COPY %1 351 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 352 RET 0, $al 353... 354--- 355name: test_evitable_clobber_multiple_uses 356body: | 357 bb.0: 358 liveins: $edi 359 360 ; NDD-LABEL: name: test_evitable_clobber_multiple_uses 361 ; NDD: liveins: $edi 362 ; NDD-NEXT: {{ $}} 363 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 364 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 365 ; NDD-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 9, implicit $eflags 366 ; NDD-NEXT: [[ADD32rr_ND:%[0-9]+]]:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 367 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 368 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_ND]], 5, implicit killed $eflags 369 ; NDD-NEXT: [[ADD32rr_ND1:%[0-9]+]]:gr32 = ADD32rr_ND $edi, $eax, implicit-def dead $eflags 370 ; NDD-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags 371 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_ND1]], 5, implicit killed $eflags 372 ; NDD-NEXT: RET 0, $al 373 ; 374 ; NDD-NF-LABEL: name: test_evitable_clobber_multiple_uses 375 ; NDD-NF: liveins: $edi 376 ; NDD-NF-NEXT: {{ $}} 377 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 378 ; NDD-NF-NEXT: [[ADD32rr_NF_ND:%[0-9]+]]:gr32 = ADD32rr_NF_ND $edi, $edi 379 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_NF_ND]], 7, implicit $eflags 380 ; NDD-NF-NEXT: [[ADD32rr_NF_ND1:%[0-9]+]]:gr32 = ADD32rr_NF_ND $edi, $eax 381 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_NF_ND1]], 9, implicit $eflags 382 ; NDD-NF-NEXT: RET 0, $al 383 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 384 %1:gr64 = COPY $eflags 385 %2:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 386 $eflags = COPY %1 387 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 388 %3:gr32 = ADD32rr_ND $edi, $eax, implicit-def dead $eflags 389 $eflags = COPY %1 390 $eax = CMOV32rr_ND $edi, %3, 9, implicit $eflags 391 RET 0, $al 392 393... 394--- 395name: test_mixed_clobber 396body: | 397 bb.0: 398 liveins: $edi 399 400 ; NDD-LABEL: name: test_mixed_clobber 401 ; NDD: liveins: $edi 402 ; NDD-NEXT: {{ $}} 403 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 404 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 405 ; NDD-NEXT: [[ADC32rr_ND:%[0-9]+]]:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 406 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 407 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADC32rr_ND]], 5, implicit killed $eflags 408 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 409 ; NDD-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 1, implicit $eflags 410 ; NDD-NEXT: [[ADD32rr_ND:%[0-9]+]]:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 411 ; NDD-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags 412 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_ND]], 5, implicit killed $eflags 413 ; NDD-NEXT: RET 0, $al 414 ; 415 ; NDD-NF-LABEL: name: test_mixed_clobber 416 ; NDD-NF: liveins: $edi 417 ; NDD-NF-NEXT: {{ $}} 418 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 419 ; NDD-NF-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 420 ; NDD-NF-NEXT: [[ADC32rr_ND:%[0-9]+]]:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 421 ; NDD-NF-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 422 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADC32rr_ND]], 5, implicit killed $eflags 423 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 424 ; NDD-NF-NEXT: [[ADD32rr_NF_ND:%[0-9]+]]:gr32 = ADD32rr_NF_ND $edi, $edi 425 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_NF_ND]], 1, implicit $eflags 426 ; NDD-NF-NEXT: RET 0, $al 427 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 428 %1:gr64 = COPY $eflags 429 %2:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 430 $eflags = COPY %1 431 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 432 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 433 %3:gr64 = COPY $eflags 434 %4:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 435 $eflags = COPY %3 436 $eax = CMOV32rr_ND $edi, %4, 1, implicit $eflags 437 RET 0, $al 438... 439--- 440name: test_evitable_clobber_crossbb 441body: | 442 ; NDD-LABEL: name: test_evitable_clobber_crossbb 443 ; NDD: bb.0: 444 ; NDD-NEXT: successors: %bb.1(0x80000000) 445 ; NDD-NEXT: liveins: $edi 446 ; NDD-NEXT: {{ $}} 447 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 448 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 449 ; NDD-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags 450 ; NDD-NEXT: [[ADD32rr_ND:%[0-9]+]]:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 451 ; NDD-NEXT: JCC_1 %bb.1, 4, implicit $eflags 452 ; NDD-NEXT: RET 0, $al 453 ; NDD-NEXT: {{ $}} 454 ; NDD-NEXT: bb.1: 455 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 456 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_ND]], 5, implicit killed $eflags 457 ; NDD-NEXT: dead [[ADD8ri_ND:%[0-9]+]]:gr8 = ADD8ri_ND [[SETCCr1]], 255, implicit-def $eflags 458 ; NDD-NEXT: $eax = ADC32rr_ND $eax, $edi, implicit-def dead $eflags, implicit killed $eflags 459 ; NDD-NEXT: RET 0, $al 460 ; 461 ; NDD-NF-LABEL: name: test_evitable_clobber_crossbb 462 ; NDD-NF: bb.0: 463 ; NDD-NF-NEXT: successors: %bb.1(0x80000000) 464 ; NDD-NF-NEXT: liveins: $edi 465 ; NDD-NF-NEXT: {{ $}} 466 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 467 ; NDD-NF-NEXT: [[ADD32rr_NF_ND:%[0-9]+]]:gr32 = ADD32rr_NF_ND $edi, $edi 468 ; NDD-NF-NEXT: JCC_1 %bb.1, 4, implicit $eflags 469 ; NDD-NF-NEXT: RET 0, $al 470 ; NDD-NF-NEXT: {{ $}} 471 ; NDD-NF-NEXT: bb.1: 472 ; NDD-NF-NEXT: liveins: $eflags 473 ; NDD-NF-NEXT: {{ $}} 474 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[ADD32rr_NF_ND]], 7, implicit $eflags 475 ; NDD-NF-NEXT: $eax = ADC32rr_ND $eax, $edi, implicit-def dead $eflags, implicit $eflags 476 ; NDD-NF-NEXT: RET 0, $al 477 bb.0: 478 liveins: $edi 479 480 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 481 %1:gr64 = COPY $eflags 482 %2:gr32 = ADD32rr_ND $edi, $edi, implicit-def dead $eflags 483 JCC_1 %bb.1, 4, implicit $eflags 484 RET 0, $al 485 486 bb.1: 487 $eflags = COPY %1 488 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 489 $eax = ADC32rr_ND $eax, $edi, implicit-def dead $eflags, implicit $eflags 490 RET 0, $al 491... 492--- 493name: test_inevitable_clobber_crossbb 494body: | 495 ; CHECK-LABEL: name: test_inevitable_clobber_crossbb 496 ; CHECK: bb.0: 497 ; CHECK-NEXT: successors: %bb.1(0x80000000) 498 ; CHECK-NEXT: liveins: $edi 499 ; CHECK-NEXT: {{ $}} 500 ; CHECK-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 501 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 502 ; CHECK-NEXT: [[ADC32rr_ND:%[0-9]+]]:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 503 ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags 504 ; CHECK-NEXT: RET 0, $al 505 ; CHECK-NEXT: {{ $}} 506 ; CHECK-NEXT: bb.1: 507 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 508 ; CHECK-NEXT: $eax = CMOV32rr_ND $edi, [[ADC32rr_ND]], 5, implicit killed $eflags 509 ; CHECK-NEXT: RET 0, $al 510 bb.0: 511 liveins: $edi 512 513 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 514 %1:gr64 = COPY $eflags 515 %2:gr32 = ADC32rr_ND $edi, $edi, implicit-def dead $eflags, implicit $eflags 516 JCC_1 %bb.1, 4, implicit $eflags 517 RET 0, $al 518 519 bb.1: 520 $eflags = COPY %1 521 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 522 RET 0, $al 523... 524--- 525name: test_evitable_clobber_crossbb_complex 526body: | 527 ; NDD-LABEL: name: test_evitable_clobber_crossbb_complex 528 ; NDD: bb.0: 529 ; NDD-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) 530 ; NDD-NEXT: liveins: $edi 531 ; NDD-NEXT: {{ $}} 532 ; NDD-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 533 ; NDD-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 534 ; NDD-NEXT: [[SUB32rr_ND:%[0-9]+]]:gr32 = SUB32rr_ND $edi, $edi, implicit-def dead $eflags 535 ; NDD-NEXT: JCC_1 %bb.2, 4, implicit $eflags 536 ; NDD-NEXT: {{ $}} 537 ; NDD-NEXT: bb.1: 538 ; NDD-NEXT: successors: %bb.3(0x80000000) 539 ; NDD-NEXT: {{ $}} 540 ; NDD-NEXT: $eax = IMUL32rr_ND $eax, $edi, implicit-def dead $eflags 541 ; NDD-NEXT: JMP_1 %bb.3 542 ; NDD-NEXT: {{ $}} 543 ; NDD-NEXT: bb.2: 544 ; NDD-NEXT: successors: %bb.3(0x80000000) 545 ; NDD-NEXT: {{ $}} 546 ; NDD-NEXT: $eax = IMUL32rr $eax, $esi, implicit-def dead $eflags 547 ; NDD-NEXT: JMP_1 %bb.3 548 ; NDD-NEXT: {{ $}} 549 ; NDD-NEXT: bb.3: 550 ; NDD-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 551 ; NDD-NEXT: $eax = CMOV32rr_ND $edi, [[SUB32rr_ND]], 5, implicit killed $eflags 552 ; NDD-NEXT: RET 0, $al 553 ; 554 ; NDD-NF-LABEL: name: test_evitable_clobber_crossbb_complex 555 ; NDD-NF: bb.0: 556 ; NDD-NF-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) 557 ; NDD-NF-NEXT: liveins: $edi 558 ; NDD-NF-NEXT: {{ $}} 559 ; NDD-NF-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 560 ; NDD-NF-NEXT: [[SUB32rr_NF_ND:%[0-9]+]]:gr32 = SUB32rr_NF_ND $edi, $edi 561 ; NDD-NF-NEXT: JCC_1 %bb.2, 4, implicit $eflags 562 ; NDD-NF-NEXT: {{ $}} 563 ; NDD-NF-NEXT: bb.1: 564 ; NDD-NF-NEXT: successors: %bb.3(0x80000000) 565 ; NDD-NF-NEXT: liveins: $eflags 566 ; NDD-NF-NEXT: {{ $}} 567 ; NDD-NF-NEXT: $eax = IMUL32rr_NF_ND $eax, $edi 568 ; NDD-NF-NEXT: JMP_1 %bb.3 569 ; NDD-NF-NEXT: {{ $}} 570 ; NDD-NF-NEXT: bb.2: 571 ; NDD-NF-NEXT: successors: %bb.3(0x80000000) 572 ; NDD-NF-NEXT: liveins: $eflags 573 ; NDD-NF-NEXT: {{ $}} 574 ; NDD-NF-NEXT: $eax = IMUL32rr_NF $eax, $esi 575 ; NDD-NF-NEXT: JMP_1 %bb.3 576 ; NDD-NF-NEXT: {{ $}} 577 ; NDD-NF-NEXT: bb.3: 578 ; NDD-NF-NEXT: liveins: $eflags 579 ; NDD-NF-NEXT: {{ $}} 580 ; NDD-NF-NEXT: $eax = CMOV32rr_ND $edi, [[SUB32rr_NF_ND]], 7, implicit $eflags 581 ; NDD-NF-NEXT: RET 0, $al 582 bb.0: 583 liveins: $edi 584 585 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 586 %1:gr64 = COPY $eflags 587 %2:gr32 = SUB32rr_ND $edi, $edi, implicit-def dead $eflags 588 JCC_1 %bb.2, 4, implicit $eflags 589 590 bb.1: 591 $eax = IMUL32rr_ND $eax, $edi, implicit-def dead $eflags 592 JMP_1 %bb.3 593 594 bb.2: 595 $eax = IMUL32rr $eax, $esi, implicit-def dead $eflags 596 JMP_1 %bb.3 597 598 bb.3: 599 $eflags = COPY %1 600 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 601 RET 0, $al 602... 603--- 604name: test_inevitable_clobber_crossbb_complex 605body: | 606 ; CHECK-LABEL: name: test_inevitable_clobber_crossbb_complex 607 ; CHECK: bb.0: 608 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.1(0x40000000) 609 ; CHECK-NEXT: liveins: $edi 610 ; CHECK-NEXT: {{ $}} 611 ; CHECK-NEXT: MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 612 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags 613 ; CHECK-NEXT: [[SUB32rr_ND:%[0-9]+]]:gr32 = SUB32rr_ND $edi, $edi, implicit-def dead $eflags 614 ; CHECK-NEXT: JCC_1 %bb.2, 4, implicit $eflags 615 ; CHECK-NEXT: {{ $}} 616 ; CHECK-NEXT: bb.1: 617 ; CHECK-NEXT: successors: %bb.3(0x80000000) 618 ; CHECK-NEXT: {{ $}} 619 ; CHECK-NEXT: $eax = IMUL32rr_ND $eax, $edi, implicit-def dead $eflags 620 ; CHECK-NEXT: JMP_1 %bb.3 621 ; CHECK-NEXT: {{ $}} 622 ; CHECK-NEXT: bb.2: 623 ; CHECK-NEXT: successors: %bb.3(0x80000000) 624 ; CHECK-NEXT: {{ $}} 625 ; CHECK-NEXT: $eax = SBB32rr $eax, $esi, implicit-def dead $eflags, implicit $eflags 626 ; CHECK-NEXT: JMP_1 %bb.3 627 ; CHECK-NEXT: {{ $}} 628 ; CHECK-NEXT: bb.3: 629 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags 630 ; CHECK-NEXT: $eax = CMOV32rr_ND $edi, [[SUB32rr_ND]], 5, implicit killed $eflags 631 ; CHECK-NEXT: RET 0, $al 632 bb.0: 633 liveins: $edi 634 635 MUL32r $edi, implicit-def $eax, implicit-def dead $edx, implicit-def $eflags, implicit $eax 636 %1:gr64 = COPY $eflags 637 %2:gr32 = SUB32rr_ND $edi, $edi, implicit-def dead $eflags 638 JCC_1 %bb.2, 4, implicit $eflags 639 640 bb.1: 641 $eax = IMUL32rr_ND $eax, $edi, implicit-def dead $eflags 642 JMP_1 %bb.3 643 644 bb.2: 645 $eax = SBB32rr $eax, $esi, implicit-def dead $eflags, implicit $eflags 646 JMP_1 %bb.3 647 648 bb.3: 649 $eflags = COPY %1 650 $eax = CMOV32rr_ND $edi, %2, 7, implicit $eflags 651 RET 0, $al 652... 653