xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/partial-register-extract.ll (revision b65b2b4ab60763515694c740935989f908a03312)
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