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