From c888abcfc1135c11e423eb9737cd8a0368d9a81b Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Tue, 12 Feb 2019 00:01:39 +0000 Subject: [PATCH] [Tests] Fill out a few tests around gc relocation uniquing git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353773 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/CodeGen/X86/statepoint-uniqueing.ll | 39 ++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/test/CodeGen/X86/statepoint-uniqueing.ll b/test/CodeGen/X86/statepoint-uniqueing.ll index 337bc7fcc33..ae7c076ab12 100644 --- a/test/CodeGen/X86/statepoint-uniqueing.ll +++ b/test/CodeGen/X86/statepoint-uniqueing.ll @@ -1,9 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -verify-machineinstrs < %s | FileCheck %s -; Checks for a crash we had when two gc.relocate calls would -; relocating identical values - target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-linux-gnu" @@ -13,6 +10,7 @@ declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i declare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) #3 declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) #3 +;; Two gc.relocates of the same input, should require only a single spill/fill define void @test_gcrelocate_uniqueing(i32 addrspace(1)* %ptr) gc "statepoint-example" { ; CHECK-LABEL: test_gcrelocate_uniqueing: ; CHECK: # %bb.0: @@ -36,6 +34,7 @@ define void @test_gcrelocate_uniqueing(i32 addrspace(1)* %ptr) gc "statepoint-ex ret void } +;; Two gc.relocates of a bitcasted pointer should only require a single spill/fill define void @test_gcptr_uniqueing(i32 addrspace(1)* %ptr) gc "statepoint-example" { ; CHECK-LABEL: test_gcptr_uniqueing: ; CHECK: # %bb.0: @@ -59,3 +58,37 @@ define void @test_gcptr_uniqueing(i32 addrspace(1)* %ptr) gc "statepoint-example call void (...) @use(i32 addrspace(1)* %a, i8 addrspace(1)* %b) ret void } + +;; A GC value is not dead, and does need to be spill (but not filed) if +;; that same value is also in the deopt list. +define void @test_deopt_use(i32 addrspace(1)* %ptr) gc "statepoint-example" { +; CHECK-LABEL: test_deopt_use: +; CHECK: # %bb.0: +; CHECK-NEXT: subq $24, %rsp +; CHECK-NEXT: .cfi_def_cfa_offset 32 +; CHECK-NEXT: movq %rdi, {{[0-9]+}}(%rsp) +; CHECK-NEXT: callq f +; CHECK-NEXT: .Ltmp2: +; CHECK-NEXT: addq $24, %rsp +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: retq + tail call token (i64, i32, void ()*, i32, i32, ...) + @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @f, i32 0, i32 0, i32 0, i32 2, i32 addrspace(1)* %ptr, i32 undef, i32 addrspace(1)* %ptr) + ret void +} + +;; A GC value which is truely unused does not need to spilled or filled. +define void @test_dse(i32 addrspace(1)* %ptr) gc "statepoint-example" { +; CHECK-LABEL: test_dse: +; CHECK: # %bb.0: +; CHECK-NEXT: pushq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: callq f +; CHECK-NEXT: .Ltmp3: +; CHECK-NEXT: popq %rax +; CHECK-NEXT: .cfi_def_cfa_offset 8 +; CHECK-NEXT: retq + tail call token (i64, i32, void ()*, i32, i32, ...) + @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @f, i32 0, i32 0, i32 0, i32 2, i32 undef, i32 undef, i32 addrspace(1)* %ptr) + ret void +} -- 2.40.0