Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / SROA / phi-with-duplicate-pred.ll
bloba51c757e48bd3bfdc27e4f923032888637842fef
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes='sroa<preserve-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-PRESERVE-CFG
3 ; RUN: opt < %s -passes='sroa<modify-cfg>' -S | FileCheck %s --check-prefixes=CHECK,CHECK-MODIFY-CFG
4 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-n8:16:32:64"
6 @a = external global i16, align 1
8 declare void @maybe_writes()
10 define void @f2(i1 %c1) {
11 ; CHECK-LABEL: @f2(
12 ; CHECK-NEXT:  entry:
13 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
14 ; CHECK:       if.then:
15 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
16 ; CHECK:       cleanup:
17 ; CHECK-NEXT:    [[G_0_SROA_SPECULATE_LOAD_CLEANUP:%.*]] = load i16, ptr @a, align 1
18 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
19 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
20 ; CHECK-NEXT:    i32 2, label [[LBL1]]
21 ; CHECK-NEXT:    ]
22 ; CHECK:       if.else:
23 ; CHECK-NEXT:    br label [[LBL1]]
24 ; CHECK:       lbl1:
25 ; CHECK-NEXT:    [[G_0_SROA_SPECULATED:%.*]] = phi i16 [ [[G_0_SROA_SPECULATE_LOAD_CLEANUP]], [[CLEANUP]] ], [ [[G_0_SROA_SPECULATE_LOAD_CLEANUP]], [[CLEANUP]] ], [ undef, [[IF_ELSE]] ]
26 ; CHECK-NEXT:    unreachable
27 ; CHECK:       cleanup7:
28 ; CHECK-NEXT:    ret void
30 entry:
31   %e = alloca i16, align 1
32   br i1 %c1, label %if.then, label %if.else
34 if.then:                                          ; preds = %entry
35   br label %cleanup
37 cleanup:                                          ; preds = %if.then
38   switch i32 2, label %cleanup7 [
39   i32 0, label %lbl1
40   i32 2, label %lbl1
41   ]
43 if.else:                                          ; preds = %entry
44   br label %lbl1
46 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
47   %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
48   %0 = load i16, ptr %g.0, align 1
49   unreachable
51 cleanup7:                                         ; preds = %cleanup
52   ret void
55 define void @f3(i1 %c1) {
56 ; CHECK-LABEL: @f3(
57 ; CHECK-NEXT:  entry:
58 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
59 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
60 ; CHECK:       if.then:
61 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
62 ; CHECK:       cleanup:
63 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
64 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
65 ; CHECK-NEXT:    i32 2, label [[LBL1]]
66 ; CHECK-NEXT:    ]
67 ; CHECK:       if.else:
68 ; CHECK-NEXT:    br label [[LBL1]]
69 ; CHECK:       lbl1:
70 ; CHECK-NEXT:    [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
71 ; CHECK-NEXT:    br label [[FINAL:%.*]]
72 ; CHECK:       final:
73 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1
74 ; CHECK-NEXT:    unreachable
75 ; CHECK:       cleanup7:
76 ; CHECK-NEXT:    ret void
78 entry:
79   %e = alloca i16, align 1
80   br i1 %c1, label %if.then, label %if.else
82 if.then:                                          ; preds = %entry
83   br label %cleanup
85 cleanup:                                          ; preds = %if.then
86   switch i32 2, label %cleanup7 [
87   i32 0, label %lbl1
88   i32 2, label %lbl1
89   ]
91 if.else:                                          ; preds = %entry
92   br label %lbl1
94 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
95   %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
96   br label %final
98 final:
99   %0 = load i16, ptr %g.0, align 1
100   unreachable
102 cleanup7:                                         ; preds = %cleanup
103   ret void
106 define void @f4(i1 %c1) {
107 ; CHECK-LABEL: @f4(
108 ; CHECK-NEXT:  entry:
109 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
110 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
111 ; CHECK:       if.then:
112 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
113 ; CHECK:       cleanup:
114 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
115 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
116 ; CHECK-NEXT:    i32 2, label [[LBL1]]
117 ; CHECK-NEXT:    ]
118 ; CHECK:       if.else:
119 ; CHECK-NEXT:    br label [[LBL1]]
120 ; CHECK:       lbl1:
121 ; CHECK-NEXT:    [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
122 ; CHECK-NEXT:    br label [[FINAL:%.*]]
123 ; CHECK:       final:
124 ; CHECK-NEXT:    call void @maybe_writes()
125 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1
126 ; CHECK-NEXT:    unreachable
127 ; CHECK:       cleanup7:
128 ; CHECK-NEXT:    ret void
130 entry:
131   %e = alloca i16, align 1
132   br i1 %c1, label %if.then, label %if.else
134 if.then:                                          ; preds = %entry
135   br label %cleanup
137 cleanup:                                          ; preds = %if.then
138   switch i32 2, label %cleanup7 [
139   i32 0, label %lbl1
140   i32 2, label %lbl1
141   ]
143 if.else:                                          ; preds = %entry
144   br label %lbl1
146 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
147   %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
148   br label %final
150 final:
151   call void @maybe_writes()
152   %0 = load i16, ptr %g.0, align 1
153   unreachable
155 cleanup7:                                         ; preds = %cleanup
156   ret void
159 define void @f5(i1 %c1, i1 %c2) {
160 ; CHECK-LABEL: @f5(
161 ; CHECK-NEXT:  entry:
162 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
163 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
164 ; CHECK:       if.then:
165 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
166 ; CHECK:       cleanup:
167 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
168 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
169 ; CHECK-NEXT:    i32 2, label [[LBL1]]
170 ; CHECK-NEXT:    ]
171 ; CHECK:       if.else:
172 ; CHECK-NEXT:    br label [[LBL1]]
173 ; CHECK:       lbl1:
174 ; CHECK-NEXT:    [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
175 ; CHECK-NEXT:    br i1 [[C2:%.*]], label [[FINAL:%.*]], label [[CLEANUP7]]
176 ; CHECK:       final:
177 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1
178 ; CHECK-NEXT:    unreachable
179 ; CHECK:       cleanup7:
180 ; CHECK-NEXT:    ret void
182 entry:
183   %e = alloca i16, align 1
184   br i1 %c1, label %if.then, label %if.else
186 if.then:                                          ; preds = %entry
187   br label %cleanup
189 cleanup:                                          ; preds = %if.then
190   switch i32 2, label %cleanup7 [
191   i32 0, label %lbl1
192   i32 2, label %lbl1
193   ]
195 if.else:                                          ; preds = %entry
196   br label %lbl1
198 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
199   %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
200   br i1 %c2, label %final, label %cleanup7
202 final:
203   %0 = load i16, ptr %g.0, align 1
204   unreachable
206 cleanup7:                                         ; preds = %cleanup
207   ret void
210 define void @f6(i1 %c1) {
211 ; CHECK-LABEL: @f6(
212 ; CHECK-NEXT:  entry:
213 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
214 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
215 ; CHECK:       if.then:
216 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
217 ; CHECK:       cleanup:
218 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
219 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
220 ; CHECK-NEXT:    i32 2, label [[LBL1]]
221 ; CHECK-NEXT:    ]
222 ; CHECK:       if.else:
223 ; CHECK-NEXT:    br label [[LBL1]]
224 ; CHECK:       lbl1:
225 ; CHECK-NEXT:    [[G_0:%.*]] = phi ptr [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
226 ; CHECK-NEXT:    br label [[FINAL:%.*]]
227 ; CHECK:       unreachable_pred:
228 ; CHECK-NEXT:    br label [[FINAL]]
229 ; CHECK:       final:
230 ; CHECK-NEXT:    call void @maybe_writes()
231 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, ptr [[G_0]], align 1
232 ; CHECK-NEXT:    unreachable
233 ; CHECK:       cleanup7:
234 ; CHECK-NEXT:    ret void
236 entry:
237   %e = alloca i16, align 1
238   br i1 %c1, label %if.then, label %if.else
240 if.then:                                          ; preds = %entry
241   br label %cleanup
243 cleanup:                                          ; preds = %if.then
244   switch i32 2, label %cleanup7 [
245   i32 0, label %lbl1
246   i32 2, label %lbl1
247   ]
249 if.else:                                          ; preds = %entry
250   br label %lbl1
252 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
253   %g.0 = phi ptr [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
254   br label %final
256 unreachable_pred:
257   br label %final
259 final:
260   call void @maybe_writes()
261   %0 = load i16, ptr %g.0, align 1
262   unreachable
264 cleanup7:                                         ; preds = %cleanup
265   ret void
267 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
268 ; CHECK-MODIFY-CFG: {{.*}}
269 ; CHECK-PRESERVE-CFG: {{.*}}