blob: b668594c95bc7196dcbfde93a864231d82b284c2 [file] [log] [blame]
Sanjoy Das04071082016-01-29 00:28:57 +00001; RUN: opt < %s -rewrite-statepoints-for-gc -S 2>&1 | FileCheck %s
Igor Laevskye0317182015-05-19 15:59:05 +00002
Sanjoy Das04071082016-01-29 00:28:57 +00003
4declare void @use_obj16(i16 addrspace(1)*) "gc-leaf-function"
5declare void @use_obj32(i32 addrspace(1)*) "gc-leaf-function"
6declare void @use_obj64(i64 addrspace(1)*) "gc-leaf-function"
7
Igor Laevskye0317182015-05-19 15:59:05 +00008declare void @do_safepoint()
9
Sanjoy Das04071082016-01-29 00:28:57 +000010define void @test_gep_const(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000011; CHECK-LABEL: test_gep_const
12entry:
13 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15
Sanjoy Das04071082016-01-29 00:28:57 +000014 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000015 call void @use_obj32(i32 addrspace(1)* %base)
16 call void @use_obj32(i32 addrspace(1)* %ptr)
17 ret void
18}
19
Sanjoy Das04071082016-01-29 00:28:57 +000020define void @test_gep_idx(i32 addrspace(1)* %base, i32 %idx) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000021; CHECK-LABEL: test_gep_idx
22entry:
23 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 %idx
Sanjoy Das04071082016-01-29 00:28:57 +000024 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000025 call void @use_obj32(i32 addrspace(1)* %base)
26 call void @use_obj32(i32 addrspace(1)* %ptr)
27 ret void
28}
29
Sanjoy Das04071082016-01-29 00:28:57 +000030define void @test_bitcast(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000031; CHECK-LABEL: test_bitcast
32entry:
33 %ptr = bitcast i32 addrspace(1)* %base to i64 addrspace(1)*
Sanjoy Das04071082016-01-29 00:28:57 +000034 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000035 call void @use_obj32(i32 addrspace(1)* %base)
36 call void @use_obj64(i64 addrspace(1)* %ptr)
37 ret void
38}
39
Sanjoy Das04071082016-01-29 00:28:57 +000040define void @test_bitcast_gep(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000041; CHECK-LABEL: test_bitcast_gep
42entry:
43 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +000044 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
Sanjoy Das04071082016-01-29 00:28:57 +000045 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000046 call void @use_obj32(i32 addrspace(1)* %base)
47 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
48 ret void
49}
50
Sanjoy Das04071082016-01-29 00:28:57 +000051define void @test_intersecting_chains(i32 addrspace(1)* %base, i32 %idx) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000052; CHECK-LABEL: test_intersecting_chains
53entry:
54 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +000055 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
Igor Laevskye0317182015-05-19 15:59:05 +000056 %ptr.cast2 = bitcast i32 addrspace(1)* %ptr.gep to i16 addrspace(1)*
Sanjoy Das04071082016-01-29 00:28:57 +000057 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000058 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
59 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
60 ret void
61}
62
Sanjoy Das04071082016-01-29 00:28:57 +000063define void @test_cost_threshold(i32 addrspace(1)* %base, i32 %idx1, i32 %idx2, i32 %idx3) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000064; CHECK-LABEL: test_cost_threshold
65entry:
66 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +000067 %ptr.gep2 = getelementptr i32, i32 addrspace(1)* %ptr.gep, i32 %idx1
Igor Laevskye0317182015-05-19 15:59:05 +000068 %ptr.gep3 = getelementptr i32, i32 addrspace(1)* %ptr.gep2, i32 %idx2
Igor Laevskye0317182015-05-19 15:59:05 +000069 %ptr.gep4 = getelementptr i32, i32 addrspace(1)* %ptr.gep3, i32 %idx3
Igor Laevskye0317182015-05-19 15:59:05 +000070 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep4 to i64 addrspace(1)*
Sanjoy Das04071082016-01-29 00:28:57 +000071 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000072 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
73 ret void
74}
75
Sanjoy Das04071082016-01-29 00:28:57 +000076define void @test_two_derived(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000077; CHECK-LABEL: test_two_derived
78entry:
79 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15
80 %ptr2 = getelementptr i32, i32 addrspace(1)* %base, i32 12
Sanjoy Das04071082016-01-29 00:28:57 +000081 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000082 call void @use_obj32(i32 addrspace(1)* %ptr)
83 call void @use_obj32(i32 addrspace(1)* %ptr2)
84 ret void
85}
86
Sanjoy Das04071082016-01-29 00:28:57 +000087define void @test_gep_smallint_array([3 x i32] addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +000088; CHECK-LABEL: test_gep_smallint_array
89entry:
90 %ptr = getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 2
Sanjoy Das04071082016-01-29 00:28:57 +000091 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +000092 call void @use_obj32(i32 addrspace(1)* %ptr)
93 ret void
94}
95
96declare i32 @fake_personality_function()
97
Sanjoy Das04071082016-01-29 00:28:57 +000098define void @test_invoke(i32 addrspace(1)* %base) gc "statepoint-example" personality i32 ()* @fake_personality_function {
Igor Laevskye0317182015-05-19 15:59:05 +000099; CHECK-LABEL: test_invoke
100entry:
101 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +0000102 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
Igor Laevskye0317182015-05-19 15:59:05 +0000103 %ptr.cast2 = bitcast i32 addrspace(1)* %ptr.gep to i16 addrspace(1)*
Sanjoy Das04071082016-01-29 00:28:57 +0000104 invoke void @do_safepoint() [ "deopt"() ]
105 to label %normal unwind label %exception
Igor Laevskye0317182015-05-19 15:59:05 +0000106
Sanjoy Das04071082016-01-29 00:28:57 +0000107normal: ; preds = %entry
Igor Laevskye0317182015-05-19 15:59:05 +0000108 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
109 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
110 ret void
111
Sanjoy Das04071082016-01-29 00:28:57 +0000112exception: ; preds = %entry
Chen Lid71999e2015-12-26 07:54:32 +0000113 %landing_pad4 = landingpad token
Igor Laevskye0317182015-05-19 15:59:05 +0000114 cleanup
Igor Laevskye0317182015-05-19 15:59:05 +0000115 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
116 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
117 ret void
118}
119
Sanjoy Das04071082016-01-29 00:28:57 +0000120define void @test_loop(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +0000121; CHECK-LABEL: test_loop
122entry:
123 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +0000124 br label %loop
125
Sanjoy Das04071082016-01-29 00:28:57 +0000126loop: ; preds = %loop, %entry
Igor Laevskye0317182015-05-19 15:59:05 +0000127 call void @use_obj32(i32 addrspace(1)* %ptr.gep)
Sanjoy Das04071082016-01-29 00:28:57 +0000128 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +0000129 br label %loop
130}
131
Sanjoy Das04071082016-01-29 00:28:57 +0000132define void @test_too_long(i32 addrspace(1)* %base) gc "statepoint-example" {
Igor Laevskye0317182015-05-19 15:59:05 +0000133; CHECK-LABEL: test_too_long
134entry:
Sanjoy Das04071082016-01-29 00:28:57 +0000135 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
136 %ptr.gep1 = getelementptr i32, i32 addrspace(1)* %ptr.gep, i32 15
137 %ptr.gep2 = getelementptr i32, i32 addrspace(1)* %ptr.gep1, i32 15
138 %ptr.gep3 = getelementptr i32, i32 addrspace(1)* %ptr.gep2, i32 15
139 %ptr.gep4 = getelementptr i32, i32 addrspace(1)* %ptr.gep3, i32 15
140 %ptr.gep5 = getelementptr i32, i32 addrspace(1)* %ptr.gep4, i32 15
141 %ptr.gep6 = getelementptr i32, i32 addrspace(1)* %ptr.gep5, i32 15
142 %ptr.gep7 = getelementptr i32, i32 addrspace(1)* %ptr.gep6, i32 15
143 %ptr.gep8 = getelementptr i32, i32 addrspace(1)* %ptr.gep7, i32 15
144 %ptr.gep9 = getelementptr i32, i32 addrspace(1)* %ptr.gep8, i32 15
Igor Laevskye0317182015-05-19 15:59:05 +0000145 %ptr.gep10 = getelementptr i32, i32 addrspace(1)* %ptr.gep9, i32 15
146 %ptr.gep11 = getelementptr i32, i32 addrspace(1)* %ptr.gep10, i32 15
Sanjoy Das04071082016-01-29 00:28:57 +0000147 call void @do_safepoint() [ "deopt"() ]
Igor Laevskye0317182015-05-19 15:59:05 +0000148 call void @use_obj32(i32 addrspace(1)* %ptr.gep11)
149 ret void
150}