@@ -36,10 +36,49 @@ merge2:
36
36
ret i8 addrspace (1 )* %b6
37
37
}
38
38
39
+ define i8 addrspace (1 )* @test2 (i1 %c , i32 %n , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
40
+ ; CHECK-LABEL: @test2(
41
+ ; CHECK-NEXT: entry:
42
+ ; CHECK-NEXT: br label [[LEFT:%.*]]
43
+ ; CHECK: left:
44
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
45
+ ; CHECK: loop:
46
+ ; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B5]], [[LOOP]] ]
47
+ ; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [
48
+ ; CHECK-NEXT: i32 0, label [[LOOP]]
49
+ ; CHECK-NEXT: i32 1, label [[LOOP]]
50
+ ; CHECK-NEXT: i32 2, label [[LEFT]]
51
+ ; CHECK-NEXT: ]
52
+ ; CHECK: merge2:
53
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0
54
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
55
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
56
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
57
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
58
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
59
+ ;
60
+ entry:
61
+ br label %left
62
+
63
+ left:
64
+ br i1 %c , label %loop , label %merge2
65
+
66
+ loop:
67
+ %b5 = phi i8 addrspace (1 )* [ %b2 , %left ], [ %b5 , %loop ], [ %b5 , %loop ]
68
+ switch i32 %n , label %merge2 [ i32 0 , label %loop
69
+ i32 1 , label %loop
70
+ i32 2 , label %left ]
71
+
72
+ merge2:
73
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %left ], [ %b5 , %loop ]
74
+ call void @foo () [ "deopt" () ]
75
+ ret i8 addrspace (1 )* %b6
76
+ }
77
+
39
78
; FIXME: In this test case %b5.base and %b6.base (inserted by RS4GC) are
40
79
; identical to %b5 and %b6 ; correspondingly.
41
- define i8 addrspace (1 )* @test2 (i1 %c , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
42
- ; CHECK-LABEL: @test2 (
80
+ define i8 addrspace (1 )* @test3 (i1 %c , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
81
+ ; CHECK-LABEL: @test3 (
43
82
; CHECK-NEXT: left:
44
83
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
45
84
; CHECK: loop:
@@ -71,3 +110,78 @@ merge2:
71
110
exit:
72
111
ret i8 addrspace (1 )* %b6
73
112
}
113
+
114
+ define i8 addrspace (1 )* @test4 (i1 %c , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
115
+ ; CHECK-LABEL: @test4(
116
+ ; CHECK-NEXT: left:
117
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
118
+ ; CHECK: loop:
119
+ ; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5:%.*]], [[LOOP]] ]
120
+ ; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)*
121
+ ; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)*
122
+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]]
123
+ ; CHECK: merge2:
124
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0
125
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
126
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
127
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
128
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
129
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
130
+ ;
131
+ left:
132
+ br i1 %c , label %loop , label %merge2
133
+
134
+ loop:
135
+ %b3 = phi i8 addrspace (1 )* [ %b2 , %left ], [ %b5 , %loop ]
136
+ %b4 = bitcast i8 addrspace (1 )* %b3 to i32 addrspace (1 )*
137
+ %b5 = bitcast i32 addrspace (1 )* %b4 to i8 addrspace (1 )*
138
+ br i1 %c , label %loop , label %merge2
139
+
140
+ merge2:
141
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %left ], [ %b5 , %loop ]
142
+ call void @foo () [ "deopt" () ]
143
+ ret i8 addrspace (1 )* %b6
144
+ }
145
+
146
+ define i8 addrspace (1 )* @test5 (i1 %c , i32 %n , i8 addrspace (1 )* %b1 , i8 addrspace (1 )* %b2 ) gc "statepoint-example" {
147
+ ; CHECK-LABEL: @test5(
148
+ ; CHECK-NEXT: entry:
149
+ ; CHECK-NEXT: br label [[LEFT:%.*]]
150
+ ; CHECK: left:
151
+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
152
+ ; CHECK: loop:
153
+ ; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5:%.*]], [[LOOP]] ], [ [[B5]], [[LOOP]] ]
154
+ ; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)*
155
+ ; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)*
156
+ ; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [
157
+ ; CHECK-NEXT: i32 0, label [[LOOP]]
158
+ ; CHECK-NEXT: i32 1, label [[LOOP]]
159
+ ; CHECK-NEXT: i32 2, label [[LEFT]]
160
+ ; CHECK-NEXT: ]
161
+ ; CHECK: merge2:
162
+ ; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0
163
+ ; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
164
+ ; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
165
+ ; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
166
+ ; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
167
+ ; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
168
+ ;
169
+ entry:
170
+ br label %left
171
+
172
+ left:
173
+ br i1 %c , label %loop , label %merge2
174
+
175
+ loop:
176
+ %b3 = phi i8 addrspace (1 )* [ %b2 , %left ], [ %b5 , %loop ], [ %b5 , %loop ]
177
+ %b4 = bitcast i8 addrspace (1 )* %b3 to i32 addrspace (1 )*
178
+ %b5 = bitcast i32 addrspace (1 )* %b4 to i8 addrspace (1 )*
179
+ switch i32 %n , label %merge2 [ i32 0 , label %loop
180
+ i32 1 , label %loop
181
+ i32 2 , label %left ]
182
+
183
+ merge2:
184
+ %b6 = phi i8 addrspace (1 )* [ %b1 , %left ], [ %b5 , %loop ]
185
+ call void @foo () [ "deopt" () ]
186
+ ret i8 addrspace (1 )* %b6
187
+ }
0 commit comments