brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.3 KiB · a08c63c Raw
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