xref: /llvm-project/llvm/test/Transforms/InstCombine/freeze-phi.ll (revision 10f315dc9c96ec2413881ab55a285e35d80def88)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4define i32 @const(i1 %cond) {
5; CHECK-LABEL: @const(
6; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
7; CHECK:       A:
8; CHECK-NEXT:    br label [[C:%.*]]
9; CHECK:       B:
10; CHECK-NEXT:    br label [[C]]
11; CHECK:       C:
12; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 1, [[B]] ]
13; CHECK-NEXT:    ret i32 [[Y]]
14;
15  br i1 %cond, label %A, label %B
16A:
17  br label %C
18B:
19  br label %C
20C:
21  %y = phi i32 [0, %A], [1, %B]
22  %y.fr = freeze i32 %y
23  ret i32 %y.fr
24}
25
26define <2 x i32> @vec(i1 %cond) {
27; CHECK-LABEL: @vec(
28; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
29; CHECK:       A:
30; CHECK-NEXT:    br label [[C:%.*]]
31; CHECK:       B:
32; CHECK-NEXT:    br label [[C]]
33; CHECK:       C:
34; CHECK-NEXT:    [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ <i32 2, i32 3>, [[B]] ]
35; CHECK-NEXT:    ret <2 x i32> [[Y]]
36;
37  br i1 %cond, label %A, label %B
38A:
39  br label %C
40B:
41  br label %C
42C:
43  %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 3>, %B]
44  %y.fr = freeze <2 x i32> %y
45  ret <2 x i32> %y.fr
46}
47
48define <2 x i32> @vec_undef(i1 %cond) {
49; CHECK-LABEL: @vec_undef(
50; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
51; CHECK:       A:
52; CHECK-NEXT:    br label [[C:%.*]]
53; CHECK:       B:
54; CHECK-NEXT:    br label [[C]]
55; CHECK:       C:
56; CHECK-NEXT:    [[Y:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, [[A]] ], [ <i32 2, i32 0>, [[B]] ]
57; CHECK-NEXT:    ret <2 x i32> [[Y]]
58;
59  br i1 %cond, label %A, label %B
60A:
61  br label %C
62B:
63  br label %C
64C:
65  %y = phi <2 x i32> [<i32 0, i32 1>, %A], [<i32 2, i32 undef>, %B]
66  %y.fr = freeze <2 x i32> %y
67  ret <2 x i32> %y.fr
68}
69
70define i32 @one(i1 %cond, i32 %x) {
71; CHECK-LABEL: @one(
72; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
73; CHECK:       A:
74; CHECK-NEXT:    br label [[C:%.*]]
75; CHECK:       B:
76; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 [[X:%.*]]
77; CHECK-NEXT:    br label [[C]]
78; CHECK:       C:
79; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ [[TMP1]], [[B]] ]
80; CHECK-NEXT:    ret i32 [[Y]]
81;
82  br i1 %cond, label %A, label %B
83A:
84  br label %C
85B:
86  br label %C
87C:
88  %y = phi i32 [0, %A], [%x, %B]
89  %y.fr = freeze i32 %y
90  ret i32 %y.fr
91}
92
93define i32 @two(i1 %cond, i32 %x, i32 %x2) {
94; CHECK-LABEL: @two(
95; CHECK-NEXT:    br i1 [[COND:%.*]], label [[A:%.*]], label [[B:%.*]]
96; CHECK:       A:
97; CHECK-NEXT:    br label [[C:%.*]]
98; CHECK:       B:
99; CHECK-NEXT:    br label [[C]]
100; CHECK:       C:
101; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ [[X:%.*]], [[A]] ], [ [[X2:%.*]], [[B]] ]
102; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i32 [[Y]]
103; CHECK-NEXT:    ret i32 [[Y_FR]]
104;
105  br i1 %cond, label %A, label %B
106A:
107  br label %C
108B:
109  br label %C
110C:
111  %y = phi i32 [%x, %A], [%x2, %B]
112  %y.fr = freeze i32 %y
113  ret i32 %y.fr
114}
115
116define i32 @two_undef(i8 %cond, i32 %x) {
117; CHECK-LABEL: @two_undef(
118; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [
119; CHECK-NEXT:      i8 0, label [[B:%.*]]
120; CHECK-NEXT:      i8 1, label [[C:%.*]]
121; CHECK-NEXT:    ]
122; CHECK:       A:
123; CHECK-NEXT:    br label [[D:%.*]]
124; CHECK:       B:
125; CHECK-NEXT:    br label [[D]]
126; CHECK:       C:
127; CHECK-NEXT:    br label [[D]]
128; CHECK:       D:
129; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ undef, [[A]] ], [ [[X:%.*]], [[B]] ], [ 0, [[C]] ]
130; CHECK-NEXT:    [[Y_FR:%.*]] = freeze i32 [[Y]]
131; CHECK-NEXT:    ret i32 [[Y_FR]]
132;
133  switch i8 %cond, label %A [
134  i8 0, label %B
135  i8 1, label %C
136  ]
137A:
138  br label %D
139B:
140  br label %D
141C:
142  br label %D
143D:
144  %y = phi i32 [undef, %A], [%x, %B], [0, %C]
145  %y.fr = freeze i32 %y
146  ret i32 %y.fr
147}
148
149define i32 @one_undef(i8 %cond) {
150; CHECK-LABEL: @one_undef(
151; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [
152; CHECK-NEXT:      i8 0, label [[B:%.*]]
153; CHECK-NEXT:      i8 1, label [[C:%.*]]
154; CHECK-NEXT:    ]
155; CHECK:       A:
156; CHECK-NEXT:    br label [[D:%.*]]
157; CHECK:       B:
158; CHECK-NEXT:    br label [[D]]
159; CHECK:       C:
160; CHECK-NEXT:    br label [[D]]
161; CHECK:       D:
162; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ 0, [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ]
163; CHECK-NEXT:    ret i32 [[Y]]
164;
165  switch i8 %cond, label %A [
166  i8 0, label %B
167  i8 1, label %C
168  ]
169A:
170  br label %D
171B:
172  br label %D
173C:
174  br label %D
175D:
176  %y = phi i32 [undef, %A], [32, %B], [0, %C]
177  %y.fr = freeze i32 %y
178  ret i32 %y.fr
179}
180
181@glb = global i8 0
182
183define i32 @one_constexpr(i8 %cond, i32 %x) {
184; CHECK-LABEL: @one_constexpr(
185; CHECK-NEXT:    switch i8 [[COND:%.*]], label [[A:%.*]] [
186; CHECK-NEXT:      i8 0, label [[B:%.*]]
187; CHECK-NEXT:      i8 1, label [[C:%.*]]
188; CHECK-NEXT:    ]
189; CHECK:       A:
190; CHECK-NEXT:    [[TMP1:%.*]] = freeze i32 ptrtoint (ptr getelementptr inbounds nuw (i8, ptr @glb, i64 2) to i32)
191; CHECK-NEXT:    br label [[D:%.*]]
192; CHECK:       B:
193; CHECK-NEXT:    br label [[D]]
194; CHECK:       C:
195; CHECK-NEXT:    br label [[D]]
196; CHECK:       D:
197; CHECK-NEXT:    [[Y:%.*]] = phi i32 [ [[TMP1]], [[A]] ], [ 32, [[B]] ], [ 0, [[C]] ]
198; CHECK-NEXT:    ret i32 [[Y]]
199;
200  switch i8 %cond, label %A [
201  i8 0, label %B
202  i8 1, label %C
203  ]
204A:
205  br label %D
206B:
207  br label %D
208C:
209  br label %D
210D:
211  %y = phi i32 [ptrtoint (ptr getelementptr inbounds (i8, ptr @glb, i64 2) to i32), %A], [32, %B], [0, %C]
212  %y.fr = freeze i32 %y
213  ret i32 %y.fr
214}
215