Prior to this change, live variable operands passed to `llvm.experimental.stackmap` would be emitted directly to target nodes, meaning that they don't get legalised. The upshot of this is that LLVM may crash when encountering illegally typed target nodes. e.g. https://github.com/llvm/llvm-project/issues/21657 This change introduces a platform independent stackmap DAG node whose operands are legalised as per usual, thus avoiding aforementioned crashes. Note that some kinds of argument are still not handled properly, namely vectors, structs, and large integers, like i128s. These will need to be addressed in follow-up changes. Note also that this does not change the behaviour of `llvm.experimental.patchpoint`. A follow up change will do the same for this intrinsic. Differential review: https://reviews.llvm.org/D125680
153 lines
4.4 KiB
LLVM
153 lines
4.4 KiB
LLVM
; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -enable-patchpoint-liveness=false | FileCheck %s
|
|
|
|
; CHECK-LABEL: .section __LLVM_STACKMAPS,__llvm_stackmaps
|
|
; CHECK-NEXT: __LLVM_StackMaps:
|
|
|
|
; Header
|
|
; CHECK-NEXT: .byte 3
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 0
|
|
|
|
; NumFunctions
|
|
; CHECK-NEXT: .long 1
|
|
; NumConstants
|
|
; CHECK-NEXT: .long 0
|
|
; NumRecords
|
|
; CHECK-NEXT: .long 1
|
|
|
|
; StackSizeRecord[NumFunctions]
|
|
; StackSizeRecord[0]
|
|
; CHECK-NEXT: .quad _main
|
|
; CHECK-NEXT: .quad 24
|
|
; CHECK-NEXT: .quad 1
|
|
|
|
; Constants[NumConstants] (empty)
|
|
|
|
; StkMapRecord[NumRecords]
|
|
; StkMapRecord[0]
|
|
; CHECK-NEXT: .quad 0
|
|
; CHECK-NEXT: .long {{.*}}
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; NumLocations
|
|
; CHECK-NEXT: .short 11
|
|
; Location[NumLocations]
|
|
; Location[0]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 1
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[1]
|
|
; CHECK-NEXT: .byte 4
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 8
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 22
|
|
; Location[2]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 1
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[3]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 16
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[4]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 16
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[5]
|
|
; CHECK-NEXT: .byte 4
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 8
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 66
|
|
; Location[6]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 4
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[7]
|
|
; CHECK-NEXT: .byte 4
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 8
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[8]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 4
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[9]
|
|
; CHECK-NEXT: .byte 4
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 8
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
; Location[10]
|
|
; CHECK-NEXT: .byte 1
|
|
; CHECK-NEXT: .byte 0
|
|
; CHECK-NEXT: .short 1
|
|
; CHECK-NEXT: .short {{.*}}
|
|
; CHECK-NEXT: .short 0
|
|
; CHECK-NEXT: .long 0
|
|
|
|
@p32 = external global i8 addrspace(270)*
|
|
|
|
%struct1 = type {i32, i64}
|
|
%struct2 = type {i1, i1, i1}
|
|
|
|
declare void @llvm.experimental.stackmap(i64, i32, ...)
|
|
|
|
define dso_local i32 @main(i32 %argc, i8** %argv) {
|
|
entry:
|
|
%i1reg = icmp eq i32 %argc, 5
|
|
%i7reg = zext i1 %i1reg to i7
|
|
%halfreg = sitofp i32 %argc to half
|
|
%ptr32 = load i8 addrspace(270)*, i8 addrspace(270)** @p32
|
|
%structreg1 = insertvalue %struct1 zeroinitializer, i32 %argc, 0
|
|
%structreg2 = insertvalue %struct2 zeroinitializer, i1 %i1reg, 0
|
|
call void (i64, i32, ...) @llvm.experimental.stackmap(
|
|
i64 0,
|
|
i32 0,
|
|
i1 %i1reg,
|
|
i7 22,
|
|
i7 %i7reg,
|
|
half 1.0,
|
|
half %halfreg,
|
|
i128 66,
|
|
; FIXME: fix and test vectors. At the moment even legally sized vectors
|
|
; are broken:
|
|
; https://github.com/llvm/llvm-project/issues/55613
|
|
;
|
|
; FIXME: test non-constant i128 once these are fixed:
|
|
; - https://github.com/llvm/llvm-project/issues/26431
|
|
; - https://github.com/llvm/llvm-project/issues/55957
|
|
i8 addrspace(270)* %ptr32,
|
|
; FIXME: The stackmap record generated for structs is incorrect:
|
|
; - https://github.com/llvm/llvm-project/issues/55649
|
|
; - https://github.com/llvm/llvm-project/issues/55957
|
|
%struct1 zeroinitializer,
|
|
%struct1 %structreg1,
|
|
%struct2 zeroinitializer,
|
|
%struct2 %structreg2)
|
|
ret i32 0
|
|
}
|