938 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 52# RUN: llc -mtriple=x86_64 -run-pass x86-flags-copy-lowering -verify-machineinstrs -o - %s | FileCheck %s3# Lower various interesting copy patterns of EFLAGS without using LAHF/SAHF.4 5...6---7name: test_branch8body: |9 ; CHECK-LABEL: name: test_branch10 ; CHECK: bb.0:11 ; CHECK-NEXT: successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)12 ; CHECK-NEXT: liveins: $rdi, $rsi13 ; CHECK-NEXT: {{ $}}14 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi15 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi16 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags17 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags18 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags19 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags20 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags21 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit killed $eflags22 ; CHECK-NEXT: {{ $}}23 ; CHECK-NEXT: bb.4:24 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)25 ; CHECK-NEXT: {{ $}}26 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags27 ; CHECK-NEXT: JCC_1 %bb.2, 5, implicit killed $eflags28 ; CHECK-NEXT: JMP_1 %bb.329 ; CHECK-NEXT: {{ $}}30 ; CHECK-NEXT: bb.1:31 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 4232 ; CHECK-NEXT: $eax = COPY [[MOV32ri]]33 ; CHECK-NEXT: RET 0, $eax34 ; CHECK-NEXT: {{ $}}35 ; CHECK-NEXT: bb.2:36 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 4337 ; CHECK-NEXT: $eax = COPY [[MOV32ri1]]38 ; CHECK-NEXT: RET 0, $eax39 ; CHECK-NEXT: {{ $}}40 ; CHECK-NEXT: bb.3:41 ; CHECK-NEXT: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags42 ; CHECK-NEXT: $eax = COPY [[MOV32r0_]]43 ; CHECK-NEXT: RET 0, $eax44 bb.0:45 successors: %bb.1, %bb.2, %bb.346 liveins: $rdi, $rsi47 48 %0:gr64 = COPY $rdi49 %1:gr64 = COPY $rsi50 CMP64rr %0, %1, implicit-def $eflags51 %2:gr64 = COPY $eflags52 53 INLINEASM &nop, 1, 12, implicit-def dead $eflags54 55 $eflags = COPY %256 JCC_1 %bb.1, 7, implicit $eflags57 JCC_1 %bb.2, 2, implicit $eflags58 JMP_1 %bb.359 60 bb.1:61 %3:gr32 = MOV32ri 4262 $eax = COPY %363 RET 0, $eax64 65 bb.2:66 %4:gr32 = MOV32ri 4367 $eax = COPY %468 RET 0, $eax69 70 bb.3:71 %5:gr32 = MOV32r0 implicit-def dead $eflags72 $eax = COPY %573 RET 0, $eax74 75...76---77name: test_branch_fallthrough78body: |79 ; CHECK-LABEL: name: test_branch_fallthrough80 ; CHECK: bb.0:81 ; CHECK-NEXT: successors: %bb.4(0x55555556), %bb.2(0x2aaaaaab)82 ; CHECK-NEXT: liveins: $rdi, $rsi83 ; CHECK-NEXT: {{ $}}84 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi85 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi86 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags87 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags88 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags89 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags90 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags91 ; CHECK-NEXT: JCC_1 %bb.2, 5, implicit killed $eflags92 ; CHECK-NEXT: {{ $}}93 ; CHECK-NEXT: bb.4:94 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)95 ; CHECK-NEXT: {{ $}}96 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags97 ; CHECK-NEXT: JCC_1 %bb.3, 5, implicit killed $eflags98 ; CHECK-NEXT: {{ $}}99 ; CHECK-NEXT: bb.1:100 ; CHECK-NEXT: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags101 ; CHECK-NEXT: $eax = COPY [[MOV32r0_]]102 ; CHECK-NEXT: RET 0, $eax103 ; CHECK-NEXT: {{ $}}104 ; CHECK-NEXT: bb.2:105 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42106 ; CHECK-NEXT: $eax = COPY [[MOV32ri]]107 ; CHECK-NEXT: RET 0, $eax108 ; CHECK-NEXT: {{ $}}109 ; CHECK-NEXT: bb.3:110 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43111 ; CHECK-NEXT: $eax = COPY [[MOV32ri1]]112 ; CHECK-NEXT: RET 0, $eax113 bb.0:114 successors: %bb.1, %bb.2, %bb.3115 liveins: $rdi, $rsi116 117 %0:gr64 = COPY $rdi118 %1:gr64 = COPY $rsi119 CMP64rr %0, %1, implicit-def $eflags120 %2:gr64 = COPY $eflags121 122 INLINEASM &nop, 1, 12, implicit-def dead $eflags123 124 $eflags = COPY %2125 JCC_1 %bb.2, 7, implicit $eflags126 JCC_1 %bb.3, 2, implicit $eflags127 128 bb.1:129 %5:gr32 = MOV32r0 implicit-def dead $eflags130 $eax = COPY %5131 RET 0, $eax132 133 bb.2:134 %3:gr32 = MOV32ri 42135 $eax = COPY %3136 RET 0, $eax137 138 bb.3:139 %4:gr32 = MOV32ri 43140 $eax = COPY %4141 RET 0, $eax142 143...144---145name: test_setcc146body: |147 bb.0:148 liveins: $rdi, $rsi149 150 ; CHECK-LABEL: name: test_setcc151 ; CHECK: liveins: $rdi, $rsi152 ; CHECK-NEXT: {{ $}}153 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi154 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi155 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags156 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags157 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags158 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags159 ; CHECK-NEXT: [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags160 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags161 ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr3]]162 ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr]]163 ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr1]]164 ; CHECK-NEXT: MOV8mr $rsp, 1, $noreg, -16, $noreg, [[SETCCr2]]165 ; CHECK-NEXT: RET 0166 %0:gr64 = COPY $rdi167 %1:gr64 = COPY $rsi168 CMP64rr %0, %1, implicit-def $eflags169 %2:gr64 = COPY $eflags170 171 INLINEASM &nop, 1, 12, implicit-def dead $eflags172 173 $eflags = COPY %2174 %3:gr8 = SETCCr 7, implicit $eflags175 %4:gr8 = SETCCr 2, implicit $eflags176 %5:gr8 = SETCCr 4, implicit $eflags177 SETCCm $rsp, 1, $noreg, -16, $noreg, 5, implicit killed $eflags178 MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %3179 MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %4180 MOV8mr $rsp, 1, $noreg, -16, $noreg, killed %5181 182 RET 0183 184...185---186name: test_cmov187body: |188 bb.0:189 liveins: $rdi, $rsi190 191 ; CHECK-LABEL: name: test_cmov192 ; CHECK: liveins: $rdi, $rsi193 ; CHECK-NEXT: {{ $}}194 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi195 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi196 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags197 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags198 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags199 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags200 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags201 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags202 ; CHECK-NEXT: [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags203 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags204 ; CHECK-NEXT: [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags205 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags206 ; CHECK-NEXT: [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags207 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags208 ; CHECK-NEXT: [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags209 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr]]210 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr1]]211 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr2]]212 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr3]]213 ; CHECK-NEXT: RET 0214 %0:gr64 = COPY $rdi215 %1:gr64 = COPY $rsi216 CMP64rr %0, %1, implicit-def $eflags217 %2:gr64 = COPY $eflags218 219 INLINEASM &nop, 1, 12, implicit-def dead $eflags220 221 $eflags = COPY %2222 %3:gr64 = CMOV64rr %0, %1, 7, implicit $eflags223 %4:gr64 = CMOV64rr %0, %1, 2, implicit $eflags224 %5:gr64 = CMOV64rr %0, %1, 4, implicit $eflags225 %6:gr64 = CMOV64rr %0, %1, 5, implicit killed $eflags226 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3227 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4228 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5229 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6230 231 RET 0232 233...234---235name: test_adc236body: |237 bb.0:238 liveins: $rdi, $rsi239 240 ; CHECK-LABEL: name: test_adc241 ; CHECK: liveins: $rdi, $rsi242 ; CHECK-NEXT: {{ $}}243 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi244 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi245 ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags246 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags247 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags248 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags249 ; CHECK-NEXT: [[ADC64ri32_:%[0-9]+]]:gr64 = ADC64ri32 [[ADD64rr]], 42, implicit-def $eflags, implicit killed $eflags250 ; CHECK-NEXT: [[ADC64ri32_1:%[0-9]+]]:gr64 = ADC64ri32 [[ADC64ri32_]], 42, implicit-def $eflags, implicit $eflags251 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[ADC64ri32_1]]252 ; CHECK-NEXT: RET 0253 %0:gr64 = COPY $rdi254 %1:gr64 = COPY $rsi255 %2:gr64 = ADD64rr %0, %1, implicit-def $eflags256 %3:gr64 = COPY $eflags257 258 INLINEASM &nop, 1, 12, implicit-def dead $eflags259 260 $eflags = COPY %3261 %4:gr64 = ADC64ri32 %2:gr64, 42, implicit-def $eflags, implicit $eflags262 %5:gr64 = ADC64ri32 %4:gr64, 42, implicit-def $eflags, implicit $eflags263 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5264 265 RET 0266 267...268---269name: test_sbb270body: |271 bb.0:272 liveins: $rdi, $rsi273 274 ; CHECK-LABEL: name: test_sbb275 ; CHECK: liveins: $rdi, $rsi276 ; CHECK-NEXT: {{ $}}277 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi278 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi279 ; CHECK-NEXT: [[SUB64rr:%[0-9]+]]:gr64 = SUB64rr [[COPY]], [[COPY1]], implicit-def $eflags280 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags281 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags282 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags283 ; CHECK-NEXT: [[SBB64ri32_:%[0-9]+]]:gr64 = SBB64ri32 [[SUB64rr]], 42, implicit-def $eflags, implicit killed $eflags284 ; CHECK-NEXT: [[SBB64ri32_1:%[0-9]+]]:gr64 = SBB64ri32 [[SBB64ri32_]], 42, implicit-def dead $eflags, implicit killed $eflags285 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[SBB64ri32_1]]286 ; CHECK-NEXT: RET 0287 %0:gr64 = COPY $rdi288 %1:gr64 = COPY $rsi289 %2:gr64 = SUB64rr %0, %1, implicit-def $eflags290 %3:gr64 = COPY killed $eflags291 292 INLINEASM &nop, 1, 12, implicit-def dead $eflags293 294 $eflags = COPY %3295 %4:gr64 = SBB64ri32 %2:gr64, 42, implicit-def $eflags, implicit killed $eflags296 %5:gr64 = SBB64ri32 %4:gr64, 42, implicit-def dead $eflags, implicit killed $eflags297 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5298 299 RET 0300 301...302---303name: test_rcl304body: |305 bb.0:306 liveins: $rdi, $rsi307 308 ; CHECK-LABEL: name: test_rcl309 ; CHECK: liveins: $rdi, $rsi310 ; CHECK-NEXT: {{ $}}311 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi312 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi313 ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags314 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags315 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags316 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags317 ; CHECK-NEXT: [[RCL64r1_:%[0-9]+]]:gr64 = RCL64r1 [[ADD64rr]], implicit-def $eflags, implicit killed $eflags318 ; CHECK-NEXT: [[RCL64r1_1:%[0-9]+]]:gr64 = RCL64r1 [[RCL64r1_]], implicit-def $eflags, implicit $eflags319 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCL64r1_1]]320 ; CHECK-NEXT: RET 0321 %0:gr64 = COPY $rdi322 %1:gr64 = COPY $rsi323 %2:gr64 = ADD64rr %0, %1, implicit-def $eflags324 %3:gr64 = COPY $eflags325 326 INLINEASM &nop, 1, 12, implicit-def dead $eflags327 328 $eflags = COPY %3329 %4:gr64 = RCL64r1 %2:gr64, implicit-def $eflags, implicit $eflags330 %5:gr64 = RCL64r1 %4:gr64, implicit-def $eflags, implicit $eflags331 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5332 333 RET 0334 335...336---337name: test_rcr338body: |339 bb.0:340 liveins: $rdi, $rsi341 342 ; CHECK-LABEL: name: test_rcr343 ; CHECK: liveins: $rdi, $rsi344 ; CHECK-NEXT: {{ $}}345 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi346 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi347 ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags348 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags349 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags350 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags351 ; CHECK-NEXT: [[RCR64r1_:%[0-9]+]]:gr64 = RCR64r1 [[ADD64rr]], implicit-def $eflags, implicit killed $eflags352 ; CHECK-NEXT: [[RCR64r1_1:%[0-9]+]]:gr64 = RCR64r1 [[RCR64r1_]], implicit-def $eflags, implicit $eflags353 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[RCR64r1_1]]354 ; CHECK-NEXT: RET 0355 %0:gr64 = COPY $rdi356 %1:gr64 = COPY $rsi357 %2:gr64 = ADD64rr %0, %1, implicit-def $eflags358 %3:gr64 = COPY $eflags359 360 INLINEASM &nop, 1, 12, implicit-def dead $eflags361 362 $eflags = COPY %3363 %4:gr64 = RCR64r1 %2:gr64, implicit-def $eflags, implicit $eflags364 %5:gr64 = RCR64r1 %4:gr64, implicit-def $eflags, implicit $eflags365 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5366 367 RET 0368 369...370---371name: test_setb_c372body: |373 bb.0:374 liveins: $rdi, $rsi375 376 ; CHECK-LABEL: name: test_setb_c377 ; CHECK: liveins: $rdi, $rsi378 ; CHECK-NEXT: {{ $}}379 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi380 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi381 ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64 = ADD64rr [[COPY]], [[COPY1]], implicit-def $eflags382 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags383 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags384 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags385 ; CHECK-NEXT: [[SETB_C32r:%[0-9]+]]:gr32 = SETB_C32r implicit-def $eflags, implicit killed $eflags386 ; CHECK-NEXT: MOV32mr $rsp, 1, $noreg, -16, $noreg, killed [[SETB_C32r]]387 ; CHECK-NEXT: dead [[ADD8ri1:%[0-9]+]]:gr8 = ADD8ri [[SETCCr]], 255, implicit-def $eflags388 ; CHECK-NEXT: [[SETB_C64r:%[0-9]+]]:gr64 = SETB_C64r implicit-def $eflags, implicit killed $eflags389 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[SETB_C64r]]390 ; CHECK-NEXT: RET 0391 %0:gr64 = COPY $rdi392 %1:gr64 = COPY $rsi393 %2:gr64 = ADD64rr %0, %1, implicit-def $eflags394 %3:gr64 = COPY $eflags395 396 INLINEASM &nop, 1, 12, implicit-def dead $eflags397 398 $eflags = COPY %3399 %4:gr32 = SETB_C32r implicit-def $eflags, implicit $eflags400 MOV32mr $rsp, 1, $noreg, -16, $noreg, killed %4401 402 $eflags = COPY %3403 %5:gr64 = SETB_C64r implicit-def $eflags, implicit $eflags404 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5405 406 RET 0407 408...409---410name: test_branch_with_livein_and_kill411body: |412 ; CHECK-LABEL: name: test_branch_with_livein_and_kill413 ; CHECK: bb.0:414 ; CHECK-NEXT: successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)415 ; CHECK-NEXT: liveins: $rdi, $rsi416 ; CHECK-NEXT: {{ $}}417 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi418 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi419 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags420 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 8, implicit $eflags421 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags422 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags423 ; CHECK-NEXT: [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags424 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags425 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags426 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit killed $eflags427 ; CHECK-NEXT: {{ $}}428 ; CHECK-NEXT: bb.4:429 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)430 ; CHECK-NEXT: {{ $}}431 ; CHECK-NEXT: TEST8rr [[SETCCr3]], [[SETCCr3]], implicit-def $eflags432 ; CHECK-NEXT: JCC_1 %bb.2, 5, implicit killed $eflags433 ; CHECK-NEXT: JMP_1 %bb.3434 ; CHECK-NEXT: {{ $}}435 ; CHECK-NEXT: bb.1:436 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags437 ; CHECK-NEXT: [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags438 ; CHECK-NEXT: $rax = COPY [[CMOV64rr]]439 ; CHECK-NEXT: RET 0, $rax440 ; CHECK-NEXT: {{ $}}441 ; CHECK-NEXT: bb.2:442 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags443 ; CHECK-NEXT: [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags444 ; CHECK-NEXT: $rax = COPY [[CMOV64rr1]]445 ; CHECK-NEXT: RET 0, $rax446 ; CHECK-NEXT: {{ $}}447 ; CHECK-NEXT: bb.3:448 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags449 ; CHECK-NEXT: [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags450 ; CHECK-NEXT: $rax = COPY [[CMOV64rr2]]451 ; CHECK-NEXT: RET 0, $rax452 bb.0:453 successors: %bb.1, %bb.2, %bb.3454 liveins: $rdi, $rsi455 456 %0:gr64 = COPY $rdi457 %1:gr64 = COPY $rsi458 CMP64rr %0, %1, implicit-def $eflags459 %2:gr64 = COPY $eflags460 461 INLINEASM &nop, 1, 12, implicit-def dead $eflags462 463 $eflags = COPY %2464 JCC_1 %bb.1, 7, implicit $eflags465 JCC_1 %bb.2, 2, implicit $eflags466 JMP_1 %bb.3467 468 bb.1:469 liveins: $eflags470 471 %3:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags472 $rax = COPY %3473 RET 0, $rax474 475 bb.2:476 liveins: $eflags477 478 %4:gr64 = CMOV64rr %0, %1, 5, implicit killed $eflags479 $rax = COPY %4480 RET 0, $rax481 482 bb.3:483 liveins: $eflags484 485 %5:gr64 = CMOV64rr %0, %1, 8, implicit killed $eflags486 $rax = COPY %5487 RET 0, $rax488 489...490---491name: test_branch_with_interleaved_livein_and_kill492body: |493 ; CHECK-LABEL: name: test_branch_with_interleaved_livein_and_kill494 ; CHECK: bb.0:495 ; CHECK-NEXT: successors: %bb.1(0x2aaaaaab), %bb.6(0x55555556)496 ; CHECK-NEXT: liveins: $rdi, $rsi497 ; CHECK-NEXT: {{ $}}498 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi499 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi500 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags501 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 8, implicit $eflags502 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 10, implicit $eflags503 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 5, implicit $eflags504 ; CHECK-NEXT: [[SETCCr3:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags505 ; CHECK-NEXT: [[SETCCr4:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags506 ; CHECK-NEXT: [[SETCCr5:%[0-9]+]]:gr8 = SETCCr 0, implicit $eflags507 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags508 ; CHECK-NEXT: TEST8rr [[SETCCr3]], [[SETCCr3]], implicit-def $eflags509 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit killed $eflags510 ; CHECK-NEXT: {{ $}}511 ; CHECK-NEXT: bb.6:512 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.5(0x40000000)513 ; CHECK-NEXT: {{ $}}514 ; CHECK-NEXT: TEST8rr [[SETCCr4]], [[SETCCr4]], implicit-def $eflags515 ; CHECK-NEXT: JCC_1 %bb.2, 5, implicit killed $eflags516 ; CHECK-NEXT: JMP_1 %bb.5517 ; CHECK-NEXT: {{ $}}518 ; CHECK-NEXT: bb.1:519 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags520 ; CHECK-NEXT: [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags521 ; CHECK-NEXT: $rax = COPY [[CMOV64rr]]522 ; CHECK-NEXT: RET 0, $rax523 ; CHECK-NEXT: {{ $}}524 ; CHECK-NEXT: bb.2:525 ; CHECK-NEXT: successors: %bb.3(0x40000000), %bb.4(0x40000000)526 ; CHECK-NEXT: {{ $}}527 ; CHECK-NEXT: TEST8rr [[SETCCr5]], [[SETCCr5]], implicit-def $eflags528 ; CHECK-NEXT: JCC_1 %bb.3, 5, implicit killed $eflags529 ; CHECK-NEXT: JMP_1 %bb.4530 ; CHECK-NEXT: {{ $}}531 ; CHECK-NEXT: bb.3:532 ; CHECK-NEXT: TEST8rr [[SETCCr2]], [[SETCCr2]], implicit-def $eflags533 ; CHECK-NEXT: [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags534 ; CHECK-NEXT: $rax = COPY [[CMOV64rr1]]535 ; CHECK-NEXT: RET 0, $rax536 ; CHECK-NEXT: {{ $}}537 ; CHECK-NEXT: bb.4:538 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags539 ; CHECK-NEXT: [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags540 ; CHECK-NEXT: $rax = COPY [[CMOV64rr2]]541 ; CHECK-NEXT: RET 0, $rax542 ; CHECK-NEXT: {{ $}}543 ; CHECK-NEXT: bb.5:544 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags545 ; CHECK-NEXT: [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags546 ; CHECK-NEXT: $rax = COPY [[CMOV64rr3]]547 ; CHECK-NEXT: RET 0, $rax548 bb.0:549 successors: %bb.1, %bb.2, %bb.5550 liveins: $rdi, $rsi551 552 %0:gr64 = COPY $rdi553 %1:gr64 = COPY $rsi554 CMP64rr %0, %1, implicit-def $eflags555 %2:gr64 = COPY $eflags556 557 INLINEASM &nop, 1, 12, implicit-def dead $eflags558 559 $eflags = COPY %2560 JCC_1 %bb.1, 7, implicit $eflags561 JCC_1 %bb.2, 2, implicit $eflags562 JMP_1 %bb.5563 564 bb.1:565 liveins: $eflags566 567 %3:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags568 $rax = COPY %3569 RET 0, $rax570 571 bb.2:572 successors: %bb.3, %bb.4573 liveins: $eflags574 575 JCC_1 %bb.3, 0, implicit $eflags576 JMP_1 %bb.4577 578 bb.3:579 liveins: $eflags580 581 %4:gr64 = CMOV64rr %0, %1, 5, implicit $eflags582 $rax = COPY %4583 RET 0, $rax584 585 bb.4:586 liveins: $eflags587 588 %5:gr64 = CMOV64rr %0, %1, 10, implicit $eflags589 $rax = COPY %5590 RET 0, $rax591 592 bb.5:593 liveins: $eflags594 595 %6:gr64 = CMOV64rr %0, %1, 8, implicit killed $eflags596 $rax = COPY %6597 RET 0, $rax598 599...600---601# This test case is designed to exercise a particularly challenging situation:602# when the flags are copied and restored *inside* of a complex and cyclic CFG603# all of which have live-in flags. To correctly handle this case we have to walk604# up the dominator tree and locate a viable reaching definition location,605# checking for clobbers along any path. The CFG for this function looks like the606# following diagram, control flowing out the bottom of blocks and in the top:607#608# bb.0609# | __________________610# |/ \611# bb.1 |612# |\_________ |613# | __ \ ____ |614# |/ \ |/ \ |615# bb.2 | bb.4 | |616# |\__/ / \ | |617# | / \ | |618# bb.3 bb.5 bb.6 | |619# | \ / | |620# | \ / | |621# | bb.7 | |622# | ________/ \____/ |623# |/ |624# bb.8 |625# |\__________________/626# |627# bb.9628#629# We set EFLAGS in bb.0, clobber them in bb.3, and copy them in bb.2 and bb.6.630# Because of the cycles this requires hoisting the `SETcc` instructions to631# capture the flags for the bb.6 copy to bb.1 and using them for the copy in632# `bb.2` as well despite the clobber in `bb.3`. The clobber in `bb.3` also633# prevents hoisting the `SETcc`s up to `bb.0`.634#635# Throughout the test we use branch instructions that are totally bogus (as the636# flags are obviously not changing!) but this is just to allow us to send637# a small but complex CFG structure through the backend and force it to choose638# plausible lowering decisions based on the core CFG presented, regardless of639# the futility of the actual branches.640name: test_mid_cycle_copies641body: |642 ; CHECK-LABEL: name: test_mid_cycle_copies643 ; CHECK: bb.0:644 ; CHECK-NEXT: successors: %bb.1(0x80000000)645 ; CHECK-NEXT: liveins: $rdi, $rsi646 ; CHECK-NEXT: {{ $}}647 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi648 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi649 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags650 ; CHECK-NEXT: JMP_1 %bb.1651 ; CHECK-NEXT: {{ $}}652 ; CHECK-NEXT: bb.1:653 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.4(0x40000000)654 ; CHECK-NEXT: liveins: $eflags655 ; CHECK-NEXT: {{ $}}656 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags657 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags658 ; CHECK-NEXT: [[SETCCr2:%[0-9]+]]:gr8 = SETCCr 2, implicit $eflags659 ; CHECK-NEXT: JCC_1 %bb.2, 4, implicit $eflags660 ; CHECK-NEXT: JMP_1 %bb.4661 ; CHECK-NEXT: {{ $}}662 ; CHECK-NEXT: bb.2:663 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)664 ; CHECK-NEXT: {{ $}}665 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags666 ; CHECK-NEXT: JCC_1 %bb.2, 5, implicit killed $eflags667 ; CHECK-NEXT: JMP_1 %bb.3668 ; CHECK-NEXT: {{ $}}669 ; CHECK-NEXT: bb.3:670 ; CHECK-NEXT: successors: %bb.8(0x80000000)671 ; CHECK-NEXT: {{ $}}672 ; CHECK-NEXT: dead [[ADD8ri:%[0-9]+]]:gr8 = ADD8ri [[SETCCr2]], 255, implicit-def $eflags673 ; CHECK-NEXT: [[ADC64ri32_:%[0-9]+]]:gr64 = ADC64ri32 [[COPY]], 42, implicit-def dead $eflags, implicit killed $eflags674 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[ADC64ri32_]]675 ; CHECK-NEXT: JMP_1 %bb.8676 ; CHECK-NEXT: {{ $}}677 ; CHECK-NEXT: bb.4:678 ; CHECK-NEXT: successors: %bb.5(0x40000000), %bb.6(0x40000000)679 ; CHECK-NEXT: {{ $}}680 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags681 ; CHECK-NEXT: JCC_1 %bb.5, 5, implicit killed $eflags682 ; CHECK-NEXT: JMP_1 %bb.6683 ; CHECK-NEXT: {{ $}}684 ; CHECK-NEXT: bb.5:685 ; CHECK-NEXT: successors: %bb.7(0x80000000)686 ; CHECK-NEXT: {{ $}}687 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags688 ; CHECK-NEXT: [[CMOV64rr:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags689 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr]]690 ; CHECK-NEXT: JMP_1 %bb.7691 ; CHECK-NEXT: {{ $}}692 ; CHECK-NEXT: bb.6:693 ; CHECK-NEXT: successors: %bb.7(0x80000000)694 ; CHECK-NEXT: {{ $}}695 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags696 ; CHECK-NEXT: [[CMOV64rr1:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags697 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr1]]698 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags699 ; CHECK-NEXT: [[CMOV64rr2:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 5, implicit killed $eflags700 ; CHECK-NEXT: MOV64mr $rsp, 1, $noreg, -16, $noreg, killed [[CMOV64rr2]]701 ; CHECK-NEXT: JMP_1 %bb.7702 ; CHECK-NEXT: {{ $}}703 ; CHECK-NEXT: bb.7:704 ; CHECK-NEXT: successors: %bb.4(0x40000000), %bb.8(0x40000000)705 ; CHECK-NEXT: {{ $}}706 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags707 ; CHECK-NEXT: JCC_1 %bb.4, 5, implicit killed $eflags708 ; CHECK-NEXT: JMP_1 %bb.8709 ; CHECK-NEXT: {{ $}}710 ; CHECK-NEXT: bb.8:711 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.9(0x40000000)712 ; CHECK-NEXT: {{ $}}713 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags714 ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit $eflags715 ; CHECK-NEXT: JMP_1 %bb.9716 ; CHECK-NEXT: {{ $}}717 ; CHECK-NEXT: bb.9:718 ; CHECK-NEXT: liveins: $eflags719 ; CHECK-NEXT: {{ $}}720 ; CHECK-NEXT: [[CMOV64rr3:%[0-9]+]]:gr64 = CMOV64rr [[COPY]], [[COPY1]], 4, implicit killed $eflags721 ; CHECK-NEXT: $rax = COPY [[CMOV64rr3]]722 ; CHECK-NEXT: RET 0, $rax723 bb.0:724 successors: %bb.1725 liveins: $rdi, $rsi726 727 %0:gr64 = COPY $rdi728 %1:gr64 = COPY $rsi729 CMP64rr %0, %1, implicit-def $eflags730 JMP_1 %bb.1731 732 bb.1:733 successors: %bb.2, %bb.4734 liveins: $eflags735 736 JCC_1 %bb.2, 4, implicit $eflags737 JMP_1 %bb.4738 739 bb.2:740 successors: %bb.2, %bb.3741 liveins: $eflags742 743 %2:gr64 = COPY $eflags744 $eflags = COPY %2745 JCC_1 %bb.2, 4, implicit $eflags746 JMP_1 %bb.3747 748 bb.3:749 successors: %bb.8750 liveins: $eflags751 752 %3:gr64 = ADC64ri32 %0, 42, implicit-def dead $eflags, implicit $eflags753 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3754 JMP_1 %bb.8755 756 bb.4:757 successors: %bb.5, %bb.6758 liveins: $eflags759 760 JCC_1 %bb.5, 4, implicit $eflags761 JMP_1 %bb.6762 763 bb.5:764 successors: %bb.7765 liveins: $eflags766 767 %4:gr64 = CMOV64rr %0, %1, 7, implicit $eflags768 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4769 JMP_1 %bb.7770 771 bb.6:772 successors: %bb.7773 liveins: $eflags774 775 %5:gr64 = CMOV64rr %0, %1, 7, implicit $eflags776 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5777 778 %6:gr64 = COPY $eflags779 $eflags = COPY %6:gr64780 781 %7:gr64 = CMOV64rr %0, %1, 7, implicit $eflags782 MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %7783 JMP_1 %bb.7784 785 bb.7:786 successors: %bb.4, %bb.8787 liveins: $eflags788 789 JCC_1 %bb.4, 4, implicit $eflags790 JMP_1 %bb.8791 792 bb.8:793 successors: %bb.1, %bb.9794 795 CMP64rr %0, %1, implicit-def $eflags796 JCC_1 %bb.1, 4, implicit $eflags797 JMP_1 %bb.9798 799 bb.9:800 liveins: $eflags801 802 %8:gr64 = CMOV64rr %0, %1, 4, implicit killed $eflags803 $rax = COPY %8804 RET 0, $rax805 806...807---808name: test_existing_setcc809body: |810 ; CHECK-LABEL: name: test_existing_setcc811 ; CHECK: bb.0:812 ; CHECK-NEXT: successors: %bb.1(0x2aaaaaab), %bb.4(0x55555556)813 ; CHECK-NEXT: liveins: $rdi, $rsi814 ; CHECK-NEXT: {{ $}}815 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi816 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi817 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags818 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 7, implicit $eflags819 ; CHECK-NEXT: [[SETCCr1:%[0-9]+]]:gr8 = SETCCr 3, implicit $eflags820 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags821 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags822 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit killed $eflags823 ; CHECK-NEXT: {{ $}}824 ; CHECK-NEXT: bb.4:825 ; CHECK-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)826 ; CHECK-NEXT: {{ $}}827 ; CHECK-NEXT: TEST8rr [[SETCCr1]], [[SETCCr1]], implicit-def $eflags828 ; CHECK-NEXT: JCC_1 %bb.2, 4, implicit killed $eflags829 ; CHECK-NEXT: JMP_1 %bb.3830 ; CHECK-NEXT: {{ $}}831 ; CHECK-NEXT: bb.1:832 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42833 ; CHECK-NEXT: $eax = COPY [[MOV32ri]]834 ; CHECK-NEXT: RET 0, $eax835 ; CHECK-NEXT: {{ $}}836 ; CHECK-NEXT: bb.2:837 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43838 ; CHECK-NEXT: $eax = COPY [[MOV32ri1]]839 ; CHECK-NEXT: RET 0, $eax840 ; CHECK-NEXT: {{ $}}841 ; CHECK-NEXT: bb.3:842 ; CHECK-NEXT: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags843 ; CHECK-NEXT: $eax = COPY [[MOV32r0_]]844 ; CHECK-NEXT: RET 0, $eax845 bb.0:846 successors: %bb.1, %bb.2, %bb.3847 liveins: $rdi, $rsi848 849 %0:gr64 = COPY $rdi850 %1:gr64 = COPY $rsi851 CMP64rr %0, %1, implicit-def $eflags852 %2:gr8 = SETCCr 7, implicit $eflags853 %3:gr8 = SETCCr 3, implicit $eflags854 %4:gr64 = COPY $eflags855 856 INLINEASM &nop, 1, 12, implicit-def dead $eflags857 858 $eflags = COPY %4859 JCC_1 %bb.1, 7, implicit $eflags860 JCC_1 %bb.2, 2, implicit $eflags861 JMP_1 %bb.3862 863 bb.1:864 %5:gr32 = MOV32ri 42865 $eax = COPY %5866 RET 0, $eax867 868 bb.2:869 %6:gr32 = MOV32ri 43870 $eax = COPY %6871 RET 0, $eax872 873 bb.3:874 %7:gr32 = MOV32r0 implicit-def dead $eflags875 $eax = COPY %7876 RET 0, $eax877 878...879---880# We cannot reuse this SETE because it stores the flag directly to memory,881# so we have two SETEs here. FIXME: It'd be great if something could fold882# these automatically. If not, maybe we want to unfold SETcc instructions883# writing to memory so we can reuse them.884 885name: test_existing_setcc_memory886body: |887 ; CHECK-LABEL: name: test_existing_setcc_memory888 ; CHECK: bb.0:889 ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)890 ; CHECK-NEXT: liveins: $rdi, $rsi891 ; CHECK-NEXT: {{ $}}892 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi893 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rsi894 ; CHECK-NEXT: CMP64rr [[COPY]], [[COPY1]], implicit-def $eflags895 ; CHECK-NEXT: SETCCm [[COPY]], 1, $noreg, -16, $noreg, 4, implicit $eflags896 ; CHECK-NEXT: [[SETCCr:%[0-9]+]]:gr8 = SETCCr 4, implicit $eflags897 ; CHECK-NEXT: INLINEASM &nop, 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def dead $eflags898 ; CHECK-NEXT: TEST8rr [[SETCCr]], [[SETCCr]], implicit-def $eflags899 ; CHECK-NEXT: JCC_1 %bb.1, 5, implicit killed $eflags900 ; CHECK-NEXT: JMP_1 %bb.2901 ; CHECK-NEXT: {{ $}}902 ; CHECK-NEXT: bb.1:903 ; CHECK-NEXT: [[MOV32ri:%[0-9]+]]:gr32 = MOV32ri 42904 ; CHECK-NEXT: $eax = COPY [[MOV32ri]]905 ; CHECK-NEXT: RET 0, $eax906 ; CHECK-NEXT: {{ $}}907 ; CHECK-NEXT: bb.2:908 ; CHECK-NEXT: [[MOV32ri1:%[0-9]+]]:gr32 = MOV32ri 43909 ; CHECK-NEXT: $eax = COPY [[MOV32ri1]]910 ; CHECK-NEXT: RET 0, $eax911 bb.0:912 successors: %bb.1, %bb.2913 liveins: $rdi, $rsi914 915 %0:gr64 = COPY $rdi916 %1:gr64 = COPY $rsi917 CMP64rr %0, %1, implicit-def $eflags918 SETCCm %0, 1, $noreg, -16, $noreg, 4, implicit $eflags919 %2:gr64 = COPY $eflags920 921 INLINEASM &nop, 1, 12, implicit-def dead $eflags922 923 $eflags = COPY %2924 JCC_1 %bb.1, 4, implicit $eflags925 JMP_1 %bb.2926 927 bb.1:928 %3:gr32 = MOV32ri 42929 $eax = COPY %3930 RET 0, $eax931 932 bb.2:933 %4:gr32 = MOV32ri 43934 $eax = COPY %4935 RET 0, $eax936 937...938