This is an attempt at rebooting https://reviews.llvm.org/D28990 I've included AutoUpgrade changes to modify the data layout to satisfy the compatible layout check. But this does mean alloca, loads, stores, etc in old IR will automatically get this new alignment. This should fix PR46320. Reviewed By: echristo, rnk, tmgross Differential Revision: https://reviews.llvm.org/D86310
130 lines
5.6 KiB
LLVM
130 lines
5.6 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc -O3 < %s | FileCheck %s
|
|
|
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-unknown"
|
|
|
|
; Check that we don't crash on handling of various types of constants
|
|
; (including non-integer constants)
|
|
define void @test_legal_constants() gc "statepoint-example" {
|
|
; CHECK-LABEL: test_legal_constants:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: pushq %rax
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NEXT: callq foo@PLT
|
|
; CHECK-NEXT: .Ltmp0:
|
|
; CHECK-NEXT: popq %rax
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 8
|
|
; CHECK-NEXT: retq
|
|
%statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 2, i32 0, i32 0) #0 [ "deopt" (float 2.0, double 3.0, i8 5, i16 22, i32 8, i64 9, ptr addrspace(1) null) ]
|
|
ret void
|
|
}
|
|
|
|
; Ensure we can allocate and assign values in registers for each type
|
|
define void @test_registers(float %v1, double %v2, i8 %v3, i16 %v4, i32 %v5, i64 %v6, ptr addrspace(1) %v7) gc "statepoint-example" {
|
|
; CHECK-LABEL: test_registers:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: pushq %rax
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 16
|
|
; CHECK-NEXT: movq %r8, (%rsp)
|
|
; CHECK-NEXT: callq foo@PLT
|
|
; CHECK-NEXT: .Ltmp1:
|
|
; CHECK-NEXT: popq %rax
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 8
|
|
; CHECK-NEXT: retq
|
|
%statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 2, i32 0, i32 0) #0 [ "deopt" (float %v1, double %v2, i8 %v3, i16 %v4, i32 %v5, i64 %v6, ptr addrspace(1) %v7) ]
|
|
ret void
|
|
}
|
|
|
|
; For constants which definitely *don't* fit in registers, can we still
|
|
; encode them in the stackmap?
|
|
define void @test_illegal_constants() gc "statepoint-example" {
|
|
; CHECK-LABEL: test_illegal_constants:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: subq $248, %rsp
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 256
|
|
; CHECK-NEXT: xorps %xmm0, %xmm0
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $144, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $144, (%rsp)
|
|
; CHECK-NEXT: movq $0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $144, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq $144, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: callq foo@PLT
|
|
; CHECK-NEXT: .Ltmp2:
|
|
; CHECK-NEXT: addq $248, %rsp
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 8
|
|
; CHECK-NEXT: retq
|
|
%statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 2, i32 0, i32 0) #0 [ "deopt" (i128 144, i256 144, i512 144, i1024 144) ]
|
|
ret void
|
|
}
|
|
|
|
; Ensure we don't crash w/a value which can't fit in a
|
|
; register, and must be spilled.
|
|
define void @test_illegal_values(i128 %v1, i256 %v2, i512 %v3, i1024 %v4) gc "statepoint-example" {
|
|
; CHECK-LABEL: test_illegal_values:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: subq $248, %rsp
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 256
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm0
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm1
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm2
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm3
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm4
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm5
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm6
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm7
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm8
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm9
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm10
|
|
; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm11
|
|
; CHECK-NEXT: movq %r9, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq %r8, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq %rcx, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq %rdx, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movq %rdi, (%rsp)
|
|
; CHECK-NEXT: movaps %xmm11, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm10, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm9, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm8, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm7, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm6, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm5, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm4, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm3, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm2, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm1, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
|
|
; CHECK-NEXT: callq foo@PLT
|
|
; CHECK-NEXT: .Ltmp3:
|
|
; CHECK-NEXT: addq $248, %rsp
|
|
; CHECK-NEXT: .cfi_def_cfa_offset 8
|
|
; CHECK-NEXT: retq
|
|
%statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 2, i32 0, i32 0) #0 [ "deopt" (i128 %v1, i256 %v2, i512 %v3, i1024 %v4) ]
|
|
ret void
|
|
}
|
|
|
|
|
|
;; TODO: Add a test for illegal register values (i.e. spilling). A
|
|
;; trivial one currently crashes.
|
|
|
|
declare void @foo()
|
|
|
|
declare token @llvm.experimental.gc.statepoint.p0(i64 , i32 , ptr, i32 , i32 , ...)
|
|
|
|
attributes #0 = { "deopt-lowering"="live-in" }
|