Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MIR Statepoint refactoring. Part 1: Basic MI level changes.
Basic support for variadic-def MIR Statepoint: - Change TableGen STATEPOINT description to variadic out list (For self-documentation purpose; by itself it does not affect code generation in any way). - Update StatepointOpers helper class to handle variadic defs. - Update MachineVerifier to properly handle them, too. With this change, new Statepoint instruction can be passed through backend (excluding ISEL) without errors. Full change set is available at D81603. Reviewed By: reames Differential Revision: https://reviews.llvm.org/D81645
- Loading branch information
1 parent
d909764
commit ef658eb
Showing
4 changed files
with
171 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
# NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
# RUN: llc -o - %s -start-after=finalize-isel | FileCheck %s | ||
|
||
--- | | ||
; ModuleID = 'test/CodeGen/X86/statepoint-vreg.ll' | ||
source_filename = "test/CodeGen/X86/statepoint-vreg.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-pc-linux-gnu" | ||
|
||
declare void @bar() | ||
|
||
define i32 @test_basic(i32 addrspace(1)* %obj1, i32 addrspace(1)* %obj2) gc "statepoint-example" { | ||
; CHECK-LABEL: test_basic: | ||
; CHECK: # %bb.0: | ||
; CHECK-NEXT: pushq %r14 | ||
; CHECK-NEXT: .cfi_def_cfa_offset 16 | ||
; CHECK-NEXT: pushq %rbx | ||
; CHECK-NEXT: .cfi_def_cfa_offset 24 | ||
; CHECK-NEXT: pushq %rax | ||
; CHECK-NEXT: .cfi_def_cfa_offset 32 | ||
; CHECK-NEXT: .cfi_offset %rbx, -24 | ||
; CHECK-NEXT: .cfi_offset %r14, -16 | ||
; CHECK-NEXT: movq %rsi, %r14 | ||
; CHECK-NEXT: movq %rdi, %rbx | ||
; CHECK-NEXT: callq bar | ||
; CHECK-NEXT: .Ltmp0: | ||
; CHECK-NEXT: movl (%rbx), %eax | ||
; CHECK-NEXT: addl (%r14), %eax | ||
; CHECK-NEXT: addq $8, %rsp | ||
; CHECK-NEXT: .cfi_def_cfa_offset 24 | ||
; CHECK-NEXT: popq %rbx | ||
; CHECK-NEXT: .cfi_def_cfa_offset 16 | ||
; CHECK-NEXT: popq %r14 | ||
; CHECK-NEXT: .cfi_def_cfa_offset 8 | ||
; CHECK-NEXT: retq | ||
%token = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @bar, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(i32 addrspace(1)* %obj1, i32 addrspace(1)* %obj2) ] | ||
%rel1 = call coldcc i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %token, i32 0, i32 0) ; (%obj1, %obj1) | ||
%rel2 = call coldcc i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %token, i32 1, i32 1) ; (%obj2, %obj2) | ||
%a = load i32, i32 addrspace(1)* %rel1, align 4 | ||
%b = load i32, i32 addrspace(1)* %rel2, align 4 | ||
%c = add i32 %a, %b | ||
ret i32 %c | ||
} | ||
|
||
; CHECK-LABEL: __LLVM_StackMaps: | ||
; CHECK-NEXT: .byte 3 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 1 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .long 1 | ||
; CHECK-NEXT: .quad test_basic | ||
; CHECK-NEXT: .quad 24 | ||
; CHECK-NEXT: .quad 1 | ||
; CHECK-NEXT: .quad 2882400000 | ||
; CHECK-NEXT: .long .Ltmp0-test_basic | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .byte 4 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 4 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 4 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 1 | ||
; CHECK-NEXT: .byte 4 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 1 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 14 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 1 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 14 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 1 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 3 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .byte 1 | ||
; CHECK-NEXT: .byte 0 | ||
; CHECK-NEXT: .short 8 | ||
; CHECK-NEXT: .short 3 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .long 0 | ||
; CHECK-NEXT: .p2align 3 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .short 0 | ||
; CHECK-NEXT: .p2align 3 | ||
|
||
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 immarg, i32 immarg, void ()*, i32 immarg, i32 immarg, ...) | ||
|
||
; Function Attrs: nounwind readonly | ||
declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32 immarg, i32 immarg) #0 | ||
|
||
attributes #0 = { nounwind readonly } | ||
attributes #1 = { nounwind } | ||
|
||
... | ||
--- | ||
name: test_basic | ||
alignment: 16 | ||
selected: false | ||
failedISel: false | ||
tracksRegLiveness: true | ||
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: gr32, preferred-register: '' } | ||
- { id: 5, class: gr32, preferred-register: '' } | ||
liveins: | ||
- { reg: '$rdi', virtual-reg: '%0' } | ||
- { reg: '$rsi', virtual-reg: '%1' } | ||
fixedStack: [] | ||
stack: [] | ||
callSites: [] | ||
constants: [] | ||
machineFunctionInfo: {} | ||
body: | | ||
bb.0 (%ir-block.0): | ||
liveins: $rdi, $rsi | ||
%1:gr64 = COPY $rsi | ||
%0:gr64 = COPY $rdi | ||
ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp | ||
%2:gr64, %3:gr64 = STATEPOINT 2882400000, 0, 0, @bar, 2, 0, 2, 0, 2, 1, 2, 0, %1, %1(tied-def 0), %0, %0(tied-def 1), 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 | ||
%4:gr32 = MOV32rm killed %3, 1, $noreg, 0, $noreg :: (load 4 from %ir.rel1, addrspace 1) | ||
%5:gr32 = ADD32rm %4, killed %2, 1, $noreg, 0, $noreg, implicit-def dead $eflags :: (load 4 from %ir.rel2, addrspace 1) | ||
$eax = COPY %5 | ||
RET 0, $eax | ||
... |