| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -x mir -run-pass=simple-register-coalescing,greedy -verify-machineinstrs < %s | FileCheck %s |
| |
| ## Check that Inline Spiller cannot insert spill after last insertion point. |
| |
| --- | |
| ; ModuleID = 'inline-spiller' |
| source_filename = "inline-spiller.ll" |
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux-gnu" |
| |
| define void @hoge() gc "statepoint-example" personality i32* ()* @widget { |
| bb: |
| %tmp = call token (i64, i32, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 2, i32 5, void (i8 addrspace(1)*, i8 addrspace(1)*)* nonnull @quux, i32 2, i32 0, i8 addrspace(1)* nonnull null, i8 addrspace(1)* undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 6, i32 0, i32 4, i32 1, i32 0, i8 addrspace(1)* null, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 7, i8* null, i32 0, i8 addrspace(1)* null, i32 2, i32 4, i32 5, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null), "gc-live"(i8 addrspace(1)* null, i8 addrspace(1)* undef) ] |
| br label %bb1 |
| |
| bb1: ; preds = %bb21, %bb |
| %tmp2 = phi i32 addrspace(1)* [ undef, %bb ], [ %tmp22, %bb21 ] |
| %tmp3 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp23, %bb21 ] |
| %tmp4 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp24, %bb21 ] |
| %tmp5 = phi i8 addrspace(1)* [ undef, %bb ], [ %tmp25, %bb21 ] |
| %tmp6 = phi i8 addrspace(1)* [ null, %bb ], [ %tmp26, %bb21 ] |
| %tmp7 = phi i32 [ 0, %bb ], [ %tmp13, %bb21 ] |
| %tmp8 = load atomic i32, i32 addrspace(1)* undef unordered, align 8 |
| %tmp9 = load atomic i32, i32 addrspace(1)* %tmp2 unordered, align 4 |
| %tmp10 = sub i32 %tmp8, %tmp9 |
| %tmp11 = icmp slt i32 %tmp10, undef |
| %tmp12 = select i1 %tmp11, i32 %tmp10, i32 undef |
| %tmp13 = add i32 %tmp12, %tmp7 |
| %tmp14 = call token (i64, i32, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i32i32p1i8i32f(i64 2, i32 5, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)* nonnull @hoge.1, i32 5, i32 0, i8 addrspace(1)* %tmp4, i32 %tmp7, i32 %tmp13, i8 addrspace(1)* undef, i32 %tmp9, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp6, i32 0, i8 addrspace(1)* %tmp6, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp6, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 63, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* %tmp5, i32 0, i8 addrspace(1)* %tmp4, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp3, i32 3, i32 %tmp7, i32 3, i32 undef, i32 3, i32 %tmp12, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp3), "gc-live"(i8 addrspace(1)* %tmp6, i8 addrspace(1)* %tmp5, i8 addrspace(1)* %tmp4, i8 addrspace(1)* %tmp3) ] |
| %tmp15 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 0, i32 0) ; (%tmp6, %tmp6) |
| %tmp16 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 1, i32 1) ; (%tmp5, %tmp5) |
| %tmp17 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 2, i32 2) ; (%tmp4, %tmp4) |
| %tmp18 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp14, i32 3, i32 3) ; (%tmp3, %tmp3) |
| %tmp19 = add i32 0, %tmp12 |
| %tmp20 = icmp slt i32 %tmp19, undef |
| br i1 %tmp20, label %bb21, label %bb28 |
| |
| bb21: ; preds = %bb30, %bb1 |
| %tmp22 = phi i32 addrspace(1)* [ undef, %bb1 ], [ %tmp34, %bb30 ] |
| %tmp23 = phi i8 addrspace(1)* [ %tmp18, %bb1 ], [ undef, %bb30 ] |
| %tmp24 = phi i8 addrspace(1)* [ %tmp17, %bb1 ], [ undef, %bb30 ] |
| %tmp25 = phi i8 addrspace(1)* [ %tmp16, %bb1 ], [ %tmp32, %bb30 ] |
| %tmp26 = phi i8 addrspace(1)* [ %tmp15, %bb1 ], [ %tmp31, %bb30 ] |
| br label %bb1 |
| |
| bb28: ; preds = %bb1 |
| %tmp29 = invoke token (i64, i32, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 1, i32 16, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)* nonnull @ham, i32 5, i32 0, i32 undef, i8 addrspace(1)* nonnull undef, i8 addrspace(1)* undef, i32 0, i32 undef, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp15, i32 0, i8 addrspace(1)* %tmp15, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp15, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* %tmp16, i32 0, i8 addrspace(1)* %tmp17, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp18, i32 3, i32 %tmp13, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp18, i32 8, i32 12, i32 34, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp16, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 0, i8 addrspace(1)* undef), "gc-live"(i8 addrspace(1)* %tmp15, i8 addrspace(1)* %tmp16, i8 addrspace(1)* %tmp17, i8 addrspace(1)* %tmp18, i8 addrspace(1)* undef) ] |
| to label %bb30 unwind label %bb35 |
| |
| bb30: ; preds = %bb28 |
| %tmp31 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 0, i32 0) ; (%tmp15, %tmp15) |
| %tmp32 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp29, i32 1, i32 1) ; (%tmp16, %tmp16) |
| %tmp33 = getelementptr inbounds i8, i8 addrspace(1)* %tmp32, i64 28 |
| %tmp34 = bitcast i8 addrspace(1)* %tmp33 to i32 addrspace(1)* |
| call void @barney() #2 |
| br label %bb21 |
| |
| bb35: ; preds = %bb28 |
| %tmp36 = landingpad token |
| cleanup |
| %tmp37 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 0, i32 0) ; (%tmp15, %tmp15) |
| %tmp38 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %tmp36, i32 3, i32 3) ; (%tmp18, %tmp18) |
| %tmp39 = call token (i64, i32, void (i32)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 2882400000, i32 0, void (i32)* nonnull @wombat, i32 1, i32 2, i32 3, i32 0, i32 0) [ "deopt"(i32 0, i32 2, i32 0, i32 43, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 1, i32 10, i32 0, i32 4, i32 1, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 10, i32 5, i32 12, i32 0, i32 3, i32 1, i32 0, i8 addrspace(1)* %tmp37, i32 0, i8 addrspace(1)* %tmp37, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp37, i32 2, i32 11, i32 4, i32 0, i32 1, i32 0, i32 7, i8* null, i32 2, i32 15, i32 7, i32 0, i32 2, i32 0, i32 7, i8* null, i32 7, i8* null, i32 10, i32 21, i32 96, i32 0, i32 9, i32 1, i32 0, i8 addrspace(1)* undef, i32 0, i8 addrspace(1)* undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp38, i32 3, i32 %tmp13, i32 3, i32 undef, i32 7, i8* null, i32 7, i8* null, i32 0, i8 addrspace(1)* %tmp38, i32 0, i32 12, i32 51, i32 0, i32 3, i32 0, i32 7, i8* null, i32 7, i8* null, i32 7, i8* null), "gc-live"() ] |
| unreachable |
| } |
| |
| ; Function Attrs: willreturn |
| declare i32* @widget() #0 |
| |
| declare void @quux(i8 addrspace(1)*, i8 addrspace(1)*) |
| |
| declare void @hoge.1(i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32) |
| |
| ; Function Attrs: willreturn |
| declare void @barney() #0 |
| |
| declare void @ham(i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32) |
| |
| declare void @wombat(i32) |
| |
| declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32f(i64 immarg, i32 immarg, void (i32)*, i32 immarg, i32 immarg, ...) |
| |
| ; Function Attrs: nounwind readnone |
| declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32 immarg, i32 immarg) #1 |
| |
| declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8p1i8f(i64 immarg, i32 immarg, void (i8 addrspace(1)*, i8 addrspace(1)*)*, i32 immarg, i32 immarg, ...) |
| |
| declare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i8i32i32p1i8i32f(i64 immarg, i32 immarg, void (i8 addrspace(1)*, i32, i32, i8 addrspace(1)*, i32)*, i32 immarg, i32 immarg, ...) |
| |
| declare token @llvm.experimental.gc.statepoint.p0f_isVoidi32p1i8p1i8i32i32f(i64 immarg, i32 immarg, void (i32, i8 addrspace(1)*, i8 addrspace(1)*, i32, i32)*, i32 immarg, i32 immarg, ...) |
| |
| attributes #0 = { willreturn } |
| attributes #1 = { nounwind readnone } |
| attributes #2 = { nounwind } |
| |
| ... |
| --- |
| name: hoge |
| alignment: 16 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| failedISel: false |
| tracksRegLiveness: true |
| hasWinCFI: false |
| registers: |
| - { id: 0, class: gr64, preferred-register: '' } |
| - { id: 1, class: gr64, preferred-register: '' } |
| - { id: 2, class: gr64, preferred-register: '' } |
| - { id: 3, class: gr64, preferred-register: '' } |
| - { id: 4, class: gr64, preferred-register: '' } |
| - { id: 5, class: gr32, preferred-register: '' } |
| - { id: 6, class: gr32, preferred-register: '' } |
| - { id: 7, class: gr64, preferred-register: '' } |
| - { id: 8, class: gr64, preferred-register: '' } |
| - { id: 9, class: gr64, preferred-register: '' } |
| - { id: 10, class: gr64, preferred-register: '' } |
| - { id: 11, class: gr64, preferred-register: '' } |
| - { id: 12, class: gr64, preferred-register: '' } |
| - { id: 13, class: gr64, preferred-register: '' } |
| - { id: 14, class: gr64, preferred-register: '' } |
| - { id: 15, class: gr64, preferred-register: '' } |
| - { id: 16, class: gr64, preferred-register: '' } |
| - { id: 17, class: gr64, preferred-register: '' } |
| - { id: 18, class: gr64, preferred-register: '' } |
| - { id: 19, class: gr64, preferred-register: '' } |
| - { id: 20, class: gr64, preferred-register: '' } |
| - { id: 21, class: gr64, preferred-register: '' } |
| - { id: 22, class: gr32, preferred-register: '' } |
| - { id: 23, class: gr64, preferred-register: '' } |
| - { id: 24, class: gr64, preferred-register: '' } |
| - { id: 25, class: gr64, preferred-register: '' } |
| - { id: 26, class: gr64, preferred-register: '' } |
| - { id: 27, class: gr64, preferred-register: '' } |
| - { id: 28, class: gr64, preferred-register: '' } |
| - { id: 29, class: gr64, preferred-register: '' } |
| - { id: 30, class: gr32, preferred-register: '' } |
| - { id: 31, class: gr64, preferred-register: '' } |
| - { id: 32, class: gr32, preferred-register: '' } |
| - { id: 33, class: gr32, preferred-register: '' } |
| - { id: 34, class: gr64, preferred-register: '' } |
| - { id: 35, class: gr64, preferred-register: '' } |
| - { id: 36, class: gr32, preferred-register: '' } |
| - { id: 37, class: gr32, preferred-register: '' } |
| - { id: 38, class: gr64, preferred-register: '' } |
| - { id: 39, class: gr64, preferred-register: '' } |
| - { id: 40, class: gr64, preferred-register: '' } |
| - { id: 41, class: gr32, preferred-register: '' } |
| - { id: 42, class: gr32, preferred-register: '' } |
| - { id: 43, class: gr64, preferred-register: '' } |
| - { id: 44, class: gr64, preferred-register: '' } |
| - { id: 45, class: gr32, preferred-register: '' } |
| - { id: 46, class: gr64, preferred-register: '' } |
| - { id: 47, class: gr64, preferred-register: '' } |
| - { id: 48, class: gr64, preferred-register: '' } |
| - { id: 49, class: gr64, preferred-register: '' } |
| - { id: 50, class: gr32, preferred-register: '' } |
| - { id: 51, class: gr64, preferred-register: '' } |
| - { id: 52, class: gr64, preferred-register: '' } |
| - { id: 53, class: gr64, preferred-register: '' } |
| - { id: 54, class: gr64, preferred-register: '' } |
| - { id: 55, class: gr64, preferred-register: '' } |
| - { id: 56, class: gr64, preferred-register: '' } |
| - { id: 57, class: gr64, preferred-register: '' } |
| - { id: 58, class: gr64, preferred-register: '' } |
| - { id: 59, class: gr32, preferred-register: '' } |
| - { id: 60, class: gr64, preferred-register: '' } |
| - { id: 61, class: gr64, preferred-register: '' } |
| - { id: 62, class: gr64, preferred-register: '' } |
| - { id: 63, class: gr64, preferred-register: '' } |
| - { id: 64, class: gr64, preferred-register: '' } |
| - { id: 65, class: gr64, preferred-register: '' } |
| - { id: 66, class: gr64_nosp, preferred-register: '' } |
| liveins: [] |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: false |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 4 |
| adjustsStack: false |
| hasCalls: true |
| stackProtector: '' |
| maxCallFrameSize: 4294967295 |
| cvBytesOfCalleeSavedRegisters: 0 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| hasTailCall: false |
| localFrameSize: 0 |
| savePoint: '' |
| restorePoint: '' |
| fixedStack: [] |
| stack: |
| - { id: 0, name: '', type: default, offset: 0, size: 4, alignment: 4, |
| stack-id: default, callee-saved-register: '', callee-saved-restored: true, |
| debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } |
| - { id: 1, name: '', type: default, offset: 0, size: 4, alignment: 4, |
| stack-id: default, callee-saved-register: '', callee-saved-restored: true, |
| debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } |
| callSites: [] |
| debugValueSubstitutions: [] |
| constants: [] |
| machineFunctionInfo: {} |
| body: | |
| ; CHECK-LABEL: name: hoge |
| ; CHECK: bb.0.bb: |
| ; CHECK: successors: %bb.1(0x80000000) |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: undef %75.sub_32bit:gr64_with_sub_8bit = MOV32r0 implicit-def dead $eflags |
| ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, %75 :: (store (s64) into %stack.2) |
| ; CHECK: dead $edi = MOV32r0 implicit-def dead $eflags, implicit-def $rdi |
| ; CHECK: STATEPOINT 2, 5, 2, undef %24:gr64, $rdi, undef $rsi, 2, 0, 2, 0, 2, 37, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 2, 2, 4, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 0, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp |
| ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: [[DEF:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[DEF2:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[DEF3:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[MOV32r0_:%[0-9]+]]:gr32 = MOV32r0 implicit-def dead $eflags |
| ; CHECK: bb.1.bb1: |
| ; CHECK: successors: %bb.2(0x40000000), %bb.4(0x40000000) |
| ; CHECK: undef %66.sub_32bit:gr64_nosp = COPY [[MOV32r0_]] |
| ; CHECK: undef %65.sub_32bit:gr64_with_sub_8bit = MOV32rm undef %31:gr64, 1, $noreg, 0, $noreg :: (load unordered (s32) from `i32 addrspace(1)* undef`, align 8, addrspace 1) |
| ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[DEF]], 1, $noreg, 0, $noreg :: (load unordered (s32) from %ir.tmp2, addrspace 1) |
| ; CHECK: %65.sub_32bit:gr64_with_sub_8bit = SUB32rr %65.sub_32bit, [[MOV32rm]], implicit-def dead $eflags |
| ; CHECK: [[LEA64_32r:%[0-9]+]]:gr32 = LEA64_32r %65, 1, %66, 0, $noreg |
| ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, %66.sub_32bit :: (store (s32) into %stack.0) |
| ; CHECK: MOV32mr %stack.1, 1, $noreg, 0, $noreg, %65.sub_32bit :: (store (s32) into %stack.1) |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: $rdi = COPY [[DEF2]] |
| ; CHECK: $esi = COPY %66.sub_32bit |
| ; CHECK: $edx = COPY [[LEA64_32r]] |
| ; CHECK: $r8d = COPY [[MOV32rm]] |
| ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm %stack.2, 1, $noreg, 0, $noreg :: (load (s64) from %stack.2) |
| ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY [[MOV64rm]] |
| ; CHECK: [[STATEPOINT:%[0-9]+]]:gr64, [[STATEPOINT1:%[0-9]+]]:gr64, [[STATEPOINT2:%[0-9]+]]:gr64, [[STATEPOINT3:%[0-9]+]]:gr64 = STATEPOINT 2, 5, 5, undef %35:gr64, $rdi, $esi, $edx, undef $rcx, $r8d, 2, 0, 2, 0, 2, 85, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, [[STATEPOINT1]], 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 3, 1, 4, %stack.1, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 4, [[STATEPOINT]](tied-def 0), [[STATEPOINT1]](tied-def 1), [[STATEPOINT2]](tied-def 2), [[STATEPOINT3]](tied-def 3), 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store (s32) on %stack.0), (volatile load store (s32) on %stack.1) |
| ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: CMP32rr %65.sub_32bit, undef %37:gr32, implicit-def $eflags |
| ; CHECK: JCC_1 %bb.4, 13, implicit killed $eflags |
| ; CHECK: bb.2: |
| ; CHECK: successors: %bb.3(0x80000000) |
| ; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY [[STATEPOINT3]] |
| ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, [[COPY]] :: (store (s64) into %stack.2) |
| ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[COPY1:%[0-9]+]]:gr32 = COPY [[LEA64_32r]] |
| ; CHECK: bb.3.bb21: |
| ; CHECK: successors: %bb.1(0x80000000) |
| ; CHECK: JMP_1 %bb.1 |
| ; CHECK: bb.4.bb28: |
| ; CHECK: successors: %bb.5(0x80000000), %bb.6(0x00000000) |
| ; CHECK: MOV32mr %stack.0, 1, $noreg, 0, $noreg, [[LEA64_32r]] :: (store (s32) into %stack.0) |
| ; CHECK: EH_LABEL <mcsymbol .Ltmp0> |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: $ecx = MOV32r0 implicit-def dead $eflags |
| ; CHECK: [[COPY4:%[0-9]+]]:gr32 = COPY [[LEA64_32r]] |
| ; CHECK: [[STATEPOINT2]]:gr64, [[STATEPOINT3]]:gr64, [[STATEPOINT]]:gr64, dead [[STATEPOINT1]]:gr64 = STATEPOINT 1, 16, 5, undef %47:gr64, undef $edi, undef $rsi, undef $rdx, $ecx, undef $r8d, 2, 0, 2, 0, 2, 99, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, [[STATEPOINT1]], 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT]], 2, 8, 2, 12, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT2]], 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, [[STATEPOINT2]](tied-def 0), [[STATEPOINT3]](tied-def 1), [[STATEPOINT]](tied-def 2), [[STATEPOINT1]](tied-def 3), 2, 4278124286, 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store (s32) on %stack.0) |
| ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: EH_LABEL <mcsymbol .Ltmp1> |
| ; CHECK: JMP_1 %bb.5 |
| ; CHECK: bb.5.bb30: |
| ; CHECK: successors: %bb.3(0x80000000) |
| ; CHECK: [[COPY2:%[0-9]+]]:gr64 = COPY [[STATEPOINT3]] |
| ; CHECK: MOV64mr %stack.2, 1, $noreg, 0, $noreg, [[COPY2]] :: (store (s64) into %stack.2) |
| ; CHECK: [[COPY3:%[0-9]+]]:gr64 = COPY [[STATEPOINT2]] |
| ; CHECK: [[ADD64ri8_:%[0-9]+]]:gr64 = nuw ADD64ri8 [[ADD64ri8_]], 28, implicit-def dead $eflags |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: CALL64pcrel32 target-flags(x86-plt) @barney, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp |
| ; CHECK: [[COPY3:%[0-9]+]]:gr64 = COPY [[ADD64ri8_]] |
| ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: [[DEF:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: [[DEF1:%[0-9]+]]:gr64 = IMPLICIT_DEF |
| ; CHECK: JMP_1 %bb.3 |
| ; CHECK: bb.6.bb35 (landing-pad): |
| ; CHECK: liveins: $rax, $rdx |
| ; CHECK: EH_LABEL <mcsymbol .Ltmp2> |
| ; CHECK: ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| ; CHECK: $edi = MOV32ri 3 |
| ; CHECK: dead [[STATEPOINT3]]:gr64, dead [[DEF]]:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @wombat, $edi, 2, 0, 2, 2, 2, 97, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, [[STATEPOINT3]], 2, 0, [[STATEPOINT3]], 2, 7, 2, 0, 2, 0, [[STATEPOINT3]], 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 3, [[COPY4]], 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, [[DEF]], 2, 0, 2, 12, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 3, [[STATEPOINT3]](tied-def 0), 2, 4278124286, [[DEF]](tied-def 1), 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp |
| ; CHECK: ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| bb.0.bb: |
| successors: %bb.1(0x80000000) |
| |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %22:gr32 = MOV32r0 implicit-def dead $eflags |
| %21:gr64 = SUBREG_TO_REG 0, %22, %subreg.sub_32bit |
| $rdi = COPY %21 |
| STATEPOINT 2, 5, 2, undef %24:gr64, killed $rdi, undef $rsi, 2, 0, 2, 0, 2, 37, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 6, 2, 0, 2, 4, 2, 1, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 7, 2, 0, 2, 0, 2, 0, 2, 2, 2, 4, 2, 5, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 1, 2, 0, 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %54:gr64 = IMPLICIT_DEF |
| %55:gr64 = IMPLICIT_DEF |
| %56:gr64 = IMPLICIT_DEF |
| %57:gr64 = IMPLICIT_DEF |
| %58:gr64 = COPY killed %21 |
| %59:gr32 = COPY %22 |
| |
| bb.1.bb1: |
| successors: %bb.6(0x40000000), %bb.3(0x40000000) |
| |
| %5:gr32 = COPY killed %59 |
| %4:gr64 = COPY killed %58 |
| %3:gr64 = COPY killed %57 |
| %2:gr64 = COPY killed %56 |
| %1:gr64 = COPY killed %55 |
| %0:gr64 = COPY killed %54 |
| %30:gr32 = MOV32rm undef %31:gr64, 1, $noreg, 0, $noreg :: (load unordered (s32) from `i32 addrspace(1)* undef`, align 8, addrspace 1) |
| %32:gr32 = MOV32rm killed %0, 1, $noreg, 0, $noreg :: (load unordered (s32) from %ir.tmp2, addrspace 1) |
| %33:gr32 = COPY killed %30 |
| %33:gr32 = SUB32rr %33, %32, implicit-def dead $eflags |
| undef %65.sub_32bit:gr64 = COPY %33 |
| undef %66.sub_32bit:gr64_nosp = COPY %5 |
| %6:gr32 = LEA64_32r killed %65, 1, killed %66, 0, $noreg |
| MOV32mr %stack.0, 1, $noreg, 0, $noreg, %5 :: (store (s32) into %stack.0) |
| MOV32mr %stack.1, 1, $noreg, 0, $noreg, %33 :: (store (s32) into %stack.1) |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| $rdi = COPY %2 |
| $esi = COPY killed %5 |
| $edx = COPY %6 |
| $r8d = COPY killed %32 |
| %26:gr64 = COPY killed %2 |
| %28:gr64 = COPY killed %4 |
| %25:gr64 = COPY killed %1 |
| %27:gr64 = COPY killed %3 |
| %25:gr64, %26:gr64, %27:gr64, %28:gr64 = STATEPOINT 2, 5, 5, undef %35:gr64, killed $rdi, killed $esi, killed $edx, undef $rcx, killed $r8d, 2, 0, 2, 0, 2, 85, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %28, 2, 7, 2, 0, 2, 0, %28, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %28, 2, 0, %28, 2, 7, 2, 0, 2, 0, %28, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 63, 2, 0, 2, 9, 2, 1, 2, 0, %27, 2, 0, %26, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %25, 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 3, 1, 4, %stack.1, 0, 2, 7, 2, 0, 2, 0, %25, 2, 4, %25(tied-def 0), %26(tied-def 1), %27(tied-def 2), %28(tied-def 3), 2, 0, 2, 4, 0, 0, 1, 1, 2, 2, 3, 3, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store (s32) on %stack.0), (volatile load store (s32) on %stack.1) |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| CMP32rr killed %33, undef %37:gr32, implicit-def $eflags |
| JCC_1 %bb.3, 13, implicit killed $eflags |
| |
| bb.6: |
| successors: %bb.2(0x80000000) |
| |
| %60:gr64 = IMPLICIT_DEF |
| %61:gr64 = COPY killed %25 |
| %62:gr64 = COPY killed %26 |
| %63:gr64 = COPY killed %27 |
| %64:gr64 = COPY killed %28 |
| |
| bb.2.bb21: |
| successors: %bb.1(0x80000000) |
| |
| %15:gr64 = COPY killed %64 |
| %14:gr64 = COPY killed %63 |
| %13:gr64 = COPY killed %62 |
| %12:gr64 = COPY killed %61 |
| %11:gr64 = COPY killed %60 |
| %54:gr64 = COPY killed %11 |
| %55:gr64 = COPY killed %12 |
| %56:gr64 = COPY killed %13 |
| %57:gr64 = COPY killed %14 |
| %58:gr64 = COPY killed %15 |
| %59:gr32 = COPY killed %6 |
| JMP_1 %bb.1 |
| |
| bb.3.bb28: |
| successors: %bb.4(0x80000000), %bb.5(0x00000000) |
| |
| MOV32mr %stack.0, 1, $noreg, 0, $noreg, %6 :: (store (s32) into %stack.0) |
| EH_LABEL <mcsymbol .Ltmp0> |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| $ecx = COPY %22 |
| %46:gr64 = COPY killed %26 |
| %39:gr64 = COPY killed %28 |
| %40:gr64 = COPY killed %25 |
| %38:gr64 = COPY killed %27 |
| %38:gr64, %39:gr64, %40:gr64, dead %46:gr64 = STATEPOINT 1, 16, 5, undef %47:gr64, undef $edi, undef $rsi, undef $rdx, killed $ecx, undef $r8d, 2, 0, 2, 0, 2, 99, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %39, 2, 7, 2, 0, 2, 0, %39, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %39, 2, 0, %39, 2, 7, 2, 0, 2, 0, %39, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, %38, 2, 0, %46, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %40, 2, 3, 1, 4, %stack.0, 0, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %40, 2, 8, 2, 12, 2, 34, 2, 0, 2, 3, 2, 1, 2, 0, %38, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 0, 2, 4278124286, 2, 5, %38(tied-def 0), %39(tied-def 1), %40(tied-def 2), %46(tied-def 3), 2, 4278124286, 2, 0, 2, 5, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, csr_64, implicit-def $rsp, implicit-def $ssp :: (volatile load store (s32) on %stack.0) |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| EH_LABEL <mcsymbol .Ltmp1> |
| JMP_1 %bb.4 |
| |
| bb.4.bb30: |
| successors: %bb.2(0x80000000) |
| |
| %16:gr64 = COPY killed %39 |
| %17:gr64 = COPY %38 |
| %18:gr64 = COPY killed %38 |
| %18:gr64 = nuw ADD64ri8 %18, 28, implicit-def dead $eflags |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| CALL64pcrel32 target-flags(x86-plt) @barney, csr_64, implicit $rsp, implicit $ssp, implicit-def $rsp, implicit-def $ssp |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %60:gr64 = COPY killed %18 |
| %61:gr64 = IMPLICIT_DEF |
| %62:gr64 = IMPLICIT_DEF |
| %63:gr64 = COPY killed %17 |
| %64:gr64 = COPY killed %16 |
| JMP_1 %bb.2 |
| |
| bb.5.bb35 (landing-pad): |
| liveins: $rax, $rdx |
| |
| EH_LABEL <mcsymbol .Ltmp2> |
| ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| %50:gr32 = MOV32ri 3 |
| $edi = COPY killed %50 |
| %52:gr64 = COPY killed %40 |
| %51:gr64 = COPY killed %39 |
| dead %51:gr64, dead %52:gr64 = STATEPOINT 2882400000, 0, 1, target-flags(x86-plt) @wombat, killed $edi, 2, 0, 2, 2, 2, 97, 2, 0, 2, 2, 2, 0, 2, 43, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 1, 2, 10, 2, 0, 2, 4, 2, 1, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %51, 2, 7, 2, 0, 2, 0, %51, 2, 10, 2, 5, 2, 12, 2, 0, 2, 3, 2, 1, 2, 0, %51, 2, 0, %51, 2, 7, 2, 0, 2, 0, %51, 2, 2, 2, 11, 2, 4, 2, 0, 2, 1, 2, 0, 2, 7, 2, 0, 2, 2, 2, 15, 2, 7, 2, 0, 2, 2, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 10, 2, 21, 2, 96, 2, 0, 2, 9, 2, 1, 2, 0, 2, 4278124286, 2, 0, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %52, 2, 3, killed %6, 2, 3, 2, 4278124286, 2, 7, 2, 0, 2, 7, 2, 0, 2, 0, %52, 2, 0, 2, 12, 2, 51, 2, 0, 2, 3, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 7, 2, 0, 2, 3, %51(tied-def 0), 2, 4278124286, %52(tied-def 1), 2, 0, 2, 3, 0, 0, 1, 1, 2, 2, csr_64, implicit-def $rsp, implicit-def $ssp |
| ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| |
| ... |