Skip to content

Commit 9f5f917

Browse files
committed
[NFC][SimplifyCFG] Add basic test for tail-merging resume function terminators
1 parent beebe5a commit 9f5f917

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -sink-common-insts -S < %s | FileCheck %s
3+
4+
; Test that we tail merge resume blocks and phi operands properly.
5+
6+
declare void @foo()
7+
declare void @bar()
8+
declare void @baz()
9+
declare void @qux()
10+
declare void @quux()
11+
declare void @quuz()
12+
13+
define void @merge_simple(i1 %cond) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
14+
; CHECK-LABEL: @merge_simple(
15+
; CHECK-NEXT: invoke void @foo()
16+
; CHECK-NEXT: to label [[INVOKE_CONT:%.*]] unwind label [[LPAD:%.*]]
17+
; CHECK: invoke.cont:
18+
; CHECK-NEXT: invoke void @bar()
19+
; CHECK-NEXT: to label [[INVOKE_CONT2:%.*]] unwind label [[LPAD2:%.*]]
20+
; CHECK: invoke.cont2:
21+
; CHECK-NEXT: ret void
22+
; CHECK: lpad:
23+
; CHECK-NEXT: [[LP:%.*]] = landingpad { i8*, i32 }
24+
; CHECK-NEXT: cleanup
25+
; CHECK-NEXT: call void @baz()
26+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[RESUME0:%.*]], label [[RESUME1:%.*]]
27+
; CHECK: lpad2:
28+
; CHECK-NEXT: [[LP2:%.*]] = landingpad { i8*, i32 }
29+
; CHECK-NEXT: cleanup
30+
; CHECK-NEXT: call void @quuz()
31+
; CHECK-NEXT: resume { i8*, i32 } [[LP2]]
32+
; CHECK: resume0:
33+
; CHECK-NEXT: call void @qux()
34+
; CHECK-NEXT: resume { i8*, i32 } [[LP]]
35+
; CHECK: resume1:
36+
; CHECK-NEXT: call void @quux()
37+
; CHECK-NEXT: resume { i8*, i32 } [[LP]]
38+
;
39+
invoke void @foo() to label %invoke.cont unwind label %lpad
40+
41+
invoke.cont:
42+
invoke void @bar()to label %invoke.cont2 unwind label %lpad2
43+
ret void
44+
45+
invoke.cont2:
46+
ret void
47+
48+
lpad:
49+
%lp = landingpad { i8*, i32 } cleanup
50+
call void @baz()
51+
br i1 %cond, label %resume0, label %resume1
52+
53+
lpad2:
54+
%lp2 = landingpad { i8*, i32 } cleanup
55+
call void @quuz()
56+
resume { i8*, i32 } %lp2
57+
58+
resume0:
59+
call void @qux()
60+
resume { i8*, i32 } %lp
61+
62+
resume1:
63+
call void @quux()
64+
resume { i8*, i32 } %lp
65+
}
66+
67+
declare dso_local i32 @__gxx_personality_v0(...)

0 commit comments

Comments
 (0)