• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -ipsccp -S | FileCheck %s
2
3define internal i32 @f1(i32 %x) {
4; CHECK-LABEL: define internal i32 @f1(
5; CHECK-NEXT:    ret i32 undef
6;
7  %cmp = icmp sgt i32 %x, 300
8  %res = select i1 %cmp, i32 1, i32 2
9  ret i32 %res
10}
11
12; %res is a constant range [0, 2) from a PHI node.
13define i32 @caller1(i1 %cmp) {
14; CHECK-LABEL: define i32 @caller1(
15; CHECK-LABEL: entry:
16; CHECK-NEXT:    br i1 %cmp, label %if.true, label %end
17
18; CHECK-LABEL: if.true:
19; CHECK-NEXT:    br label %end
20
21; CHECK-LABEL: end:
22; CHECK-NEXT:    %res = phi i32 [ 0, %entry ], [ 1, %if.true ]
23; CHECK-NEXT:    %call1 = tail call i32 @f1(i32 %res)
24; CHECK-NEXT:    ret i32 2
25;
26entry:
27  br i1 %cmp, label %if.true, label %end
28
29if.true:
30  br label %end
31
32end:
33  %res = phi i32 [ 0, %entry], [ 1, %if.true ]
34  %call1 = tail call i32 @f1(i32 %res)
35  ret i32 %call1
36}
37
38define internal i32 @f2(i32 %x, i32 %y, i32 %z, i1 %cmp.1, i1 %cmp.2) {
39; CHECK-LABEL: define internal i32 @f2(
40; CHECK-LABEL: entry:
41; CHECK-NEXT:    br i1 %cmp.1, label %if.true.1, label %end
42
43; CHECK-LABEL: if.true.1:
44; CHECK-NEXT:    br i1 %cmp.2, label %if.true.2, label %end
45
46; CHECK-LABEL: if.true.2:
47; CHECK-NEXT:    br label %end
48
49; CHECK-LABEL: end:
50; CHECK-NEXT:    %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ], [ %z, %if.true.2 ]
51; CHECK-NEXT:    %c.1 = icmp sgt i32 %p, 5
52; CHECK-NEXT:    %c.2 = icmp eq i32 %p, 0
53; CHECK-NEXT:    %c.3 = icmp slt i32 %p, 0
54; CHECK-NEXT:    %v.1 = select i1 %c.1, i32 10, i32 100
55; CHECK-NEXT:    %v.2 = select i1 %c.2, i32 20, i32 200
56; CHECK-NEXT:    %v.3 = select i1 %c.3, i32 30, i32 300
57; CHECK-NEXT:    %r.1 = add i32 %v.1, %v.2
58; CHECK-NEXT:    %r.2 = add i32 %r.1, %v.3
59; CHECK-NEXT:    %r.3 = add i32 %r.2, 400
60; CHECK-NEXT:    %r.4 = add i32 %r.3, 50
61; CHECK-NEXT:    %r.5 = add i32 %r.4, 60
62; CHECK-NEXT:    %r.6 = add i32 %r.4, 700
63; CHECK-NEXT:    ret i32 %r.6
64;
65entry:
66  br i1 %cmp.1, label %if.true.1, label %end
67
68if.true.1:
69  br i1 %cmp.2, label %if.true.2, label %end
70
71if.true.2:
72  br label %end
73
74end:
75  %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ], [ %z, %if.true.2 ]
76  %c.1 = icmp sgt i32 %p, 5
77  %c.2 = icmp eq i32 %p, 0
78  %c.3 = icmp slt i32 %p, 0
79  %c.4 = icmp sgt i32 %p, 10
80  %c.5 = icmp sle i32 %p, 10
81  %c.6 = icmp sgt i32 %p, -11
82  %c.7 = icmp slt i32 %p, -11
83  %v.1 = select i1 %c.1, i32 10, i32 100
84  %v.2 = select i1 %c.2, i32 20, i32 200
85  %v.3 = select i1 %c.3, i32 30, i32 300
86  %v.4 = select i1 %c.4, i32 40, i32 400
87  %v.5 = select i1 %c.5, i32 50, i32 500
88  %v.6 = select i1 %c.6, i32 60, i32 600
89  %v.7 = select i1 %c.7, i32 70, i32 700
90  %r.1 = add i32 %v.1, %v.2
91  %r.2 = add i32 %r.1, %v.3
92  %r.3 = add i32 %r.2, %v.4
93  %r.4 = add i32 %r.3, %v.5
94  %r.5 = add i32 %r.4, %v.6
95  %r.6 = add i32 %r.4, %v.7
96  ret i32 %r.6
97}
98
99define i32 @caller2(i1 %cmp.1, i1 %cmp.2) {
100; CHECK-LABEL: define i32 @caller2(i1 %cmp.1, i1 %cmp.2) {
101; CHECK-LABEL: entry:
102; CHECK-NEXT:    br i1 %cmp.1, label %if.true, label %end
103
104; CHECK-LABEL: if.true:                                          ; preds = %entry
105; CHECK-NEXT:    br label %end
106
107; CHECK-LABEL: end:                                              ; preds = %if.true, %entry
108; CHECK-NEXT:    %p1 = phi i32 [ 0, %entry ], [ 1, %if.true ]
109; CHECK-NEXT:    %p2 = phi i32 [ 1, %entry ], [ -10, %if.true ]
110; CHECK-NEXT:    %p3 = phi i32 [ 1, %entry ], [ 10, %if.true ]
111; CHECK-NEXT:    %call1 = tail call i32 @f2(i32 %p1, i32 %p2, i32 %p3, i1 %cmp.1, i1 %cmp.2)
112; CHECK-NEXT:    ret i32 %call1
113;
114
115entry:
116  br i1 %cmp.1, label %if.true, label %end
117
118if.true:
119  br label %end
120
121end:
122  %p1 = phi i32 [ 0, %entry], [ 1, %if.true ]
123  %p2 = phi i32 [ 1, %entry], [ -10, %if.true ]
124  %p3 = phi i32 [ 1, %entry], [ 10, %if.true ]
125  %call1 = tail call i32 @f2(i32 %p1, i32 %p2, i32 %p3, i1 %cmp.1, i1 %cmp.2)
126  ret i32 %call1
127}
128
129define internal i32 @f3(i32 %x, i32 %y, i1 %cmp.1) {
130; CHECK-LABEL: define internal i32 @f3(i32 %x, i32 %y, i1 %cmp.1) {
131; CHECK-LABEL: entry:
132; CHECK-NEXT:    br i1 %cmp.1, label %if.true.1, label %end
133
134; CHECK-LABEL: if.true.1:                                        ; preds = %entry
135; CHECK-NEXT:    br label %end
136
137; CHECK-LABEL: end:                                              ; preds = %if.true.1, %entry
138; CHECK-NEXT:    %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ]
139; CHECK-NEXT:    %c.1 = icmp sgt i32 %p, 5
140; CHECK-NEXT:    %c.2 = icmp eq i32 %p, 0
141; CHECK-NEXT:    %c.3 = icmp slt i32 %p, 0
142; CHECK-NEXT:    %c.4 = icmp sgt i32 %p, 10
143; CHECK-NEXT:    %c.5 = icmp sle i32 %p, 10
144; CHECK-NEXT:    %c.6 = icmp sgt i32 %p, -11
145; CHECK-NEXT:    %c.7 = icmp slt i32 %p, -11
146; CHECK-NEXT:    %v.1 = select i1 %c.1, i32 10, i32 100
147; CHECK-NEXT:    %v.2 = select i1 %c.2, i32 20, i32 200
148; CHECK-NEXT:    %v.3 = select i1 %c.3, i32 30, i32 300
149; CHECK-NEXT:    %v.4 = select i1 %c.4, i32 40, i32 400
150; CHECK-NEXT:    %v.5 = select i1 %c.5, i32 50, i32 500
151; CHECK-NEXT:    %v.6 = select i1 %c.6, i32 60, i32 600
152; CHECK-NEXT:    %v.7 = select i1 %c.7, i32 70, i32 700
153; CHECK-NEXT:    %r.1 = add i32 %v.1, %v.2
154; CHECK-NEXT:    %r.2 = add i32 %r.1, %v.3
155; CHECK-NEXT:    %r.3 = add i32 %r.2, %v.4
156; CHECK-NEXT:    %r.4 = add i32 %r.3, %v.5
157; CHECK-NEXT:    %r.5 = add i32 %r.4, %v.6
158; CHECK-NEXT:    %r.6 = add i32 %r.4, %v.7
159; CHECK-NEXT:    ret i32 %r.6
160;
161entry:
162  br i1 %cmp.1, label %if.true.1, label %end
163
164if.true.1:
165  br label %end
166
167end:
168  %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ]
169  %c.1 = icmp sgt i32 %p, 5
170  %c.2 = icmp eq i32 %p, 0
171  %c.3 = icmp slt i32 %p, 0
172  %c.4 = icmp sgt i32 %p, 10
173  %c.5 = icmp sle i32 %p, 10
174  %c.6 = icmp sgt i32 %p, -11
175  %c.7 = icmp slt i32 %p, -11
176  %v.1 = select i1 %c.1, i32 10, i32 100
177  %v.2 = select i1 %c.2, i32 20, i32 200
178  %v.3 = select i1 %c.3, i32 30, i32 300
179  %v.4 = select i1 %c.4, i32 40, i32 400
180  %v.5 = select i1 %c.5, i32 50, i32 500
181  %v.6 = select i1 %c.6, i32 60, i32 600
182  %v.7 = select i1 %c.7, i32 70, i32 700
183  %r.1 = add i32 %v.1, %v.2
184  %r.2 = add i32 %r.1, %v.3
185  %r.3 = add i32 %r.2, %v.4
186  %r.4 = add i32 %r.3, %v.5
187  %r.5 = add i32 %r.4, %v.6
188  %r.6 = add i32 %r.4, %v.7
189  ret i32 %r.6
190}
191
192define i32 @caller3(i32 %y, i1 %cmp.1) {
193; CHECK-LABEL: define i32 @caller3(i32 %y, i1 %cmp.1) {
194; CHECK-LABEL: entry:
195; CHECK-NEXT:    br i1 %cmp.1, label %if.true, label %end
196
197; CHECK-LABEL: if.true:
198; CHECK-NEXT:    br label %end
199
200; CHECK-LABEL: end:
201; CHECK-NEXT:    %p1 = phi i32 [ 0, %entry ], [ 5, %if.true ]
202; CHECK-NEXT:    %call1 = tail call i32 @f3(i32 %p1, i32 %y, i1 %cmp.1)
203; CHECK-NEXT:    ret i32 %call1
204;
205entry:
206  br i1 %cmp.1, label %if.true, label %end
207
208if.true:
209  br label %end
210
211end:
212  %p1 = phi i32 [ 0, %entry], [ 5, %if.true ]
213  %call1 = tail call i32 @f3(i32 %p1, i32 %y, i1 %cmp.1)
214  ret i32 %call1
215}
216