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