Skip to content

Commit eaa518c

Browse files
committed
[SimplifyCFG] Add tests for sinking load/store with swifterror operand.
Add test coverage for sinking/hoisting loads/stores with swifterror pointers. Currently this isn't handled correctly by SimplifyCFG and causes a verifier error.
1 parent c23036f commit eaa518c

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; RUN: opt -passes='simplifycfg<sink-common-insts;hoist-common-insts>,verify' -disable-output %s
2+
3+
; XFAIL: *
4+
5+
declare void @clobber1()
6+
declare void @clobber2()
7+
8+
; FIXME: currently simplifycfg tries to sink the stores to the exit block and
9+
; introduces a select for the pointer operand. This is not allowed for
10+
; swifterror pointers.
11+
define swiftcc void @sink_store(ptr %arg, ptr swifterror %arg1, i1 %c) {
12+
bb:
13+
br i1 %c, label %then, label %else
14+
15+
then:
16+
call void @clobber1()
17+
store ptr null, ptr %arg, align 8
18+
br label %exit
19+
20+
else:
21+
call void @clobber2()
22+
store ptr null, ptr %arg1, align 8
23+
br label %exit
24+
25+
exit:
26+
ret void
27+
}
28+
29+
define swiftcc void @hoist_store(ptr %arg, ptr swifterror %arg1, i1 %c) {
30+
bb:
31+
br i1 %c, label %then, label %else
32+
33+
then:
34+
store ptr null, ptr %arg, align 8
35+
call void @clobber1()
36+
br label %exit
37+
38+
else:
39+
store ptr null, ptr %arg1, align 8
40+
call void @clobber2()
41+
br label %exit
42+
43+
exit:
44+
ret void
45+
}
46+
47+
; FIXME: currently simplifycfg tries to sink the load to the exit block and
48+
; introduces a select for the pointer operand. This is not allowed for
49+
; swifterror pointers.
50+
define swiftcc ptr @sink_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
51+
bb:
52+
br i1 %c, label %then, label %else
53+
54+
then:
55+
call void @clobber1()
56+
%l1 = load ptr, ptr %arg, align 8
57+
br label %exit
58+
59+
else:
60+
call void @clobber2()
61+
%l2 = load ptr, ptr %arg1, align 8
62+
br label %exit
63+
64+
exit:
65+
%p = phi ptr [ %l1, %then ], [ %l2, %else ]
66+
ret ptr %p
67+
}
68+
define swiftcc ptr @hoist_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
69+
bb:
70+
br i1 %c, label %then, label %else
71+
72+
then:
73+
%l1 = load ptr, ptr %arg, align 8
74+
call void @clobber1()
75+
br label %exit
76+
77+
else:
78+
%l2 = load ptr, ptr %arg1, align 8
79+
call void @clobber2()
80+
br label %exit
81+
82+
exit:
83+
%p = phi ptr [ %l1, %then ], [ %l2, %else ]
84+
ret ptr %p
85+
}

0 commit comments

Comments
 (0)