[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / SROA / phi-with-duplicate-pred.ll
blob87226f7fe5743fe88ce7498851b9e45bd0a3e4d1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -sroa -S | FileCheck %s
3 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"
5 @a = external global i16, align 1
7 declare void @maybe_writes()
9 define void @f2() {
10 ; CHECK-LABEL: @f2(
11 ; CHECK-NEXT:  entry:
12 ; CHECK-NEXT:    br i1 undef, label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
13 ; CHECK:       if.then:
14 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
15 ; CHECK:       cleanup:
16 ; CHECK-NEXT:    [[G_0_SROA_SPECULATE_LOAD_CLEANUP:%.*]] = load i16, i16* @a, align 1
17 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
18 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
19 ; CHECK-NEXT:    i32 2, label [[LBL1]]
20 ; CHECK-NEXT:    ]
21 ; CHECK:       if.else:
22 ; CHECK-NEXT:    br label [[LBL1]]
23 ; CHECK:       lbl1:
24 ; 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]] ]
25 ; CHECK-NEXT:    unreachable
26 ; CHECK:       cleanup7:
27 ; CHECK-NEXT:    ret void
29 entry:
30   %e = alloca i16, align 1
31   br i1 undef, label %if.then, label %if.else
33 if.then:                                          ; preds = %entry
34   br label %cleanup
36 cleanup:                                          ; preds = %if.then
37   switch i32 2, label %cleanup7 [
38   i32 0, label %lbl1
39   i32 2, label %lbl1
40   ]
42 if.else:                                          ; preds = %entry
43   br label %lbl1
45 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
46   %g.0 = phi i16* [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
47   %0 = load i16, i16* %g.0, align 1
48   unreachable
50 cleanup7:                                         ; preds = %cleanup
51   ret void
54 define void @f3() {
55 ; CHECK-LABEL: @f3(
56 ; CHECK-NEXT:  entry:
57 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
58 ; CHECK-NEXT:    br i1 undef, label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
59 ; CHECK:       if.then:
60 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
61 ; CHECK:       cleanup:
62 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
63 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
64 ; CHECK-NEXT:    i32 2, label [[LBL1]]
65 ; CHECK-NEXT:    ]
66 ; CHECK:       if.else:
67 ; CHECK-NEXT:    br label [[LBL1]]
68 ; CHECK:       lbl1:
69 ; CHECK-NEXT:    [[G_0:%.*]] = phi i16* [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
70 ; CHECK-NEXT:    br label [[FINAL:%.*]]
71 ; CHECK:       final:
72 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, i16* [[G_0]], align 1
73 ; CHECK-NEXT:    unreachable
74 ; CHECK:       cleanup7:
75 ; CHECK-NEXT:    ret void
77 entry:
78   %e = alloca i16, align 1
79   br i1 undef, label %if.then, label %if.else
81 if.then:                                          ; preds = %entry
82   br label %cleanup
84 cleanup:                                          ; preds = %if.then
85   switch i32 2, label %cleanup7 [
86   i32 0, label %lbl1
87   i32 2, label %lbl1
88   ]
90 if.else:                                          ; preds = %entry
91   br label %lbl1
93 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
94   %g.0 = phi i16* [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
95   br label %final
97 final:
98   %0 = load i16, i16* %g.0, align 1
99   unreachable
101 cleanup7:                                         ; preds = %cleanup
102   ret void
105 define void @f4() {
106 ; CHECK-LABEL: @f4(
107 ; CHECK-NEXT:  entry:
108 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
109 ; CHECK-NEXT:    br i1 undef, label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
110 ; CHECK:       if.then:
111 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
112 ; CHECK:       cleanup:
113 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
114 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
115 ; CHECK-NEXT:    i32 2, label [[LBL1]]
116 ; CHECK-NEXT:    ]
117 ; CHECK:       if.else:
118 ; CHECK-NEXT:    br label [[LBL1]]
119 ; CHECK:       lbl1:
120 ; CHECK-NEXT:    [[G_0:%.*]] = phi i16* [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
121 ; CHECK-NEXT:    br label [[FINAL:%.*]]
122 ; CHECK:       final:
123 ; CHECK-NEXT:    call void @maybe_writes()
124 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, i16* [[G_0]], align 1
125 ; CHECK-NEXT:    unreachable
126 ; CHECK:       cleanup7:
127 ; CHECK-NEXT:    ret void
129 entry:
130   %e = alloca i16, align 1
131   br i1 undef, label %if.then, label %if.else
133 if.then:                                          ; preds = %entry
134   br label %cleanup
136 cleanup:                                          ; preds = %if.then
137   switch i32 2, label %cleanup7 [
138   i32 0, label %lbl1
139   i32 2, label %lbl1
140   ]
142 if.else:                                          ; preds = %entry
143   br label %lbl1
145 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
146   %g.0 = phi i16* [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
147   br label %final
149 final:
150   call void @maybe_writes()
151   %0 = load i16, i16* %g.0, align 1
152   unreachable
154 cleanup7:                                         ; preds = %cleanup
155   ret void
158 define void @f5() {
159 ; CHECK-LABEL: @f5(
160 ; CHECK-NEXT:  entry:
161 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
162 ; CHECK-NEXT:    br i1 undef, label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
163 ; CHECK:       if.then:
164 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
165 ; CHECK:       cleanup:
166 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
167 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
168 ; CHECK-NEXT:    i32 2, label [[LBL1]]
169 ; CHECK-NEXT:    ]
170 ; CHECK:       if.else:
171 ; CHECK-NEXT:    br label [[LBL1]]
172 ; CHECK:       lbl1:
173 ; CHECK-NEXT:    [[G_0:%.*]] = phi i16* [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
174 ; CHECK-NEXT:    br i1 undef, label [[FINAL:%.*]], label [[CLEANUP7]]
175 ; CHECK:       final:
176 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, i16* [[G_0]], align 1
177 ; CHECK-NEXT:    unreachable
178 ; CHECK:       cleanup7:
179 ; CHECK-NEXT:    ret void
181 entry:
182   %e = alloca i16, align 1
183   br i1 undef, label %if.then, label %if.else
185 if.then:                                          ; preds = %entry
186   br label %cleanup
188 cleanup:                                          ; preds = %if.then
189   switch i32 2, label %cleanup7 [
190   i32 0, label %lbl1
191   i32 2, label %lbl1
192   ]
194 if.else:                                          ; preds = %entry
195   br label %lbl1
197 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
198   %g.0 = phi i16* [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
199   br i1 undef, label %final, label %cleanup7
201 final:
202   %0 = load i16, i16* %g.0, align 1
203   unreachable
205 cleanup7:                                         ; preds = %cleanup
206   ret void
209 define void @f6() {
210 ; CHECK-LABEL: @f6(
211 ; CHECK-NEXT:  entry:
212 ; CHECK-NEXT:    [[E:%.*]] = alloca i16, align 1
213 ; CHECK-NEXT:    br i1 undef, label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
214 ; CHECK:       if.then:
215 ; CHECK-NEXT:    br label [[CLEANUP:%.*]]
216 ; CHECK:       cleanup:
217 ; CHECK-NEXT:    switch i32 2, label [[CLEANUP7:%.*]] [
218 ; CHECK-NEXT:    i32 0, label [[LBL1:%.*]]
219 ; CHECK-NEXT:    i32 2, label [[LBL1]]
220 ; CHECK-NEXT:    ]
221 ; CHECK:       if.else:
222 ; CHECK-NEXT:    br label [[LBL1]]
223 ; CHECK:       lbl1:
224 ; CHECK-NEXT:    [[G_0:%.*]] = phi i16* [ @a, [[CLEANUP]] ], [ @a, [[CLEANUP]] ], [ [[E]], [[IF_ELSE]] ]
225 ; CHECK-NEXT:    br label [[FINAL:%.*]]
226 ; CHECK:       unreachable_pred:
227 ; CHECK-NEXT:    br label [[FINAL]]
228 ; CHECK:       final:
229 ; CHECK-NEXT:    call void @maybe_writes()
230 ; CHECK-NEXT:    [[TMP0:%.*]] = load i16, i16* [[G_0]], align 1
231 ; CHECK-NEXT:    unreachable
232 ; CHECK:       cleanup7:
233 ; CHECK-NEXT:    ret void
235 entry:
236   %e = alloca i16, align 1
237   br i1 undef, label %if.then, label %if.else
239 if.then:                                          ; preds = %entry
240   br label %cleanup
242 cleanup:                                          ; preds = %if.then
243   switch i32 2, label %cleanup7 [
244   i32 0, label %lbl1
245   i32 2, label %lbl1
246   ]
248 if.else:                                          ; preds = %entry
249   br label %lbl1
251 lbl1:                                             ; preds = %if.else, %cleanup, %cleanup
252   %g.0 = phi i16* [ @a, %cleanup ], [ @a, %cleanup ], [ %e, %if.else ]
253   br label %final
255 unreachable_pred:
256   br label %final
258 final:
259   call void @maybe_writes()
260   %0 = load i16, i16* %g.0, align 1
261   unreachable
263 cleanup7:                                         ; preds = %cleanup
264   ret void