| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 |
| |
| ; RUN: opt -mtriple=riscv64 -mattr=+m,+v,+unaligned-vector-mem -passes=slp-vectorizer -S < %s | FileCheck %s |
| |
| define void @constant_stride_widen_rotated1(ptr %pl, i64 %stride, ptr %ps) { |
| ; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0 |
| ; CHECK-LABEL: define void @constant_stride_widen_rotated1( |
| ; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0:[0-9]+]] { |
| ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <8 x ptr> poison, ptr [[PL]], i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x ptr> [[TMP1]], <8 x ptr> poison, <8 x i32> zeroinitializer |
| ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, <8 x ptr> [[TMP2]], <8 x i64> <i64 1, i64 2, i64 3, i64 100, i64 101, i64 102, i64 103, i64 200> |
| ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, <8 x ptr> [[TMP2]], <8 x i64> <i64 201, i64 202, i64 203, i64 300, i64 301, i64 302, i64 303, i64 400> |
| ; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 1 |
| ; CHECK-NEXT: [[TMP5:%.*]] = call <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr> align 1 [[TMP3]], <8 x i1> splat (i1 true), <8 x i8> poison) |
| ; CHECK-NEXT: [[TMP6:%.*]] = call <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr> align 1 [[TMP4]], <8 x i1> splat (i1 true), <8 x i8> poison) |
| ; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <8 x i8> [[TMP6]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> [[TMP6]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> |
| ; CHECK-NEXT: store <16 x i8> [[TMP9]], ptr [[GEP_S1]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 1 |
| %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 2 |
| %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 3 |
| %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 100 |
| %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 101 |
| %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 102 |
| %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 103 |
| %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 200 |
| %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 201 |
| %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 202 |
| %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 203 |
| %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 300 |
| %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 301 |
| %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 302 |
| %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 303 |
| %gep_l16 = getelementptr inbounds i8, ptr %pl, i64 400 |
| |
| ; %load0 = load i8, ptr %gep_l0 , align 1 |
| %load1 = load i8, ptr %gep_l1 , align 1 |
| %load2 = load i8, ptr %gep_l2 , align 1 |
| %load3 = load i8, ptr %gep_l3 , align 1 |
| %load4 = load i8, ptr %gep_l4 , align 1 |
| %load5 = load i8, ptr %gep_l5 , align 1 |
| %load6 = load i8, ptr %gep_l6 , align 1 |
| %load7 = load i8, ptr %gep_l7 , align 1 |
| %load8 = load i8, ptr %gep_l8 , align 1 |
| %load9 = load i8, ptr %gep_l9 , align 1 |
| %load10 = load i8, ptr %gep_l10, align 1 |
| %load11 = load i8, ptr %gep_l11, align 1 |
| %load12 = load i8, ptr %gep_l12, align 1 |
| %load13 = load i8, ptr %gep_l13, align 1 |
| %load14 = load i8, ptr %gep_l14, align 1 |
| %load15 = load i8, ptr %gep_l15, align 1 |
| %load16 = load i8, ptr %gep_l16, align 1 |
| |
| ; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0 |
| %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1 |
| %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2 |
| %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3 |
| %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4 |
| %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5 |
| %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6 |
| %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7 |
| %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8 |
| %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9 |
| %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10 |
| %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11 |
| %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12 |
| %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13 |
| %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14 |
| %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15 |
| %gep_s16 = getelementptr inbounds i8, ptr %ps, i64 16 |
| |
| ; store i8 %load0, ptr %gep_s0, align 1 |
| store i8 %load1, ptr %gep_s1, align 1 |
| store i8 %load2, ptr %gep_s2, align 1 |
| store i8 %load3, ptr %gep_s3, align 1 |
| store i8 %load4, ptr %gep_s4, align 1 |
| store i8 %load5, ptr %gep_s5, align 1 |
| store i8 %load6, ptr %gep_s6, align 1 |
| store i8 %load7, ptr %gep_s7, align 1 |
| store i8 %load8, ptr %gep_s8, align 1 |
| store i8 %load9, ptr %gep_s9, align 1 |
| store i8 %load10, ptr %gep_s10, align 1 |
| store i8 %load11, ptr %gep_s11, align 1 |
| store i8 %load12, ptr %gep_s12, align 1 |
| store i8 %load13, ptr %gep_s13, align 1 |
| store i8 %load14, ptr %gep_s14, align 1 |
| store i8 %load15, ptr %gep_s15, align 1 |
| store i8 %load16, ptr %gep_s16, align 1 |
| |
| ret void |
| } |
| |
| define void @constant_stride_widen_rotatedn_1(ptr %pl, i64 %stride, ptr %ps) { |
| ; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 0 |
| ; %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 1 |
| ; %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 2 |
| ; CHECK-LABEL: define void @constant_stride_widen_rotatedn_1( |
| ; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] { |
| ; CHECK-NEXT: [[TMP1:%.*]] = insertelement <8 x ptr> poison, ptr [[PL]], i64 0 |
| ; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x ptr> [[TMP1]], <8 x ptr> poison, <8 x i32> zeroinitializer |
| ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, <8 x ptr> [[TMP2]], <8 x i64> <i64 3, i64 100, i64 101, i64 102, i64 103, i64 200, i64 201, i64 202> |
| ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, <8 x ptr> [[TMP2]], <8 x i64> <i64 203, i64 300, i64 301, i64 302, i64 303, i64 400, i64 401, i64 402> |
| ; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 3 |
| ; CHECK-NEXT: [[TMP5:%.*]] = call <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr> align 1 [[TMP3]], <8 x i1> splat (i1 true), <8 x i8> poison) |
| ; CHECK-NEXT: [[TMP6:%.*]] = call <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr> align 1 [[TMP4]], <8 x i1> splat (i1 true), <8 x i8> poison) |
| ; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <8 x i8> [[TMP6]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i8> [[TMP5]], <8 x i8> [[TMP6]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> |
| ; CHECK-NEXT: store <16 x i8> [[TMP9]], ptr [[GEP_S3]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 3 |
| %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 100 |
| %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 101 |
| %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 102 |
| %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 103 |
| %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 200 |
| %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 201 |
| %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 202 |
| %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 203 |
| %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 300 |
| %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 301 |
| %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 302 |
| %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 303 |
| %gep_l16 = getelementptr inbounds i8, ptr %pl, i64 400 |
| %gep_l17 = getelementptr inbounds i8, ptr %pl, i64 401 |
| %gep_l18 = getelementptr inbounds i8, ptr %pl, i64 402 |
| |
| ; %load0 = load i8, ptr %gep_l0 , align 1 |
| ; %load1 = load i8, ptr %gep_l1 , align 1 |
| ; %load2 = load i8, ptr %gep_l2 , align 1 |
| %load3 = load i8, ptr %gep_l3 , align 1 |
| %load4 = load i8, ptr %gep_l4 , align 1 |
| %load5 = load i8, ptr %gep_l5 , align 1 |
| %load6 = load i8, ptr %gep_l6 , align 1 |
| %load7 = load i8, ptr %gep_l7 , align 1 |
| %load8 = load i8, ptr %gep_l8 , align 1 |
| %load9 = load i8, ptr %gep_l9 , align 1 |
| %load10 = load i8, ptr %gep_l10, align 1 |
| %load11 = load i8, ptr %gep_l11, align 1 |
| %load12 = load i8, ptr %gep_l12, align 1 |
| %load13 = load i8, ptr %gep_l13, align 1 |
| %load14 = load i8, ptr %gep_l14, align 1 |
| %load15 = load i8, ptr %gep_l15, align 1 |
| %load16 = load i8, ptr %gep_l16, align 1 |
| %load17 = load i8, ptr %gep_l17, align 1 |
| %load18 = load i8, ptr %gep_l18, align 1 |
| |
| ; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0 |
| ; %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1 |
| ; %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2 |
| %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3 |
| %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4 |
| %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5 |
| %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6 |
| %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7 |
| %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8 |
| %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9 |
| %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10 |
| %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11 |
| %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12 |
| %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13 |
| %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14 |
| %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15 |
| %gep_s16 = getelementptr inbounds i8, ptr %ps, i64 16 |
| %gep_s17 = getelementptr inbounds i8, ptr %ps, i64 17 |
| %gep_s18 = getelementptr inbounds i8, ptr %ps, i64 18 |
| |
| ; store i8 %load0, ptr %gep_s0, align 1 |
| ; store i8 %load1, ptr %gep_s1, align 1 |
| ; store i8 %load2, ptr %gep_s2, align 1 |
| store i8 %load3, ptr %gep_s3, align 1 |
| store i8 %load4, ptr %gep_s4, align 1 |
| store i8 %load5, ptr %gep_s5, align 1 |
| store i8 %load6, ptr %gep_s6, align 1 |
| store i8 %load7, ptr %gep_s7, align 1 |
| store i8 %load8, ptr %gep_s8, align 1 |
| store i8 %load9, ptr %gep_s9, align 1 |
| store i8 %load10, ptr %gep_s10, align 1 |
| store i8 %load11, ptr %gep_s11, align 1 |
| store i8 %load12, ptr %gep_s12, align 1 |
| store i8 %load13, ptr %gep_s13, align 1 |
| store i8 %load14, ptr %gep_s14, align 1 |
| store i8 %load15, ptr %gep_s15, align 1 |
| store i8 %load16, ptr %gep_s16, align 1 |
| store i8 %load17, ptr %gep_s17, align 1 |
| store i8 %load18, ptr %gep_s18, align 1 |
| |
| ret void |
| } |
| |
| define void @rt_stride_widen_rotate1(ptr %pl, i64 %stride, ptr %ps) { |
| ; CHECK-LABEL: define void @rt_stride_widen_rotate1( |
| ; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] { |
| ; CHECK-NEXT: [[OFFSET0:%.*]] = mul nsw i64 [[STRIDE]], 0 |
| ; CHECK-NEXT: [[OFFSET1:%.*]] = add nsw i64 [[OFFSET0]], 1 |
| ; CHECK-NEXT: [[OFFSET2:%.*]] = add nsw i64 [[OFFSET0]], 2 |
| ; CHECK-NEXT: [[OFFSET4:%.*]] = mul nsw i64 [[STRIDE]], 1 |
| ; CHECK-NEXT: [[OFFSET6:%.*]] = add nsw i64 [[OFFSET4]], 2 |
| ; CHECK-NEXT: [[OFFSET8:%.*]] = mul nsw i64 [[STRIDE]], 2 |
| ; CHECK-NEXT: [[OFFSET10:%.*]] = add nsw i64 [[OFFSET8]], 2 |
| ; CHECK-NEXT: [[OFFSET12:%.*]] = mul nsw i64 [[STRIDE]], 3 |
| ; CHECK-NEXT: [[OFFSET14:%.*]] = add nsw i64 [[OFFSET12]], 2 |
| ; CHECK-NEXT: [[OFFSET16:%.*]] = mul nsw i64 [[STRIDE]], 4 |
| ; CHECK-NEXT: [[GEP_L1:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET1]] |
| ; CHECK-NEXT: [[GEP_L2:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET2]] |
| ; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET4]] |
| ; CHECK-NEXT: [[GEP_L6:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET6]] |
| ; CHECK-NEXT: [[GEP_L8:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET8]] |
| ; CHECK-NEXT: [[GEP_L10:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET10]] |
| ; CHECK-NEXT: [[GEP_L12:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET12]] |
| ; CHECK-NEXT: [[GEP_L14:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET14]] |
| ; CHECK-NEXT: [[GEP_L16:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET16]] |
| ; CHECK-NEXT: [[LOAD1:%.*]] = load i8, ptr [[GEP_L1]], align 1 |
| ; CHECK-NEXT: [[LOAD16:%.*]] = load i8, ptr [[GEP_L16]], align 1 |
| ; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 1 |
| ; CHECK-NEXT: [[GEP_S2:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 2 |
| ; CHECK-NEXT: [[GEP_S10:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 10 |
| ; CHECK-NEXT: [[GEP_S14:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 14 |
| ; CHECK-NEXT: [[GEP_S16:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 16 |
| ; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i8>, ptr [[GEP_L2]], align 1 |
| ; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i8>, ptr [[GEP_L4]], align 1 |
| ; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i8>, ptr [[GEP_L6]], align 1 |
| ; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i8>, ptr [[GEP_L8]], align 1 |
| ; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x i8> [[TMP2]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <2 x i8> [[TMP1]], <2 x i8> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <2 x i8> [[TMP3]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i8> [[TMP7]], <8 x i8> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <2 x i8> [[TMP4]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <8 x i8> [[TMP9]], <8 x i8> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 8, i32 9> |
| ; CHECK-NEXT: [[TMP12:%.*]] = load <2 x i8>, ptr [[GEP_L10]], align 1 |
| ; CHECK-NEXT: [[TMP13:%.*]] = load <2 x i8>, ptr [[GEP_L12]], align 1 |
| ; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <2 x i8> [[TMP12]], <2 x i8> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP15:%.*]] = shufflevector <2 x i8> [[TMP13]], <2 x i8> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison> |
| ; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <2 x i8> [[TMP12]], <2 x i8> [[TMP13]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> |
| ; CHECK-NEXT: [[TMP17:%.*]] = load <2 x i8>, ptr [[GEP_L14]], align 1 |
| ; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 |
| ; CHECK-NEXT: store <8 x i8> [[TMP11]], ptr [[GEP_S2]], align 1 |
| ; CHECK-NEXT: store <4 x i8> [[TMP16]], ptr [[GEP_S10]], align 1 |
| ; CHECK-NEXT: store <2 x i8> [[TMP17]], ptr [[GEP_S14]], align 1 |
| ; CHECK-NEXT: store i8 [[LOAD16]], ptr [[GEP_S16]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %offset0 = mul nsw i64 %stride, 0 |
| %offset1 = add nsw i64 %offset0, 1 |
| %offset2 = add nsw i64 %offset0, 2 |
| %offset3 = add nsw i64 %offset0, 3 |
| %offset4 = mul nsw i64 %stride, 1 |
| %offset5 = add nsw i64 %offset4, 1 |
| %offset6 = add nsw i64 %offset4, 2 |
| %offset7 = add nsw i64 %offset4, 3 |
| %offset8 = mul nsw i64 %stride, 2 |
| %offset9 = add nsw i64 %offset8, 1 |
| %offset10 = add nsw i64 %offset8, 2 |
| %offset11 = add nsw i64 %offset8, 3 |
| %offset12 = mul nsw i64 %stride, 3 |
| %offset13 = add nsw i64 %offset12, 1 |
| %offset14 = add nsw i64 %offset12, 2 |
| %offset15 = add nsw i64 %offset12, 3 |
| %offset16 = mul nsw i64 %stride, 4 |
| |
| ; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %offset0 |
| %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 %offset1 |
| %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 %offset2 |
| %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 %offset3 |
| %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 %offset4 |
| %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 %offset5 |
| %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 %offset6 |
| %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 %offset7 |
| %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 %offset8 |
| %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 %offset9 |
| %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 %offset10 |
| %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 %offset11 |
| %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 %offset12 |
| %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 %offset13 |
| %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 %offset14 |
| %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 %offset15 |
| %gep_l16 = getelementptr inbounds i8, ptr %pl, i64 %offset16 |
| |
| ; %load0 = load i8, ptr %gep_l0 , align 1 |
| %load1 = load i8, ptr %gep_l1 , align 1 |
| %load2 = load i8, ptr %gep_l2 , align 1 |
| %load3 = load i8, ptr %gep_l3 , align 1 |
| %load4 = load i8, ptr %gep_l4 , align 1 |
| %load5 = load i8, ptr %gep_l5 , align 1 |
| %load6 = load i8, ptr %gep_l6 , align 1 |
| %load7 = load i8, ptr %gep_l7 , align 1 |
| %load8 = load i8, ptr %gep_l8 , align 1 |
| %load9 = load i8, ptr %gep_l9 , align 1 |
| %load10 = load i8, ptr %gep_l10, align 1 |
| %load11 = load i8, ptr %gep_l11, align 1 |
| %load12 = load i8, ptr %gep_l12, align 1 |
| %load13 = load i8, ptr %gep_l13, align 1 |
| %load14 = load i8, ptr %gep_l14, align 1 |
| %load15 = load i8, ptr %gep_l15, align 1 |
| %load16 = load i8, ptr %gep_l16, align 1 |
| |
| ; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0 |
| %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1 |
| %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2 |
| %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3 |
| %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4 |
| %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5 |
| %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6 |
| %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7 |
| %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8 |
| %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9 |
| %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10 |
| %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11 |
| %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12 |
| %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13 |
| %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14 |
| %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15 |
| %gep_s16 = getelementptr inbounds i8, ptr %ps, i64 16 |
| |
| ; store i8 %load0, ptr %gep_s0, align 1 |
| store i8 %load1, ptr %gep_s1, align 1 |
| store i8 %load2, ptr %gep_s2, align 1 |
| store i8 %load3, ptr %gep_s3, align 1 |
| store i8 %load4, ptr %gep_s4, align 1 |
| store i8 %load5, ptr %gep_s5, align 1 |
| store i8 %load6, ptr %gep_s6, align 1 |
| store i8 %load7, ptr %gep_s7, align 1 |
| store i8 %load8, ptr %gep_s8, align 1 |
| store i8 %load9, ptr %gep_s9, align 1 |
| store i8 %load10, ptr %gep_s10, align 1 |
| store i8 %load11, ptr %gep_s11, align 1 |
| store i8 %load12, ptr %gep_s12, align 1 |
| store i8 %load13, ptr %gep_s13, align 1 |
| store i8 %load14, ptr %gep_s14, align 1 |
| store i8 %load15, ptr %gep_s15, align 1 |
| store i8 %load16, ptr %gep_s16, align 1 |
| |
| ret void |
| } |
| |
| define void @rt_stride_widen_rotaten_1(ptr %pl, i64 %stride, ptr %ps) { |
| ; CHECK-LABEL: define void @rt_stride_widen_rotaten_1( |
| ; CHECK-SAME: ptr [[PL:%.*]], i64 [[STRIDE:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] { |
| ; CHECK-NEXT: [[OFFSET0:%.*]] = mul nsw i64 [[STRIDE]], 0 |
| ; CHECK-NEXT: [[OFFSET1:%.*]] = add nsw i64 [[OFFSET0]], 1 |
| ; CHECK-NEXT: [[OFFSET2:%.*]] = add nsw i64 [[OFFSET0]], 2 |
| ; CHECK-NEXT: [[OFFSET3:%.*]] = add nsw i64 [[OFFSET0]], 3 |
| ; CHECK-NEXT: [[OFFSET4:%.*]] = mul nsw i64 [[STRIDE]], 1 |
| ; CHECK-NEXT: [[OFFSET12:%.*]] = mul nsw i64 [[STRIDE]], 3 |
| ; CHECK-NEXT: [[OFFSET16:%.*]] = mul nsw i64 [[STRIDE]], 4 |
| ; CHECK-NEXT: [[OFFSET18:%.*]] = add nsw i64 [[OFFSET16]], 2 |
| ; CHECK-NEXT: [[GEP_L3:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET3]] |
| ; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET4]] |
| ; CHECK-NEXT: [[GEP_L12:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET12]] |
| ; CHECK-NEXT: [[GEP_L16:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET16]] |
| ; CHECK-NEXT: [[GEP_L18:%.*]] = getelementptr inbounds i8, ptr [[PL]], i64 [[OFFSET18]] |
| ; CHECK-NEXT: [[LOAD3:%.*]] = load i8, ptr [[GEP_L3]], align 1 |
| ; CHECK-NEXT: [[LOAD18:%.*]] = load i8, ptr [[GEP_L18]], align 1 |
| ; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 3 |
| ; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 4 |
| ; CHECK-NEXT: [[GEP_S12:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 12 |
| ; CHECK-NEXT: [[GEP_S16:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 16 |
| ; CHECK-NEXT: [[GEP_S18:%.*]] = getelementptr inbounds i8, ptr [[PS]], i64 18 |
| ; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[STRIDE]], 1 |
| ; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i32> @llvm.experimental.vp.strided.load.v2i32.p0.i64(ptr align 1 [[GEP_L4]], i64 [[TMP1]], <2 x i1> splat (i1 true), i32 2) |
| ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i32> [[TMP2]] to <8 x i8> |
| ; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i8>, ptr [[GEP_L12]], align 1 |
| ; CHECK-NEXT: [[TMP5:%.*]] = load <2 x i8>, ptr [[GEP_L16]], align 1 |
| ; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 |
| ; CHECK-NEXT: store <8 x i8> [[TMP3]], ptr [[GEP_S4]], align 1 |
| ; CHECK-NEXT: store <4 x i8> [[TMP4]], ptr [[GEP_S12]], align 1 |
| ; CHECK-NEXT: store <2 x i8> [[TMP5]], ptr [[GEP_S16]], align 1 |
| ; CHECK-NEXT: store i8 [[LOAD18]], ptr [[GEP_S18]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %offset0 = mul nsw i64 %stride, 0 |
| %offset1 = add nsw i64 %offset0, 1 |
| %offset2 = add nsw i64 %offset0, 2 |
| %offset3 = add nsw i64 %offset0, 3 |
| %offset4 = mul nsw i64 %stride, 1 |
| %offset5 = add nsw i64 %offset4, 1 |
| %offset6 = add nsw i64 %offset4, 2 |
| %offset7 = add nsw i64 %offset4, 3 |
| %offset8 = mul nsw i64 %stride, 2 |
| %offset9 = add nsw i64 %offset8, 1 |
| %offset10 = add nsw i64 %offset8, 2 |
| %offset11 = add nsw i64 %offset8, 3 |
| %offset12 = mul nsw i64 %stride, 3 |
| %offset13 = add nsw i64 %offset12, 1 |
| %offset14 = add nsw i64 %offset12, 2 |
| %offset15 = add nsw i64 %offset12, 3 |
| %offset16 = mul nsw i64 %stride, 4 |
| %offset17 = add nsw i64 %offset16, 1 |
| %offset18 = add nsw i64 %offset16, 2 |
| |
| ; %gep_l0 = getelementptr inbounds i8, ptr %pl, i64 %offset0 |
| ; %gep_l1 = getelementptr inbounds i8, ptr %pl, i64 %offset1 |
| ; %gep_l2 = getelementptr inbounds i8, ptr %pl, i64 %offset2 |
| %gep_l3 = getelementptr inbounds i8, ptr %pl, i64 %offset3 |
| %gep_l4 = getelementptr inbounds i8, ptr %pl, i64 %offset4 |
| %gep_l5 = getelementptr inbounds i8, ptr %pl, i64 %offset5 |
| %gep_l6 = getelementptr inbounds i8, ptr %pl, i64 %offset6 |
| %gep_l7 = getelementptr inbounds i8, ptr %pl, i64 %offset7 |
| %gep_l8 = getelementptr inbounds i8, ptr %pl, i64 %offset8 |
| %gep_l9 = getelementptr inbounds i8, ptr %pl, i64 %offset9 |
| %gep_l10 = getelementptr inbounds i8, ptr %pl, i64 %offset10 |
| %gep_l11 = getelementptr inbounds i8, ptr %pl, i64 %offset11 |
| %gep_l12 = getelementptr inbounds i8, ptr %pl, i64 %offset12 |
| %gep_l13 = getelementptr inbounds i8, ptr %pl, i64 %offset13 |
| %gep_l14 = getelementptr inbounds i8, ptr %pl, i64 %offset14 |
| %gep_l15 = getelementptr inbounds i8, ptr %pl, i64 %offset15 |
| %gep_l16 = getelementptr inbounds i8, ptr %pl, i64 %offset16 |
| %gep_l17 = getelementptr inbounds i8, ptr %pl, i64 %offset17 |
| %gep_l18 = getelementptr inbounds i8, ptr %pl, i64 %offset18 |
| |
| ; %load0 = load i8, ptr %gep_l0 , align 1 |
| ; %load1 = load i8, ptr %gep_l1 , align 1 |
| ; %load2 = load i8, ptr %gep_l2 , align 1 |
| %load3 = load i8, ptr %gep_l3 , align 1 |
| %load4 = load i8, ptr %gep_l4 , align 1 |
| %load5 = load i8, ptr %gep_l5 , align 1 |
| %load6 = load i8, ptr %gep_l6 , align 1 |
| %load7 = load i8, ptr %gep_l7 , align 1 |
| %load8 = load i8, ptr %gep_l8 , align 1 |
| %load9 = load i8, ptr %gep_l9 , align 1 |
| %load10 = load i8, ptr %gep_l10, align 1 |
| %load11 = load i8, ptr %gep_l11, align 1 |
| %load12 = load i8, ptr %gep_l12, align 1 |
| %load13 = load i8, ptr %gep_l13, align 1 |
| %load14 = load i8, ptr %gep_l14, align 1 |
| %load15 = load i8, ptr %gep_l15, align 1 |
| %load16 = load i8, ptr %gep_l16, align 1 |
| %load17 = load i8, ptr %gep_l17, align 1 |
| %load18 = load i8, ptr %gep_l18, align 1 |
| |
| ; %gep_s0 = getelementptr inbounds i8, ptr %ps, i64 0 |
| ; %gep_s1 = getelementptr inbounds i8, ptr %ps, i64 1 |
| ; %gep_s2 = getelementptr inbounds i8, ptr %ps, i64 2 |
| %gep_s3 = getelementptr inbounds i8, ptr %ps, i64 3 |
| %gep_s4 = getelementptr inbounds i8, ptr %ps, i64 4 |
| %gep_s5 = getelementptr inbounds i8, ptr %ps, i64 5 |
| %gep_s6 = getelementptr inbounds i8, ptr %ps, i64 6 |
| %gep_s7 = getelementptr inbounds i8, ptr %ps, i64 7 |
| %gep_s8 = getelementptr inbounds i8, ptr %ps, i64 8 |
| %gep_s9 = getelementptr inbounds i8, ptr %ps, i64 9 |
| %gep_s10 = getelementptr inbounds i8, ptr %ps, i64 10 |
| %gep_s11 = getelementptr inbounds i8, ptr %ps, i64 11 |
| %gep_s12 = getelementptr inbounds i8, ptr %ps, i64 12 |
| %gep_s13 = getelementptr inbounds i8, ptr %ps, i64 13 |
| %gep_s14 = getelementptr inbounds i8, ptr %ps, i64 14 |
| %gep_s15 = getelementptr inbounds i8, ptr %ps, i64 15 |
| %gep_s16 = getelementptr inbounds i8, ptr %ps, i64 16 |
| %gep_s17 = getelementptr inbounds i8, ptr %ps, i64 17 |
| %gep_s18 = getelementptr inbounds i8, ptr %ps, i64 18 |
| |
| ; store i8 %load0, ptr %gep_s0, align 1 |
| ; store i8 %load1, ptr %gep_s1, align 1 |
| ; store i8 %load2, ptr %gep_s2, align 1 |
| store i8 %load3, ptr %gep_s3, align 1 |
| store i8 %load4, ptr %gep_s4, align 1 |
| store i8 %load5, ptr %gep_s5, align 1 |
| store i8 %load6, ptr %gep_s6, align 1 |
| store i8 %load7, ptr %gep_s7, align 1 |
| store i8 %load8, ptr %gep_s8, align 1 |
| store i8 %load9, ptr %gep_s9, align 1 |
| store i8 %load10, ptr %gep_s10, align 1 |
| store i8 %load11, ptr %gep_s11, align 1 |
| store i8 %load12, ptr %gep_s12, align 1 |
| store i8 %load13, ptr %gep_s13, align 1 |
| store i8 %load14, ptr %gep_s14, align 1 |
| store i8 %load15, ptr %gep_s15, align 1 |
| store i8 %load16, ptr %gep_s16, align 1 |
| store i8 %load17, ptr %gep_s17, align 1 |
| store i8 %load18, ptr %gep_s18, align 1 |
| |
| ret void |
| } |