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