xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/phi-undef-input.ll (revision 7773243d9916f98ba0ffce0c3a960e4aa9f03e81)
1*7773243dSElvina Yakubova; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*7773243dSElvina Yakubova; RUN: %if x86-registered-target %{ opt < %s -passes=slp-vectorizer -slp-threshold=-1000 -mtriple=x86_64 -S | FileCheck %s %}
3*7773243dSElvina Yakubova; RUN: %if aarch64-registered-target %{ opt < %s -passes=slp-vectorizer -slp-threshold=-1000 -mtriple=aarch64-unknown-linux-gnu -S | FileCheck %s %}
4*7773243dSElvina Yakubova
5*7773243dSElvina Yakubova; The inputs to vector phi should remain undef.
6*7773243dSElvina Yakubova
7*7773243dSElvina Yakubovadefine i32 @phi3UndefInput(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
8*7773243dSElvina Yakubova; CHECK-LABEL: @phi3UndefInput(
9*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
10*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
11*7773243dSElvina Yakubova; CHECK:       bb2:
12*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG0:%.*]], i32 0
13*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1
14*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG2:%.*]], i32 2
15*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG3:%.*]], i32 3
16*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
17*7773243dSElvina Yakubova; CHECK:       bb3:
18*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 undef, i8 undef, i8 undef>, [[ENTRY:%.*]] ]
19*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
20*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
21*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
22*7773243dSElvina Yakubova;
23*7773243dSElvina Yakubovaentry:
24*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
25*7773243dSElvina Yakubova
26*7773243dSElvina Yakubovabb2:
27*7773243dSElvina Yakubova  br label %bb3
28*7773243dSElvina Yakubova
29*7773243dSElvina Yakubovabb3:
30*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ 0, %entry ]
31*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ undef, %entry ]
32*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ undef, %entry ]
33*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
34*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
35*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
36*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
37*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
38*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
39*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
40*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
41*7773243dSElvina Yakubova  ret i32 %or3
42*7773243dSElvina Yakubova}
43*7773243dSElvina Yakubova
44*7773243dSElvina Yakubovadefine i32 @phi2UndefInput(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
45*7773243dSElvina Yakubova; CHECK-LABEL: @phi2UndefInput(
46*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
47*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
48*7773243dSElvina Yakubova; CHECK:       bb2:
49*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG0:%.*]], i32 0
50*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1
51*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG2:%.*]], i32 2
52*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG3:%.*]], i32 3
53*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
54*7773243dSElvina Yakubova; CHECK:       bb3:
55*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 0, i8 undef, i8 undef>, [[ENTRY:%.*]] ]
56*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
57*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
58*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
59*7773243dSElvina Yakubova;
60*7773243dSElvina Yakubovaentry:
61*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
62*7773243dSElvina Yakubova
63*7773243dSElvina Yakubovabb2:
64*7773243dSElvina Yakubova  br label %bb3
65*7773243dSElvina Yakubova
66*7773243dSElvina Yakubovabb3:
67*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ 0, %entry ]
68*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
69*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ undef, %entry ]
70*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
71*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
72*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
73*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
74*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
75*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
76*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
77*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
78*7773243dSElvina Yakubova  ret i32 %or3
79*7773243dSElvina Yakubova}
80*7773243dSElvina Yakubova
81*7773243dSElvina Yakubovadefine i32 @phi1UndefInput(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
82*7773243dSElvina Yakubova; CHECK-LABEL: @phi1UndefInput(
83*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
84*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
85*7773243dSElvina Yakubova; CHECK:       bb2:
86*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG0:%.*]], i32 0
87*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1
88*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG2:%.*]], i32 2
89*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG3:%.*]], i32 3
90*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
91*7773243dSElvina Yakubova; CHECK:       bb3:
92*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 0, i8 0, i8 undef>, [[ENTRY:%.*]] ]
93*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
94*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
95*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
96*7773243dSElvina Yakubova;
97*7773243dSElvina Yakubovaentry:
98*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
99*7773243dSElvina Yakubova
100*7773243dSElvina Yakubovabb2:
101*7773243dSElvina Yakubova  br label %bb3
102*7773243dSElvina Yakubova
103*7773243dSElvina Yakubovabb3:
104*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ 0, %entry ]
105*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
106*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ 0, %entry ]
107*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
108*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
109*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
110*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
111*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
112*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
113*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
114*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
115*7773243dSElvina Yakubova  ret i32 %or3
116*7773243dSElvina Yakubova}
117*7773243dSElvina Yakubova
118*7773243dSElvina Yakubova
119*7773243dSElvina Yakubovadefine i32 @phi1Undef1PoisonInput(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
120*7773243dSElvina Yakubova; CHECK-LABEL: @phi1Undef1PoisonInput(
121*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
122*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
123*7773243dSElvina Yakubova; CHECK:       bb2:
124*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG0:%.*]], i32 0
125*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG1:%.*]], i32 1
126*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG2:%.*]], i32 2
127*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG3:%.*]], i32 3
128*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
129*7773243dSElvina Yakubova; CHECK:       bb3:
130*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 0, i8 poison, i8 undef>, [[ENTRY:%.*]] ]
131*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
132*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
133*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
134*7773243dSElvina Yakubova;
135*7773243dSElvina Yakubovaentry:
136*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
137*7773243dSElvina Yakubova
138*7773243dSElvina Yakubovabb2:
139*7773243dSElvina Yakubova  br label %bb3
140*7773243dSElvina Yakubova
141*7773243dSElvina Yakubovabb3:
142*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ 0, %entry ]
143*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
144*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ poison, %entry ]
145*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
146*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
147*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
148*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
149*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
150*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
151*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
152*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
153*7773243dSElvina Yakubova  ret i32 %or3
154*7773243dSElvina Yakubova}
155*7773243dSElvina Yakubova
156*7773243dSElvina Yakubova
157*7773243dSElvina Yakubovadefine i32 @phi1Undef2PoisonInputs(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
158*7773243dSElvina Yakubova; CHECK-LABEL: @phi1Undef2PoisonInputs(
159*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
160*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
161*7773243dSElvina Yakubova; CHECK:       bb2:
162*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG1:%.*]], i32 0
163*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG0:%.*]], i32 1
164*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG2:%.*]], i32 2
165*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG3:%.*]], i32 3
166*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
167*7773243dSElvina Yakubova; CHECK:       bb3:
168*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 poison, i8 poison, i8 undef>, [[ENTRY:%.*]] ]
169*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
170*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
171*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
172*7773243dSElvina Yakubova;
173*7773243dSElvina Yakubovaentry:
174*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
175*7773243dSElvina Yakubova
176*7773243dSElvina Yakubovabb2:
177*7773243dSElvina Yakubova  br label %bb3
178*7773243dSElvina Yakubova
179*7773243dSElvina Yakubovabb3:
180*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ poison, %entry ]
181*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
182*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ poison, %entry ]
183*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ undef, %entry ]
184*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
185*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
186*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
187*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
188*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
189*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
190*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
191*7773243dSElvina Yakubova  ret i32 %or3
192*7773243dSElvina Yakubova}
193*7773243dSElvina Yakubova
194*7773243dSElvina Yakubovadefine i32 @phi1Undef1PoisonGapInput(i1 %cond, i8 %arg0, i8 %arg1, i8 %arg2, i8 %arg3) {
195*7773243dSElvina Yakubova; CHECK-LABEL: @phi1Undef1PoisonGapInput(
196*7773243dSElvina Yakubova; CHECK-NEXT:  entry:
197*7773243dSElvina Yakubova; CHECK-NEXT:    br i1 [[COND:%.*]], label [[BB2:%.*]], label [[BB3:%.*]]
198*7773243dSElvina Yakubova; CHECK:       bb2:
199*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP0:%.*]] = insertelement <4 x i8> poison, i8 [[ARG1:%.*]], i32 0
200*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <4 x i8> [[TMP0]], i8 [[ARG3:%.*]], i32 1
201*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[ARG0:%.*]], i32 2
202*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <4 x i8> [[TMP2]], i8 [[ARG2:%.*]], i32 3
203*7773243dSElvina Yakubova; CHECK-NEXT:    br label [[BB3]]
204*7773243dSElvina Yakubova; CHECK:       bb3:
205*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP4:%.*]] = phi <4 x i8> [ [[TMP3]], [[BB2]] ], [ <i8 0, i8 0, i8 poison, i8 undef>, [[ENTRY:%.*]] ]
206*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP5:%.*]] = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> [[TMP4]])
207*7773243dSElvina Yakubova; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32
208*7773243dSElvina Yakubova; CHECK-NEXT:    ret i32 [[TMP6]]
209*7773243dSElvina Yakubova;
210*7773243dSElvina Yakubovaentry:
211*7773243dSElvina Yakubova  br i1 %cond, label %bb2, label %bb3
212*7773243dSElvina Yakubova
213*7773243dSElvina Yakubovabb2:
214*7773243dSElvina Yakubova  br label %bb3
215*7773243dSElvina Yakubova
216*7773243dSElvina Yakubovabb3:
217*7773243dSElvina Yakubova  %phi0 = phi i8 [ %arg0, %bb2 ], [ poison, %entry ]
218*7773243dSElvina Yakubova  %phi1 = phi i8 [ %arg1, %bb2 ], [ 0, %entry ]
219*7773243dSElvina Yakubova  %phi2 = phi i8 [ %arg2, %bb2 ], [ undef, %entry ]
220*7773243dSElvina Yakubova  %phi3 = phi i8 [ %arg3, %bb2 ], [ 0, %entry ]
221*7773243dSElvina Yakubova  %zext0 = zext i8 %phi0 to i32
222*7773243dSElvina Yakubova  %zext1 = zext i8 %phi1 to i32
223*7773243dSElvina Yakubova  %zext2 = zext i8 %phi2 to i32
224*7773243dSElvina Yakubova  %zext3 = zext i8 %phi3 to i32
225*7773243dSElvina Yakubova  %or1 = or i32 %zext0, %zext1
226*7773243dSElvina Yakubova  %or2 = or i32 %or1, %zext2
227*7773243dSElvina Yakubova  %or3 = or i32 %or2, %zext3
228*7773243dSElvina Yakubova  ret i32 %or3
229*7773243dSElvina Yakubova}
230