blob: 21e9bc7b7f4e871e4718873ea7523e44aa739344 [file] [log] [blame]
Dan Gohman18800922009-09-11 18:01:28 +00001; RUN: opt < %s -simplifycfg -S > %t
Chandler Carrutha5a29f92012-07-02 12:47:22 +00002; RUN: not grep "^BB.tomerge" %t
Hyojin Sung4673f102016-03-29 04:08:57 +00003; RUN: grep "^BB.nomerge" %t | count 4
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +00004
5; ModuleID = '<stdin>'
6declare i1 @foo()
7
8declare i1 @bar(i32)
9
10; This function can't be merged
11define void @a() {
12entry:
13 br label %BB.nomerge
14
15BB.nomerge: ; preds = %Common, %entry
16 ; This phi has a conflicting value (0) with below phi (2), so blocks
17 ; can't be merged.
18 %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1]
19 br label %Succ
20
21Succ: ; preds = %Common, %BB.nomerge
22 %b = phi i32 [ %a, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0]
23 %conde = call i1 @foo( ) ; <i1> [#uses=1]
24 br i1 %conde, label %Common, label %Exit
25
26Common: ; preds = %Succ
27 %cond = call i1 @foo( ) ; <i1> [#uses=1]
28 br i1 %cond, label %BB.nomerge, label %Succ
29
30Exit: ; preds = %Succ
31 ret void
32}
33
34; This function can't be merged
35define void @b() {
36entry:
37 br label %BB.nomerge
38
39BB.nomerge: ; preds = %Common, %entry
40 br label %Succ
41
42Succ: ; preds = %Common, %BB.nomerge
43 ; This phi has confliction values for Common and (through BB) Common,
44 ; blocks can't be merged
45 %b = phi i32 [ 1, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0]
46 %conde = call i1 @foo( ) ; <i1> [#uses=1]
47 br i1 %conde, label %Common, label %Exit
48
49Common: ; preds = %Succ
50 %cond = call i1 @foo( ) ; <i1> [#uses=1]
51 br i1 %cond, label %BB.nomerge, label %Succ
52
53Exit: ; preds = %Succ
54 ret void
55}
56
Hyojin Sung4673f102016-03-29 04:08:57 +000057; This function can't be merged (for keeping canonical loop structures)
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000058define void @c() {
59entry:
Hyojin Sung4673f102016-03-29 04:08:57 +000060 br label %BB.nomerge
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000061
Hyojin Sung4673f102016-03-29 04:08:57 +000062BB.nomerge: ; preds = %Common, %entry
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000063 br label %Succ
64
65Succ: ; preds = %Common, %BB.tomerge, %Pre-Exit
66 ; This phi has identical values for Common and (through BB) Common,
67 ; blocks can't be merged
Hyojin Sung4673f102016-03-29 04:08:57 +000068 %b = phi i32 [ 1, %BB.nomerge ], [ 1, %Common ], [ 2, %Pre-Exit ]
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000069 %conde = call i1 @foo( ) ; <i1> [#uses=1]
70 br i1 %conde, label %Common, label %Pre-Exit
71
72Common: ; preds = %Succ
73 %cond = call i1 @foo( ) ; <i1> [#uses=1]
Hyojin Sung4673f102016-03-29 04:08:57 +000074 br i1 %cond, label %BB.nomerge, label %Succ
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000075
76Pre-Exit: ; preds = %Succ
77 ; This adds a backedge, so the %b phi node gets a third branch and is
78 ; not completely trivial
79 %cond2 = call i1 @foo( ) ; <i1> [#uses=1]
80 br i1 %cond2, label %Succ, label %Exit
81
82Exit: ; preds = %Pre-Exit
83 ret void
84}
85
Hyojin Sung4673f102016-03-29 04:08:57 +000086; This function can't be merged (for keeping canonical loop structures)
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000087define void @d() {
88entry:
Hyojin Sung4673f102016-03-29 04:08:57 +000089 br label %BB.nomerge
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000090
Hyojin Sung4673f102016-03-29 04:08:57 +000091BB.nomerge: ; preds = %Common, %entry
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000092 ; This phi has a matching value (0) with below phi (0), so blocks
93 ; can be merged.
94 %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1]
95 br label %Succ
96
97Succ: ; preds = %Common, %BB.tomerge
Hyojin Sung4673f102016-03-29 04:08:57 +000098 %b = phi i32 [ %a, %BB.nomerge ], [ 0, %Common ] ; <i32> [#uses=0]
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +000099 %conde = call i1 @foo( ) ; <i1> [#uses=1]
100 br i1 %conde, label %Common, label %Exit
101
102Common: ; preds = %Succ
103 %cond = call i1 @foo( ) ; <i1> [#uses=1]
Hyojin Sung4673f102016-03-29 04:08:57 +0000104 br i1 %cond, label %BB.nomerge, label %Succ
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000105
106Exit: ; preds = %Succ
107 ret void
108}
109
110; This function can be merged
111define void @e() {
112entry:
Hyojin Sung4673f102016-03-29 04:08:57 +0000113 br label %Succ
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000114
Hyojin Sung4673f102016-03-29 04:08:57 +0000115Succ: ; preds = %Use, %entry
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000116 ; This phi is used somewhere else than Succ, but this should not prevent
117 ; merging this block
118 %a = phi i32 [ 1, %entry ], [ 0, %Use ] ; <i32> [#uses=1]
Hyojin Sung4673f102016-03-29 04:08:57 +0000119 br label %BB.tomerge
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000120
Hyojin Sung4673f102016-03-29 04:08:57 +0000121BB.tomerge: ; preds = %BB.tomerge
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000122 %conde = call i1 @foo( ) ; <i1> [#uses=1]
123 br i1 %conde, label %Use, label %Exit
124
125Use: ; preds = %Succ
126 %cond = call i1 @bar( i32 %a ) ; <i1> [#uses=1]
Hyojin Sung4673f102016-03-29 04:08:57 +0000127 br i1 %cond, label %Succ, label %Exit
Matthijs Kooijmanaef2b812008-05-23 09:09:41 +0000128
129Exit: ; preds = %Use, %Succ
130 ret void
131}