Skip to content

Commit 6f8feeb

Browse files
committed
[Test] Add more tests showing duplicate PHIs generated by RS4GC (NFC)
1 parent f8cdbeb commit 6f8feeb

File tree

1 file changed

+116
-2
lines changed

1 file changed

+116
-2
lines changed

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

Lines changed: 116 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,49 @@ merge2:
3636
ret i8 addrspace(1)* %b6
3737
}
3838

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+
3978
; FIXME: In this test case %b5.base and %b6.base (inserted by RS4GC) are
4079
; 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(
4382
; CHECK-NEXT: left:
4483
; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
4584
; CHECK: loop:
@@ -71,3 +110,78 @@ merge2:
71110
exit:
72111
ret i8 addrspace(1)* %b6
73112
}
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

Comments
 (0)