Skip to content

Commit 084ad1e

Browse files
committed
[Test] Add more tests showing duplicate PHIs generated by RS4GC (NFC)
This adds more tests with derived pointers.
1 parent dbe6d85 commit 084ad1e

File tree

1 file changed

+113
-1
lines changed

1 file changed

+113
-1
lines changed

llvm/test/Transforms/RewriteStatepointsForGC/base-pointers-14.ll

Lines changed: 113 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,121 @@ merge2:
143143
ret i8 addrspace(1)* %b6
144144
}
145145

146-
define i8 addrspace(1)* @test5(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
146+
define i8 addrspace(1)* @test5(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
147147
; CHECK-LABEL: @test5(
148148
; CHECK-NEXT: entry:
149+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
150+
; CHECK: loop:
151+
; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B5:%.*]], [[LEFT:%.*]] ]
152+
; CHECK-NEXT: [[B4:%.*]] = addrspacecast i8 addrspace(1)* [[B3]] to i8*
153+
; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
154+
; CHECK: left:
155+
; CHECK-NEXT: [[B5]] = addrspacecast i8* [[B4]] to i8 addrspace(1)*
156+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
157+
; CHECK: merge2:
158+
; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0
159+
; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B5]], [[LEFT]] ]
160+
; 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]]) ]
161+
; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
162+
; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
163+
; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
164+
;
165+
entry:
166+
br i1 %c1, label %loop, label %merge2
167+
168+
loop:
169+
%b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b5, %left ]
170+
%b4 = addrspacecast i8 addrspace(1)* %b3 to i8*
171+
br i1 %c1, label %left, label %merge2
172+
173+
left:
174+
%b5 = addrspacecast i8* %b4 to i8 addrspace(1)*
175+
br i1 %c2, label %loop, label %merge2
176+
177+
merge2:
178+
%b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b5, %left ]
179+
call void @foo() [ "deopt"() ]
180+
ret i8 addrspace(1)* %b6
181+
}
182+
183+
define i8 addrspace(1)* @test6(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
184+
; CHECK-LABEL: @test6(
185+
; CHECK-NEXT: entry:
186+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
187+
; CHECK: loop:
188+
; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B3]], [[LEFT:%.*]] ]
189+
; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
190+
; CHECK: left:
191+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
192+
; CHECK: merge2:
193+
; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0
194+
; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B3]], [[LEFT]] ]
195+
; 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]]) ]
196+
; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
197+
; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
198+
; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
199+
;
200+
entry:
201+
br i1 %c1, label %loop, label %merge2
202+
203+
loop:
204+
%b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ]
205+
br i1 %c1, label %left, label %merge2
206+
207+
left:
208+
%b4 = phi i8 addrspace(1)* [ %b3, %loop ]
209+
br i1 %c2, label %loop, label %merge2
210+
211+
merge2:
212+
%b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ]
213+
call void @foo() [ "deopt"() ]
214+
ret i8 addrspace(1)* %b6
215+
}
216+
217+
declare i8 addrspace(1)* @returned_arg(i8 addrspace(1)* returned %p)
218+
219+
define i8 addrspace(1)* @test7(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
220+
; CHECK-LABEL: @test7(
221+
; CHECK-NEXT: entry:
222+
; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
223+
; CHECK: loop:
224+
; CHECK-NEXT: [[B3_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B41:%.*]], [[LEFT:%.*]] ], !is_base_value !0
225+
; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[ENTRY]] ], [ [[B41]], [[LEFT]] ]
226+
; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
227+
; CHECK: left:
228+
; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, i8 addrspace(1)* (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i8p1i8f(i64 2882400000, i32 0, i8 addrspace(1)* (i8 addrspace(1)*)* elementtype(i8 addrspace(1)* (i8 addrspace(1)*)) @returned_arg, i32 1, i32 0, i8 addrspace(1)* [[B3]], i32 0, i32 0) [ "gc-live"(i8 addrspace(1)* [[B3_BASE]], i8 addrspace(1)* [[B3]]) ]
229+
; CHECK-NEXT: [[B41]] = call i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token [[STATEPOINT_TOKEN]])
230+
; CHECK-NEXT: [[B3_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
231+
; CHECK-NEXT: [[B3_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1)
232+
; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
233+
; CHECK: merge2:
234+
; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3_BASE]], [[LOOP]] ], [ [[B41]], [[LEFT]] ], !is_base_value !0
235+
; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ]
236+
; CHECK-NEXT: [[STATEPOINT_TOKEN2:%.*]] = 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]]) ]
237+
; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 0)
238+
; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 1)
239+
; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]]
240+
;
241+
entry:
242+
br i1 %c1, label %loop, label %merge2
243+
244+
loop:
245+
%b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ]
246+
br i1 %c1, label %left, label %merge2
247+
248+
left:
249+
%b4 = call i8 addrspace(1)* @returned_arg(i8 addrspace(1)* %b3)
250+
br i1 %c2, label %loop, label %merge2
251+
252+
merge2:
253+
%b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ]
254+
call void @foo() [ "deopt"() ]
255+
ret i8 addrspace(1)* %b6
256+
}
257+
258+
define i8 addrspace(1)* @test8(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
259+
; CHECK-LABEL: @test8(
260+
; CHECK-NEXT: entry:
149261
; CHECK-NEXT: br label [[LEFT:%.*]]
150262
; CHECK: left:
151263
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]

0 commit comments

Comments
 (0)