blob: 7db883b2412bb28fae8b73b210fd470888dfa30b [file] [log] [blame]
Joseph Tremoulet09af67a2015-09-27 01:47:46 +00001; RUN: opt -S -simplifycfg < %s | FileCheck %s
2
3declare void @Personality()
4declare void @f()
5
6; CHECK-LABEL: define void @test1()
7define void @test1() personality i8* bitcast (void ()* @Personality to i8*) {
8entry:
9 ; CHECK: call void @f()
10 invoke void @f()
11 to label %exit unwind label %unreachable.unwind
12exit:
13 ret void
14unreachable.unwind:
15 cleanuppad []
16 unreachable
17}
18
19; CHECK-LABEL: define void @test2()
20define void @test2() personality i8* bitcast (void ()* @Personality to i8*) {
21entry:
22 invoke void @f()
23 to label %exit unwind label %catch.pad
24catch.pad:
25 ; CHECK: catchpad []
26 ; CHECK-NEXT: to label %catch.body unwind label %catch.end
27 %catch = catchpad []
28 to label %catch.body unwind label %catch.end
29catch.body:
30 ; CHECK: catch.body:
31 ; CHECK-NEXT: call void @f()
32 ; CHECK-NEXT: unreachable
33 call void @f()
34 catchret %catch to label %unreachable
35catch.end:
36 ; CHECK: catch.end:
37 ; CHECK-NEXT: catchendpad unwind to caller
38 catchendpad unwind label %unreachable.unwind
39exit:
40 ret void
41unreachable.unwind:
42 cleanuppad []
43 unreachable
44unreachable:
45 unreachable
46}
47
48; CHECK-LABEL: define void @test3()
49define void @test3() personality i8* bitcast (void ()* @Personality to i8*) {
50entry:
51 invoke void @f()
52 to label %exit unwind label %cleanup.pad
53cleanup.pad:
54 ; CHECK: %cleanup = cleanuppad []
55 ; CHECK-NEXT: call void @f()
56 ; CHECK-NEXT: unreachable
57 %cleanup = cleanuppad []
58 invoke void @f()
59 to label %cleanup.ret unwind label %cleanup.end
60cleanup.ret:
61 ; This cleanupret should be rewritten to unreachable,
62 ; and merged into the pred block.
63 cleanupret %cleanup unwind label %unreachable.unwind
64cleanup.end:
65 ; This cleanupendpad should be rewritten to unreachable,
66 ; causing the invoke to be rewritten to a call.
67 cleanupendpad %cleanup unwind label %unreachable.unwind
68exit:
69 ret void
70unreachable.unwind:
71 cleanuppad []
72 unreachable
73}
74
75; CHECK-LABEL: define void @test4()
76define void @test4() personality i8* bitcast (void ()* @Personality to i8*) {
77entry:
78 invoke void @f()
79 to label %exit unwind label %terminate.pad
80terminate.pad:
81 ; CHECK: terminatepad [] unwind to caller
82 terminatepad [] unwind label %unreachable.unwind
83exit:
84 ret void
85unreachable.unwind:
86 cleanuppad []
87 unreachable
88}