1*b65b2b4aSAlexey Bataev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 2*b65b2b4aSAlexey Bataev; RUN: opt -S --passes=slp-vectorizer < %s | FileCheck %s 3*b65b2b4aSAlexey Bataev 4*b65b2b4aSAlexey Bataevdefine i32 @test(i32 %v, ptr %p) { 5*b65b2b4aSAlexey Bataev; CHECK-LABEL: define i32 @test( 6*b65b2b4aSAlexey Bataev; CHECK-SAME: i32 [[V:%.*]], ptr [[P:%.*]]) { 7*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[ENTRY:.*]]: 8*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[P]], align 4 9*b65b2b4aSAlexey Bataev; CHECK-NEXT: br i1 false, label %[[INC:.*]], label %[[PH:.*]] 10*b65b2b4aSAlexey Bataev; CHECK: [[PH]]: 11*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 [[LD]], i32 0 12*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> poison, <4 x i32> zeroinitializer 13*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP2:%.*]] = icmp eq <4 x i32> [[TMP1]], zeroinitializer 14*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 poison, i32 0, i32 0>, i32 [[V]], i32 13 15*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP4:%.*]] = icmp eq <16 x i32> [[TMP3]], zeroinitializer 16*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i1> [[TMP2]], <4 x i1> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> 17*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <16 x i1> [[TMP5]], <16 x i1> [[TMP4]], <4 x i32> <i32 0, i32 31, i32 poison, i32 poison> 18*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <4 x i1> [[TMP6]], <4 x i1> <i1 poison, i1 poison, i1 false, i1 false>, <4 x i32> <i32 0, i32 1, i32 6, i32 7> 19*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP8:%.*]] = select <4 x i1> [[TMP7]], <4 x i64> zeroinitializer, <4 x i64> zeroinitializer 20*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[I8_I_I:%.*]] = select i1 false, i64 0, i64 0 21*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[I9_I_I:%.*]] = select i1 false, i64 0, i64 0 22*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP9:%.*]] = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> [[TMP8]]) 23*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[OP_RDX1:%.*]] = or i64 [[TMP9]], [[I8_I_I]] 24*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[OP_RDX2:%.*]] = or i64 [[OP_RDX1]], [[I9_I_I]] 25*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP10:%.*]] = freeze <16 x i1> [[TMP4]] 26*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP11:%.*]] = call i1 @llvm.vector.reduce.or.v16i1(<16 x i1> [[TMP10]]) 27*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP12:%.*]] = freeze <4 x i1> [[TMP2]] 28*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[TMP13:%.*]] = call i1 @llvm.vector.reduce.or.v4i1(<4 x i1> [[TMP12]]) 29*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[OP_RDX:%.*]] = select i1 [[TMP11]], i1 true, i1 [[TMP13]] 30*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[AND252_US_I_24_I_I:%.*]] = select i1 [[OP_RDX]], i32 0, i32 0 31*b65b2b4aSAlexey Bataev; CHECK-NEXT: br label %[[INC]] 32*b65b2b4aSAlexey Bataev; CHECK: [[INC]]: 33*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[P1:%.*]] = phi i32 [ [[AND252_US_I_24_I_I]], %[[PH]] ], [ 0, %[[ENTRY]] ] 34*b65b2b4aSAlexey Bataev; CHECK-NEXT: [[P2:%.*]] = phi i64 [ [[OP_RDX2]], %[[PH]] ], [ 0, %[[ENTRY]] ] 35*b65b2b4aSAlexey Bataev; CHECK-NEXT: ret i32 0 36*b65b2b4aSAlexey Bataev; 37*b65b2b4aSAlexey Bataeventry: 38*b65b2b4aSAlexey Bataev %ld = load i32, ptr %p, align 4 39*b65b2b4aSAlexey Bataev br i1 false, label %inc, label %ph 40*b65b2b4aSAlexey Bataev 41*b65b2b4aSAlexey Bataevph: 42*b65b2b4aSAlexey Bataev %bi.i.not = icmp eq i32 %ld, 0 43*b65b2b4aSAlexey Bataev %b1.i.i = icmp eq i32 %ld, 0 44*b65b2b4aSAlexey Bataev %b3.i.i = icmp eq i32 %ld, 0 45*b65b2b4aSAlexey Bataev %0 = or i1 %b3.i.i, %b1.i.i 46*b65b2b4aSAlexey Bataev %b4.i.i = icmp eq i32 %ld, 0 47*b65b2b4aSAlexey Bataev %i4.i.i = select i1 %b4.i.i, i64 0, i64 0 48*b65b2b4aSAlexey Bataev %b5.i.i = icmp eq i32 0, 0 49*b65b2b4aSAlexey Bataev %i5.i.i = select i1 %b5.i.i, i64 0, i64 0 50*b65b2b4aSAlexey Bataev %inc34.5.i.i = or i64 %i4.i.i, %i5.i.i 51*b65b2b4aSAlexey Bataev %1 = or i1 %b5.i.i, %b4.i.i 52*b65b2b4aSAlexey Bataev %i6.i.i = select i1 false, i64 0, i64 0 53*b65b2b4aSAlexey Bataev %inc34.6.i.i = or i64 %inc34.5.i.i, %i6.i.i 54*b65b2b4aSAlexey Bataev %b7.i.i = icmp eq i32 0, 0 55*b65b2b4aSAlexey Bataev %i7.i.i = select i1 false, i64 0, i64 0 56*b65b2b4aSAlexey Bataev %inc34.7.i.i = or i64 %inc34.6.i.i, %i7.i.i 57*b65b2b4aSAlexey Bataev %i8.i.i = select i1 false, i64 0, i64 0 58*b65b2b4aSAlexey Bataev %inc34.8.i.i = or i64 %inc34.7.i.i, %i8.i.i 59*b65b2b4aSAlexey Bataev %i9.i.i = select i1 false, i64 0, i64 0 60*b65b2b4aSAlexey Bataev %inc34.9.i.i = or i64 %inc34.8.i.i, %i9.i.i 61*b65b2b4aSAlexey Bataev %b10.i.i = icmp eq i32 0, 0 62*b65b2b4aSAlexey Bataev %b11.i.i = icmp eq i32 0, 0 63*b65b2b4aSAlexey Bataev %2 = or i1 %b11.i.i, %b10.i.i 64*b65b2b4aSAlexey Bataev %b12.i.i = icmp eq i32 %v, 0 65*b65b2b4aSAlexey Bataev %3 = or i1 %b12.i.i, %2 66*b65b2b4aSAlexey Bataev %b13.i.i = icmp eq i32 0, 0 67*b65b2b4aSAlexey Bataev %b14.i.i = icmp eq i32 0, 0 68*b65b2b4aSAlexey Bataev %4 = or i1 %b14.i.i, %b13.i.i 69*b65b2b4aSAlexey Bataev %b16.i.i = icmp eq i32 0, 0 70*b65b2b4aSAlexey Bataev %b17.i.i = icmp eq i32 0, 0 71*b65b2b4aSAlexey Bataev %5 = or i1 %b17.i.i, %b16.i.i 72*b65b2b4aSAlexey Bataev %b18.i.i = icmp eq i32 0, 0 73*b65b2b4aSAlexey Bataev %6 = or i1 %b18.i.i, %5 74*b65b2b4aSAlexey Bataev %b19.i.i = icmp eq i32 0, 0 75*b65b2b4aSAlexey Bataev %b20.i.i = icmp eq i32 0, 0 76*b65b2b4aSAlexey Bataev %7 = or i1 %b20.i.i, %b19.i.i 77*b65b2b4aSAlexey Bataev %b21.i.i = icmp eq i32 0, 0 78*b65b2b4aSAlexey Bataev %8 = or i1 %b21.i.i, %7 79*b65b2b4aSAlexey Bataev %b22.i.i = icmp eq i32 0, 0 80*b65b2b4aSAlexey Bataev %b23.i.i = icmp eq i32 0, 0 81*b65b2b4aSAlexey Bataev %9 = or i1 %b23.i.i, %b22.i.i 82*b65b2b4aSAlexey Bataev %b24.i.i = icmp eq i32 0, 0 83*b65b2b4aSAlexey Bataev %10 = or i1 %b24.i.i, %9 84*b65b2b4aSAlexey Bataev %11 = select i1 %10, i1 true, i1 %8 85*b65b2b4aSAlexey Bataev %12 = select i1 %11, i1 true, i1 %6 86*b65b2b4aSAlexey Bataev %13 = select i1 %12, i1 true, i1 %4 87*b65b2b4aSAlexey Bataev %14 = select i1 %13, i1 true, i1 %3 88*b65b2b4aSAlexey Bataev %15 = select i1 %14, i1 true, i1 %b7.i.i 89*b65b2b4aSAlexey Bataev %16 = select i1 %15, i1 true, i1 %1 90*b65b2b4aSAlexey Bataev %17 = or i1 %0, %bi.i.not 91*b65b2b4aSAlexey Bataev %18 = select i1 %16, i1 true, i1 %17 92*b65b2b4aSAlexey Bataev %and252.us.i.24.i.i = select i1 %18, i32 0, i32 0 93*b65b2b4aSAlexey Bataev br label %inc 94*b65b2b4aSAlexey Bataev 95*b65b2b4aSAlexey Bataevinc: 96*b65b2b4aSAlexey Bataev %p1 = phi i32 [ %and252.us.i.24.i.i, %ph ], [ 0, %entry ] 97*b65b2b4aSAlexey Bataev %p2 = phi i64 [ %inc34.9.i.i, %ph ], [ 0, %entry ] 98*b65b2b4aSAlexey Bataev ret i32 0 99*b65b2b4aSAlexey Bataev} 100