xref: /llvm-project/llvm/test/Transforms/SCCP/phis.ll (revision 24fe1d4fd61983277c8061ce591970bc775a0fb5)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -passes=sccp -S | FileCheck %s
3
4define i1 @float.1(i1 %cmp) {
5; CHECK-LABEL: define i1 @float.1(
6; CHECK-SAME: i1 [[CMP:%.*]]) {
7; CHECK-NEXT:  [[ENTRY:.*:]]
8; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]]
9; CHECK:       [[IF_TRUE]]:
10; CHECK-NEXT:    br label %[[END]]
11; CHECK:       [[END]]:
12; CHECK-NEXT:    ret i1 true
13;
14entry:
15  br i1 %cmp, label %if.true, label %end
16
17if.true:
18  br label %end
19
20end:
21  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true]
22  %c = fcmp ueq float %p, 1.0
23  ret i1 %c
24}
25
26define i1 @float.2(i1 %cmp) {
27; CHECK-LABEL: define i1 @float.2(
28; CHECK-SAME: i1 [[CMP:%.*]]) {
29; CHECK-NEXT:  [[ENTRY:.*]]:
30; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]]
31; CHECK:       [[IF_TRUE]]:
32; CHECK-NEXT:    br label %[[END]]
33; CHECK:       [[END]]:
34; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, %[[ENTRY]] ], [ 2.000000e+00, %[[IF_TRUE]] ]
35; CHECK-NEXT:    [[C:%.*]] = fcmp ueq float [[P]], 1.000000e+00
36; CHECK-NEXT:    ret i1 [[C]]
37;
38entry:
39  br i1 %cmp, label %if.true, label %end
40
41if.true:
42  br label %end
43
44end:
45  %p = phi float [ 1.0, %entry ], [ 2.0, %if.true]
46  %c = fcmp ueq float %p, 1.0
47  ret i1 %c
48}
49
50define i1 @float.3(float %f, i1 %cmp) {
51; CHECK-LABEL: define i1 @float.3(
52; CHECK-SAME: float [[F:%.*]], i1 [[CMP:%.*]]) {
53; CHECK-NEXT:  [[ENTRY:.*]]:
54; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]]
55; CHECK:       [[IF_TRUE]]:
56; CHECK-NEXT:    br label %[[END]]
57; CHECK:       [[END]]:
58; CHECK-NEXT:    [[P:%.*]] = phi float [ 1.000000e+00, %[[ENTRY]] ], [ [[F]], %[[IF_TRUE]] ]
59; CHECK-NEXT:    [[C:%.*]] = fcmp ueq float [[P]], 1.000000e+00
60; CHECK-NEXT:    ret i1 [[C]]
61;
62
63entry:
64  br i1 %cmp, label %if.true, label %end
65
66if.true:
67  br label %end
68
69end:
70  %p = phi float [ 1.0, %entry ], [ %f, %if.true]
71  %c = fcmp ueq float %p, 1.0
72  ret i1 %c
73}
74
75
76define i1 @float.4_unreachable(float %f, i1 %cmp) {
77; CHECK-LABEL: define i1 @float.4_unreachable(
78; CHECK-SAME: float [[F:%.*]], i1 [[CMP:%.*]]) {
79; CHECK-NEXT:  [[ENTRY:.*:]]
80; CHECK-NEXT:    br i1 [[CMP]], label %[[IF_TRUE:.*]], label %[[END:.*]]
81; CHECK:       [[IF_TRUE]]:
82; CHECK-NEXT:    br label %[[END]]
83; CHECK:       [[END]]:
84; CHECK-NEXT:    ret i1 false
85;
86
87entry:
88  br i1 %cmp, label %if.true, label %end
89
90if.true:
91  br label %end
92
93dead:
94  br label %end
95
96end:
97  %p = phi float [ 1.0, %entry ], [ 1.0, %if.true], [ %f, %dead ]
98  %c = fcmp une float %p, 1.0
99  ret i1 %c
100}
101
102define <2 x i16> @phi_vector_merge1(i1 %c, <2 x i8> %a) {
103; CHECK-LABEL: define range(i16 2, 259) <2 x i16> @phi_vector_merge1(
104; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]]) {
105; CHECK-NEXT:  [[ENTRY:.*]]:
106; CHECK-NEXT:    [[ZEXT:%.*]] = zext <2 x i8> [[A]] to <2 x i16>
107; CHECK-NEXT:    br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]]
108; CHECK:       [[IF]]:
109; CHECK-NEXT:    br label %[[JOIN]]
110; CHECK:       [[JOIN]]:
111; CHECK-NEXT:    [[PHI:%.*]] = phi <2 x i16> [ [[ZEXT]], %[[ENTRY]] ], [ <i16 1, i16 2>, %[[IF]] ]
112; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw <2 x i16> [[PHI]], <i16 2, i16 3>
113; CHECK-NEXT:    ret <2 x i16> [[ADD]]
114;
115entry:
116  %zext = zext <2 x i8> %a to <2 x i16>
117  br i1 %c, label %if, label %join
118
119if:
120  br label %join
121
122join:
123  %phi = phi <2 x i16> [ %zext, %entry ], [ <i16 1, i16 2>, %if ]
124  %add = add <2 x i16> %phi, <i16 2, i16 3>
125  ret <2 x i16> %add
126}
127
128define <2 x i16> @phi_vector_merge2(i1 %c, <2 x i8> %a) {
129; CHECK-LABEL: define range(i16 2, 259) <2 x i16> @phi_vector_merge2(
130; CHECK-SAME: i1 [[C:%.*]], <2 x i8> [[A:%.*]]) {
131; CHECK-NEXT:  [[ENTRY:.*]]:
132; CHECK-NEXT:    [[ZEXT:%.*]] = zext <2 x i8> [[A]] to <2 x i16>
133; CHECK-NEXT:    br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]]
134; CHECK:       [[IF]]:
135; CHECK-NEXT:    br label %[[JOIN]]
136; CHECK:       [[JOIN]]:
137; CHECK-NEXT:    [[PHI:%.*]] = phi <2 x i16> [ <i16 1, i16 2>, %[[ENTRY]] ], [ [[ZEXT]], %[[IF]] ]
138; CHECK-NEXT:    [[ADD:%.*]] = add nuw nsw <2 x i16> [[PHI]], <i16 2, i16 3>
139; CHECK-NEXT:    ret <2 x i16> [[ADD]]
140;
141entry:
142  %zext = zext <2 x i8> %a to <2 x i16>
143  br i1 %c, label %if, label %join
144
145if:
146  br label %join
147
148join:
149  %phi = phi <2 x i16> [ <i16 1, i16 2>, %entry ], [ %zext, %if ]
150  %add = add <2 x i16> %phi, <i16 2, i16 3>
151  ret <2 x i16> %add
152}
153
154define <2 x float> @phi_vector_merge_float(i1 %c) {
155; CHECK-LABEL: define <2 x float> @phi_vector_merge_float(
156; CHECK-SAME: i1 [[C:%.*]]) {
157; CHECK-NEXT:  [[ENTRY:.*]]:
158; CHECK-NEXT:    br i1 [[C]], label %[[IF:.*]], label %[[JOIN:.*]]
159; CHECK:       [[IF]]:
160; CHECK-NEXT:    br label %[[JOIN]]
161; CHECK:       [[JOIN]]:
162; CHECK-NEXT:    [[PHI:%.*]] = phi <2 x float> [ <float 2.000000e+00, float 1.000000e+00>, %[[ENTRY]] ], [ <float 1.000000e+00, float 2.000000e+00>, %[[IF]] ]
163; CHECK-NEXT:    ret <2 x float> [[PHI]]
164;
165entry:
166  br i1 %c, label %if, label %join
167
168if:
169  br label %join
170
171join:
172  %phi = phi <2 x float> [ <float 2.0, float 1.0>, %entry ], [ <float 1.0, float 2.0>, %if ]
173  ret <2 x float> %phi
174}
175