| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 |
| # RUN: llc -mtriple=x86_64-- -run-pass=register-coalescer -o - %s | FileCheck %s |
| |
| # We cannot lose the liveness of the high subregister of %1 when |
| # coalesced with %0, so introduce an implicit-def of the super |
| # register on the MOV. |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64 |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %1 |
| ; CHECK-NEXT: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %0:gr32 = MOV32r0 implicit-def dead $eflags |
| %1:gr64 = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: subreg_to_reg_folds_to_undef |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $rax |
| |
| ; CHECK-LABEL: name: subreg_to_reg_folds_to_undef |
| ; CHECK: liveins: $rax |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64_with_sub_8bit = COPY $rax |
| ; CHECK-NEXT: undef %4.sub_32bit:gr64_with_sub_8bit = MOV32rr [[COPY]].sub_32bit, implicit-def %4 |
| ; CHECK-NEXT: RET 0, implicit %4 |
| %0:gr64 = COPY killed $rax |
| %1:gr32 = COPY killed %0.sub_32bit |
| %2:gr32 = MOV32rr killed %1 |
| %3:gr64 = SUBREG_TO_REG 0, killed %2, %subreg.sub_32bit |
| %4:gr64 = COPY killed %3 |
| RET 0, implicit %4 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_subreg_def_into_subreg_to_reg64 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_subreg_def_into_subreg_to_reg64 |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags |
| ; CHECK-NEXT: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| undef %0.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags |
| %1:gr64 = SUBREG_TO_REG 0, killed %0.sub_32bit, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_def_with_super_def_to_reg64 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_def_with_super_def_to_reg64 |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %1 |
| ; CHECK-NEXT: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| undef %0.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %0 |
| %1:gr64 = SUBREG_TO_REG 0, killed %0.sub_32bit, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_already_defs_other_subreg |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_already_defs_other_subreg |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def undef %1.sub_8bit, implicit-def %1 |
| ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, implicit %1 |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit undef $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %0:gr32 = MOV32r0 implicit-def dead $eflags, implicit-def undef %0.sub_8bit |
| %1:gr64 = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| INLINEASM &"", 0, implicit %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit undef $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| |
| # Reduced realistic case which was asserting after introducing new implicit-defs |
| --- |
| name: coalesce_needs_implicit_defs |
| tracksRegLiveness: true |
| body: | |
| ; CHECK-LABEL: name: coalesce_needs_implicit_defs |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: liveins: $rdi |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi |
| ; CHECK-NEXT: undef %2.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %2 |
| ; CHECK-NEXT: undef %3.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %3 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: undef %10.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags |
| ; CHECK-NEXT: TEST64rr %3, %3, implicit-def $eflags |
| ; CHECK-NEXT: %10.sub_8bit:gr64_with_sub_8bit = SETCCr 4, implicit killed $eflags |
| ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK-NEXT: CALL64r %2, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: [[SHL64ri:%[0-9]+]]:gr64_with_sub_8bit = SHL64ri [[SHL64ri]], 4, implicit-def dead $eflags |
| ; CHECK-NEXT: [[ADD64rr:%[0-9]+]]:gr64_with_sub_8bit = ADD64rr [[ADD64rr]], [[COPY]], implicit-def dead $eflags |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64_with_sub_8bit = COPY [[ADD64rr]] |
| ; CHECK-NEXT: JMP_1 %bb.1 |
| bb.0: |
| liveins: $rdi |
| |
| %0:gr64 = COPY killed $rdi |
| %1:gr32 = MOV32r0 implicit-def dead $eflags |
| %2:gr64 = SUBREG_TO_REG 0, %1, %subreg.sub_32bit |
| %3:gr64 = COPY killed %2 |
| |
| bb.1: |
| %4:gr64 = COPY killed %3 |
| %5:gr32 = MOV32r0 implicit-def dead $eflags |
| TEST64rr killed %4, %4, implicit-def $eflags |
| %6:gr8 = SETCCr 4, implicit killed $eflags |
| %7:gr32 = COPY killed %5 |
| %7.sub_8bit:gr32 = COPY killed %6 |
| %8:gr64 = SUBREG_TO_REG 0, killed %7, %subreg.sub_32bit |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %9:gr64 = SUBREG_TO_REG 0, %1, %subreg.sub_32bit |
| $rdi = COPY %9 |
| CALL64r killed %9, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %10:gr64 = COPY killed %8 |
| %10:gr64 = SHL64ri %10, 4, implicit-def dead $eflags |
| %11:gr64 = COPY killed %10 |
| %11:gr64 = ADD64rr %11, %0, implicit-def dead $eflags |
| %3:gr64 = COPY killed %11 |
| JMP_1 %bb.1 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_physreg_def |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_physreg_def |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK-NEXT: CALL64r killed $rdi, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %0:gr32 = MOV32r0 implicit-def dead $eflags |
| $rdi = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| CALL64r killed $rdi, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_physreg_use |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $eax |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_physreg_use |
| ; CHECK: liveins: $eax |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: $eax = MOV32r0 implicit-def dead $eflags |
| ; CHECK-NEXT: [[SUBREG_TO_REG:%[0-9]+]]:gr64 = SUBREG_TO_REG 0, $eax, %subreg.sub_32bit |
| ; CHECK-NEXT: $rdi = COPY [[SUBREG_TO_REG]] |
| ; CHECK-NEXT: CALL64r [[SUBREG_TO_REG]], csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| $eax = MOV32r0 implicit-def dead $eflags |
| %1:gr64 = SUBREG_TO_REG 0, killed $eax, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| # Coalesced instruction is a copy with other implicit operands |
| --- |
| name: coalesce_copy_into_subreg_to_reg64 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $eax |
| ; CHECK-LABEL: name: coalesce_copy_into_subreg_to_reg64 |
| ; CHECK: liveins: $eax |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = COPY $eax, implicit-def dead $eflags, implicit-def %1 |
| ; CHECK-NEXT: $rdi = COPY %1 |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %0:gr32 = COPY $eax, implicit-def dead $eflags |
| %1:gr64 = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_multiple_redef_value |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_multiple_redef_value |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: undef %1.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags, implicit-def %1 |
| ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, implicit-def %1.sub_32bit, implicit %1.sub_32bit |
| ; CHECK-NEXT: $rdi = COPY %1 |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %0:gr32 = MOV32r0 implicit-def dead $eflags |
| INLINEASM &"", 0, implicit-def %0, implicit %0 |
| %1:gr64 = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| $rdi = COPY %1 |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_def_is_block_liveout |
| tracksRegLiveness: true |
| body: | |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_def_is_block_liveout |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, implicit-def undef %1.sub_32bit, implicit-def %1 |
| ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit undef $eflags |
| ; CHECK-NEXT: JMP_1 %bb.2 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: $rdi = COPY %1 |
| ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: RET 0 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| bb.0: |
| INLINEASM &"", 0, implicit-def %0:gr32 |
| JCC_1 %bb.1, 4, implicit undef $eflags |
| JMP_1 %bb.2 |
| |
| bb.1: |
| %1:gr64 = SUBREG_TO_REG 0, killed %0, %subreg.sub_32bit |
| $rdi = COPY %1 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| CALL64r killed %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| RET 0 |
| |
| bb.2: |
| |
| ... |
| |
| --- |
| name: coalesce_mov32r0_into_subreg_to_reg64_def_is_phi_def |
| tracksRegLiveness: true |
| body: | |
| ; CHECK-LABEL: name: coalesce_mov32r0_into_subreg_to_reg64_def_is_phi_def |
| ; CHECK: bb.0: |
| ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: INLINEASM &"", 0 /* attdialect */, implicit-def undef %1.sub_32bit, implicit-def %1 |
| ; CHECK-NEXT: JCC_1 %bb.1, 4, implicit undef $eflags |
| ; CHECK-NEXT: JMP_1 %bb.2 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.1: |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: $rdi = COPY %1 |
| ; CHECK-NEXT: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ; CHECK-NEXT: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK-NEXT: JMP_1 %bb.1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: bb.2: |
| bb.0: |
| |
| INLINEASM &"", 0, implicit-def %0:gr32 |
| JCC_1 %bb.1, 4, implicit undef $eflags |
| JMP_1 %bb.2 |
| |
| bb.1: |
| %1:gr64 = SUBREG_TO_REG 0, %0, %subreg.sub_32bit |
| $rdi = COPY %1 |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| CALL64r %1, csr_64, implicit $rsp, implicit $ssp, implicit killed $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| JMP_1 %bb.1 |
| |
| bb.2: |
| |
| ... |