llvm-project/llvm/test/CodeGen/X86/selectiondag-stackmap-legalize.ll
Edd Barrett ed8ef65f3d
[stackmaps] Start legalizing live variable operands
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
2022-07-06 14:01:54 +01:00

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
}