~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to test/Transforms/RewriteStatepointsForGC/deref-pointers.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: opt -S -rewrite-statepoints-for-gc < %s | FileCheck %s
 
2
 
 
3
declare void @foo()
 
4
declare i8 addrspace(1)* @some_function()
 
5
declare void @some_function_consumer(i8 addrspace(1)*)
 
6
declare dereferenceable(4) i8 addrspace(1)* @some_function_ret_deref()
 
7
; CHECK: declare i8 addrspace(1)* @some_function_ret_deref()
 
8
 
 
9
define i8 addrspace(1)* @test_deref_arg(i8 addrspace(1)* dereferenceable(4) %a) gc "statepoint-example" {
 
10
; CHECK: define i8 addrspace(1)* @test_deref_arg(i8 addrspace(1)* %a)
 
11
entry:
 
12
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
13
  ret i8 addrspace(1)* %a
 
14
}
 
15
 
 
16
define i8 addrspace(1)* @test_deref_or_null_arg(i8 addrspace(1)* dereferenceable_or_null(4) %a) gc "statepoint-example" {
 
17
; CHECK: define i8 addrspace(1)* @test_deref_or_null_arg(i8 addrspace(1)* %a)
 
18
entry:
 
19
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
20
  ret i8 addrspace(1)* %a
 
21
}
 
22
 
 
23
define i8 addrspace(1)* @test_deref_retval() gc "statepoint-example" {
 
24
; CHECK-LABEL: @test_deref_retval(
 
25
entry:
 
26
  %a = call dereferenceable(4) i8 addrspace(1)* @some_function()
 
27
; CHECK: %a = call i8 addrspace(1)* @some_function()
 
28
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
29
  ret i8 addrspace(1)* %a
 
30
}
 
31
 
 
32
define i8 addrspace(1)* @test_deref_or_null_retval() gc "statepoint-example" {
 
33
; CHECK-LABEL: @test_deref_or_null_retval(
 
34
entry:
 
35
  %a = call dereferenceable_or_null(4) i8 addrspace(1)* @some_function()
 
36
; CHECK: %a = call i8 addrspace(1)* @some_function()
 
37
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
38
  ret i8 addrspace(1)* %a
 
39
}
 
40
 
 
41
define i8 @test_md(i8 addrspace(1)* %ptr) gc "statepoint-example" {
 
42
; CHECK-LABEL: @test_md(
 
43
 entry:
 
44
; CHECK: %tmp = load i8, i8 addrspace(1)* %ptr, !tbaa !0
 
45
  %tmp = load i8, i8 addrspace(1)* %ptr, !tbaa !0
 
46
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
47
  ret i8 %tmp
 
48
}
 
49
 
 
50
define i8 addrspace(1)* @test_decl_only_attribute(i8 addrspace(1)* %ptr) gc "statepoint-example" {
 
51
; CHECK-LABEL: @test_decl_only_attribute(
 
52
entry:
 
53
; No change here, but the prototype of some_function_ret_deref should have changed.
 
54
; CHECK: call i8 addrspace(1)* @some_function_ret_deref()
 
55
  %a = call i8 addrspace(1)* @some_function_ret_deref()
 
56
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
57
  ret i8 addrspace(1)* %a
 
58
}
 
59
 
 
60
define i8 addrspace(1)* @test_callsite_arg_attribute(i8 addrspace(1)* %ptr) gc "statepoint-example" {
 
61
; CHECK-LABEL: @test_callsite_arg_attribute(
 
62
entry:
 
63
; CHECK: call void @some_function_consumer(i8 addrspace(1)* %ptr)
 
64
  call void @some_function_consumer(i8 addrspace(1)* dereferenceable(4) %ptr)
 
65
  call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
 
66
  ret i8 addrspace(1)* %ptr
 
67
}
 
68
 
 
69
declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
 
70
 
 
71
!0 = !{!1, !1, i64 0, i64 1}
 
72
!1 = !{!"red", !2}
 
73
!2 = !{!"blue"}
 
74
 
 
75
; CHECK: !0 = !{!1, !1, i64 0}
 
76
; CHECK: !1 = !{!"red", !2}
 
77
; CHECK: !2 = !{!"blue"}