xref: /llvm-project/llvm/test/Transforms/SandboxVectorizer/pack.ll (revision 6409799bdcd86be3ed72e8d172181294d3e5ad09)
18110af75Svporpo; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
28110af75Svporpo; RUN: opt -passes=sandbox-vectorizer -sbvec-vec-reg-bits=1024 -sbvec-allow-non-pow2 -sbvec-passes="bottom-up-vec<>" %s -S | FileCheck %s
38110af75Svporpo
48110af75Svporpodefine void @pack_constants(ptr %ptr) {
58110af75Svporpo; CHECK-LABEL: define void @pack_constants(
68110af75Svporpo; CHECK-SAME: ptr [[PTR:%.*]]) {
78110af75Svporpo; CHECK-NEXT:    [[PTR0:%.*]] = getelementptr i8, ptr [[PTR]], i32 0
88110af75Svporpo; CHECK-NEXT:    store <2 x i8> <i8 0, i8 1>, ptr [[PTR0]], align 1
98110af75Svporpo; CHECK-NEXT:    ret void
108110af75Svporpo;
118110af75Svporpo  %ptr0 = getelementptr i8, ptr %ptr, i32 0
128110af75Svporpo  %ptr1 = getelementptr i8, ptr %ptr, i32 1
138110af75Svporpo  store i8 0, ptr %ptr0
148110af75Svporpo  store i8 1, ptr %ptr1
158110af75Svporpo  ret void
168110af75Svporpo}
17d2234ca1Svporpo
18d2234ca1Svporpo; Make sure we don't generate bad IR when packing PHIs.
19d2234ca1Svporpo; NOTE: This test may become obsolete once we start vectorizing PHIs.
20d2234ca1Svporpodefine void @packPHIs(ptr %ptr) {
21d2234ca1Svporpo; CHECK-LABEL: define void @packPHIs(
22d2234ca1Svporpo; CHECK-SAME: ptr [[PTR:%.*]]) {
23d2234ca1Svporpo; CHECK-NEXT:  [[ENTRY:.*]]:
24d2234ca1Svporpo; CHECK-NEXT:    br label %[[LOOP:.*]]
25d2234ca1Svporpo; CHECK:       [[LOOP]]:
26d2234ca1Svporpo; CHECK-NEXT:    [[PHI0:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
27d2234ca1Svporpo; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
28d2234ca1Svporpo; CHECK-NEXT:    [[PHI2:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
29d2234ca1Svporpo; CHECK-NEXT:    [[PHI3:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
30d2234ca1Svporpo; CHECK-NEXT:    [[PACK:%.*]] = insertelement <2 x i8> poison, i8 [[PHI0]], i32 0
31d2234ca1Svporpo; CHECK-NEXT:    [[PACK1:%.*]] = insertelement <2 x i8> [[PACK]], i8 [[PHI1]], i32 1
32d2234ca1Svporpo; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr [[PTR]], i64 0
33d2234ca1Svporpo; CHECK-NEXT:    store <2 x i8> [[PACK1]], ptr [[GEP0]], align 1
34d2234ca1Svporpo; CHECK-NEXT:    br label %[[LOOP]]
35d2234ca1Svporpo; CHECK:       [[EXIT:.*:]]
36d2234ca1Svporpo; CHECK-NEXT:    ret void
37d2234ca1Svporpo;
38d2234ca1Svporpoentry:
39d2234ca1Svporpo  br label %loop
40d2234ca1Svporpo
41d2234ca1Svporpoloop:
42d2234ca1Svporpo  %phi0 = phi i8 [0, %entry], [1, %loop]
43d2234ca1Svporpo  %phi1 = phi i8 [0, %entry], [1, %loop]
44d2234ca1Svporpo  %phi2 = phi i8 [0, %entry], [1, %loop]
45d2234ca1Svporpo  %phi3 = phi i8 [0, %entry], [1, %loop]
46d2234ca1Svporpo  %gep0 = getelementptr i8, ptr %ptr, i64 0
47d2234ca1Svporpo  %gep1 = getelementptr i8, ptr %ptr, i64 1
48d2234ca1Svporpo  store i8 %phi0, ptr %gep0
49d2234ca1Svporpo  store i8 %phi1, ptr %gep1
50d2234ca1Svporpo  br label %loop
51d2234ca1Svporpo
52d2234ca1Svporpoexit:
53d2234ca1Svporpo  ret void
54d2234ca1Svporpo}
55d2234ca1Svporpo
56d2234ca1Svporpodefine void @packFromOtherBB(ptr %ptr, i8 %val) {
57d2234ca1Svporpo; CHECK-LABEL: define void @packFromOtherBB(
58d2234ca1Svporpo; CHECK-SAME: ptr [[PTR:%.*]], i8 [[VAL:%.*]]) {
59d2234ca1Svporpo; CHECK-NEXT:  [[ENTRY:.*]]:
60d2234ca1Svporpo; CHECK-NEXT:    [[ADD0:%.*]] = add i8 [[VAL]], 0
61d2234ca1Svporpo; CHECK-NEXT:    [[MUL1:%.*]] = mul i8 [[VAL]], 1
62d2234ca1Svporpo; CHECK-NEXT:    br label %[[LOOP:.*]]
63d2234ca1Svporpo; CHECK:       [[LOOP]]:
64d2234ca1Svporpo; CHECK-NEXT:    [[PHI0:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
65d2234ca1Svporpo; CHECK-NEXT:    [[PHI1:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ 1, %[[LOOP]] ]
66ac75d322Svporpo; CHECK-NEXT:    [[PACK:%.*]] = insertelement <2 x i8> poison, i8 [[ADD0]], i32 0
67ac75d322Svporpo; CHECK-NEXT:    [[PACK1:%.*]] = insertelement <2 x i8> [[PACK]], i8 [[MUL1]], i32 1
68d2234ca1Svporpo; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr [[PTR]], i64 0
69d2234ca1Svporpo; CHECK-NEXT:    store <2 x i8> [[PACK1]], ptr [[GEP0]], align 1
70d2234ca1Svporpo; CHECK-NEXT:    br label %[[LOOP]]
71d2234ca1Svporpo; CHECK:       [[EXIT:.*:]]
72d2234ca1Svporpo; CHECK-NEXT:    ret void
73d2234ca1Svporpo;
74d2234ca1Svporpoentry:
75d2234ca1Svporpo  %add0 = add i8 %val, 0
76d2234ca1Svporpo  %mul1 = mul i8 %val, 1
77d2234ca1Svporpo  br label %loop
78d2234ca1Svporpo
79d2234ca1Svporpoloop:
80d2234ca1Svporpo  %phi0 = phi i8 [0, %entry], [1, %loop]
81d2234ca1Svporpo  %phi1 = phi i8 [0, %entry], [1, %loop]
82d2234ca1Svporpo  %gep0 = getelementptr i8, ptr %ptr, i64 0
83d2234ca1Svporpo  %gep1 = getelementptr i8, ptr %ptr, i64 1
84d2234ca1Svporpo  store i8 %add0, ptr %gep0
85d2234ca1Svporpo  store i8 %mul1, ptr %gep1
86d2234ca1Svporpo  br label %loop
87d2234ca1Svporpo
88d2234ca1Svporpoexit:
89d2234ca1Svporpo  ret void
90d2234ca1Svporpo}
91*6409799bSvporpo
92*6409799bSvporpodefine void @packFromDiffBBs(ptr %ptr, i8 %v) {
93*6409799bSvporpo; CHECK-LABEL: define void @packFromDiffBBs(
94*6409799bSvporpo; CHECK-SAME: ptr [[PTR:%.*]], i8 [[V:%.*]]) {
95*6409799bSvporpo; CHECK-NEXT:  [[ENTRY:.*:]]
96*6409799bSvporpo; CHECK-NEXT:    [[ADD0:%.*]] = add i8 [[V]], 1
97*6409799bSvporpo; CHECK-NEXT:    br label %[[BB:.*]]
98*6409799bSvporpo; CHECK:       [[BB]]:
99*6409799bSvporpo; CHECK-NEXT:    [[ADD1:%.*]] = add i8 [[V]], 2
100*6409799bSvporpo; CHECK-NEXT:    [[PACK:%.*]] = insertelement <2 x i8> poison, i8 [[ADD0]], i32 0
101*6409799bSvporpo; CHECK-NEXT:    [[PACK1:%.*]] = insertelement <2 x i8> [[PACK]], i8 [[ADD1]], i32 1
102*6409799bSvporpo; CHECK-NEXT:    [[GEP0:%.*]] = getelementptr i8, ptr [[PTR]], i64 0
103*6409799bSvporpo; CHECK-NEXT:    store <2 x i8> [[PACK1]], ptr [[GEP0]], align 1
104*6409799bSvporpo; CHECK-NEXT:    ret void
105*6409799bSvporpo;
106*6409799bSvporpoentry:
107*6409799bSvporpo  %add0 = add i8 %v, 1
108*6409799bSvporpo  br label %bb
109*6409799bSvporpo
110*6409799bSvporpobb:
111*6409799bSvporpo  %add1 = add i8 %v, 2
112*6409799bSvporpo  %gep0 = getelementptr i8, ptr %ptr, i64 0
113*6409799bSvporpo  %gep1 = getelementptr i8, ptr %ptr, i64 1
114*6409799bSvporpo  store i8 %add0, ptr %gep0
115*6409799bSvporpo  store i8 %add1, ptr %gep1
116*6409799bSvporpo  ret void
117*6409799bSvporpo}
118