blob: 192669794e11f8b26c26429f0806bcfd1548a700 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -mtriple=riscv64 -mattr=+m,+v -passes=slp-vectorizer -S -slp-enable-strided-stores < %s | FileCheck %s
define void @constant_stride_2(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_2(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP1]], ptr align 1 [[GEP_S0]], i64 2, <8 x i1> splat (i1 true), i32 8)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 8
%gep_s5 = getelementptr i8, ptr %ps, i64 10
%gep_s6 = getelementptr i8, ptr %ps, i64 12
%gep_s7 = getelementptr i8, ptr %ps, i64 14
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @constant_stride_7(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_7(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP1]], ptr align 1 [[GEP_S0]], i64 7, <8 x i1> splat (i1 true), i32 8)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 7
%gep_s2 = getelementptr i8, ptr %ps, i64 14
%gep_s3 = getelementptr i8, ptr %ps, i64 21
%gep_s4 = getelementptr i8, ptr %ps, i64 28
%gep_s5 = getelementptr i8, ptr %ps, i64 35
%gep_s6 = getelementptr i8, ptr %ps, i64 42
%gep_s7 = getelementptr i8, ptr %ps, i64 49
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @constant_stride_0(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_0(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L1:%.*]] = getelementptr i8, ptr [[PL]], i64 1
; CHECK-NEXT: [[GEP_L2:%.*]] = getelementptr i8, ptr [[PL]], i64 2
; CHECK-NEXT: [[GEP_L3:%.*]] = getelementptr i8, ptr [[PL]], i64 3
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_L5:%.*]] = getelementptr i8, ptr [[PL]], i64 5
; CHECK-NEXT: [[GEP_L6:%.*]] = getelementptr i8, ptr [[PL]], i64 6
; CHECK-NEXT: [[GEP_L7:%.*]] = getelementptr i8, ptr [[PL]], i64 7
; CHECK-NEXT: [[LOAD0:%.*]] = load i8, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[LOAD1:%.*]] = load i8, ptr [[GEP_L1]], align 1
; CHECK-NEXT: [[LOAD2:%.*]] = load i8, ptr [[GEP_L2]], align 1
; CHECK-NEXT: [[LOAD3:%.*]] = load i8, ptr [[GEP_L3]], align 1
; CHECK-NEXT: [[LOAD4:%.*]] = load i8, ptr [[GEP_L4]], align 1
; CHECK-NEXT: [[LOAD5:%.*]] = load i8, ptr [[GEP_L5]], align 1
; CHECK-NEXT: [[LOAD6:%.*]] = load i8, ptr [[GEP_L6]], align 1
; CHECK-NEXT: [[LOAD7:%.*]] = load i8, ptr [[GEP_L7]], align 1
; CHECK-NEXT: store i8 [[LOAD0]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD1]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD2]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD3]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD4]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD5]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD6]], ptr [[PS]], align 1
; CHECK-NEXT: store i8 [[LOAD7]], ptr [[PS]], align 1
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
store i8 %load0, ptr %ps
store i8 %load1, ptr %ps
store i8 %load2, ptr %ps
store i8 %load3, ptr %ps
store i8 %load4, ptr %ps
store i8 %load5, ptr %ps
store i8 %load6, ptr %ps
store i8 %load7, ptr %ps
ret void
}
define void @two_constant_strides(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @two_constant_strides(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 9
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP1]], ptr align 1 [[GEP_S0]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S4]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 9
%gep_s5 = getelementptr i8, ptr %ps, i64 11
%gep_s6 = getelementptr i8, ptr %ps, i64 13
%gep_s7 = getelementptr i8, ptr %ps, i64 15
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @constant_strides_variable_gap(ptr %pl, ptr %ps, i64 %gap) {
; CHECK-LABEL: define void @constant_strides_variable_gap(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]], i64 [[GAP:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GAP_PS:%.*]] = getelementptr i8, ptr [[PS]], i64 [[GAP]]
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[GAP_PS]], i64 28
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S0]], i64 7, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP1]], ptr align 1 [[GEP_S4]], i64 7, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 7
%gep_s2 = getelementptr i8, ptr %ps, i64 14
%gep_s3 = getelementptr i8, ptr %ps, i64 21
%gap_ps = getelementptr i8, ptr %ps, i64 %gap
%gep_s4 = getelementptr i8, ptr %gap_ps, i64 28
%gep_s5 = getelementptr i8, ptr %gap_ps, i64 35
%gep_s6 = getelementptr i8, ptr %gap_ps, i64 42
%gep_s7 = getelementptr i8, ptr %gap_ps, i64 49
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @overlapping_strides(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @overlapping_strides(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 5
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP1]], ptr align 1 [[GEP_S0]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S4]], i64 3, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 5
%gep_s5 = getelementptr i8, ptr %ps, i64 8
%gep_s6 = getelementptr i8, ptr %ps, i64 11
%gep_s7 = getelementptr i8, ptr %ps, i64 14
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @constant_stride_unit_stride(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_unit_stride(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 8
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S0]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S4]], align 1
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 8
%gep_s5 = getelementptr i8, ptr %ps, i64 9
%gep_s6 = getelementptr i8, ptr %ps, i64 10
%gep_s7 = getelementptr i8, ptr %ps, i64 11
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @unit_stride_constant_stride(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @unit_stride_constant_stride(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 9
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S4]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 1
%gep_s2 = getelementptr i8, ptr %ps, i64 2
%gep_s3 = getelementptr i8, ptr %ps, i64 3
%gep_s4 = getelementptr i8, ptr %ps, i64 9
%gep_s5 = getelementptr i8, ptr %ps, i64 11
%gep_s6 = getelementptr i8, ptr %ps, i64 13
%gep_s7 = getelementptr i8, ptr %ps, i64 15
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @overlap(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @overlap(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 5
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP2]], ptr align 1 [[GEP_S4]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 1
%gep_s2 = getelementptr i8, ptr %ps, i64 2
%gep_s3 = getelementptr i8, ptr %ps, i64 3
%gep_s4 = getelementptr i8, ptr %ps, i64 5
%gep_s5 = getelementptr i8, ptr %ps, i64 7
%gep_s6 = getelementptr i8, ptr %ps, i64 9
%gep_s7 = getelementptr i8, ptr %ps, i64 11
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s7
ret void
}
define void @overlap2(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @overlap2(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L2:%.*]] = getelementptr i8, ptr [[PL]], i64 2
; CHECK-NEXT: [[GEP_L3:%.*]] = getelementptr i8, ptr [[PL]], i64 3
; CHECK-NEXT: [[LOAD2:%.*]] = load i8, ptr [[GEP_L2]], align 1
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S2:%.*]] = getelementptr i8, ptr [[PS]], i64 4
; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr i8, ptr [[PS]], i64 6
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L3]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v2i8.p0.i64(<2 x i8> [[TMP2]], ptr align 1 [[GEP_S0]], i64 2, <2 x i1> splat (i1 true), i32 2)
; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1
; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S3]], align 1
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 7
%gep_s5 = getelementptr i8, ptr %ps, i64 8
%gep_s6 = getelementptr i8, ptr %ps, i64 9
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s1
store i8 %load2, ptr %gep_s2
store i8 %load3, ptr %gep_s3
store i8 %load4, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
ret void
}
define void @vf_ordering_issue(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @vf_ordering_issue(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_L14:%.*]] = getelementptr i8, ptr [[PL]], i64 92
; 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: [[TMP5:%.*]] = getelementptr i8, <8 x ptr> [[TMP2]], <8 x i64> <i64 33, i64 4, i64 6, i64 8, i64 10, i64 13, i64 83, i64 32>
; CHECK-NEXT: [[GEP_L5:%.*]] = getelementptr i8, ptr [[PL]], i64 5
; CHECK-NEXT: [[GEP_L3:%.*]] = getelementptr i8, ptr [[PL]], i64 15
; CHECK-NEXT: [[GEP_L23:%.*]] = getelementptr i8, ptr [[PL]], i64 23
; CHECK-NEXT: [[LOAD14:%.*]] = load i8, ptr [[GEP_L14]], align 1
; CHECK-NEXT: [[LOAD23:%.*]] = load i8, ptr [[GEP_L23]], align 1
; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[GEP_S9:%.*]] = getelementptr i8, ptr [[PS]], i64 4
; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr i8, ptr [[PS]], i64 6
; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 9
; CHECK-NEXT: [[GEP_S23:%.*]] = getelementptr i8, ptr [[PS]], i64 38
; CHECK-NEXT: [[TMP4:%.*]] = call <8 x i8> @llvm.masked.gather.v8i8.v8p0(<8 x ptr> align 1 [[TMP5]], <8 x i1> splat (i1 true), <8 x i8> poison)
; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr [[GEP_L3]], align 1
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <8 x i8> [[TMP4]], <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: [[TMP7:%.*]] = shufflevector <8 x i8> [[TMP3]], <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> [[TMP4]], <8 x i8> [[TMP3]], <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: [[TMP9:%.*]] = add <16 x i8> [[TMP8]], <i8 0, i8 1, i8 1, i8 1, i8 1, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>
; CHECK-NEXT: [[TMP10:%.*]] = call <7 x i8> @llvm.masked.load.v7i8.p0(ptr align 1 [[GEP_L5]], <7 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true>, <7 x i8> poison)
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <7 x i8> [[TMP10]], <7 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>
; CHECK-NEXT: [[TMP12:%.*]] = add <4 x i8> [[TMP11]], splat (i8 1)
; CHECK-NEXT: [[TMP13:%.*]] = call <2 x i8> @llvm.experimental.vp.strided.load.v2i8.p0.i64(ptr align 1 [[GEP_S0]], i64 38, <2 x i1> splat (i1 true), i32 2)
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v2i8.p0.i64(<2 x i8> [[TMP13]], ptr align 1 [[GEP_S5]], i64 2, <2 x i1> splat (i1 true), i32 2)
; CHECK-NEXT: store i8 [[LOAD14]], ptr [[GEP_S9]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v4i8.p0.i64(<4 x i8> [[TMP12]], ptr align 1 [[GEP_S6]], i64 2, <4 x i1> splat (i1 true), i32 4)
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v16i8.p0.i64(<16 x i8> [[TMP9]], ptr align 1 [[GEP_S3]], i64 2, <16 x i1> splat (i1 true), i32 16)
; CHECK-NEXT: store i8 [[LOAD23]], ptr [[GEP_S23]], align 1
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 38
%gep_l2 = getelementptr i8, ptr %pl, i64 92
%gep_l3 = getelementptr i8, ptr %pl, i64 33
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%gep_l8 = getelementptr i8, ptr %pl, i64 8
%gep_l9 = getelementptr i8, ptr %pl, i64 9
%gep_l10 = getelementptr i8, ptr %pl, i64 10
%gep_l11 = getelementptr i8, ptr %pl, i64 11
%gep_l12 = getelementptr i8, ptr %pl, i64 13
%gep_l13 = getelementptr i8, ptr %pl, i64 83
%gep_l14 = getelementptr i8, ptr %pl, i64 32
%gep_l15 = getelementptr i8, ptr %pl, i64 15
%gep_l16 = getelementptr i8, ptr %pl, i64 16
%gep_l17 = getelementptr i8, ptr %pl, i64 17
%gep_l18 = getelementptr i8, ptr %pl, i64 18
%gep_l19 = getelementptr i8, ptr %pl, i64 19
%gep_l20 = getelementptr i8, ptr %pl, i64 20
%gep_l21 = getelementptr i8, ptr %pl, i64 21
%gep_l22 = getelementptr i8, ptr %pl, i64 22
%gep_l23 = getelementptr i8, ptr %pl, i64 23
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%load8 = load i8, ptr %gep_l8
%load9 = load i8, ptr %gep_l9
%load10 = load i8, ptr %gep_l10
%load11 = load i8, ptr %gep_l11
%load12 = load i8, ptr %gep_l12
%load13 = load i8, ptr %gep_l13
%load14 = load i8, ptr %gep_l14
%load15 = load i8, ptr %gep_l15
%load16 = load i8, ptr %gep_l16
%load17 = load i8, ptr %gep_l17
%load18 = load i8, ptr %gep_l18
%load19 = load i8, ptr %gep_l19
%load20 = load i8, ptr %gep_l20
%load21 = load i8, ptr %gep_l21
%load22 = load i8, ptr %gep_l22
%load23 = load i8, ptr %gep_l23
%add4 = add i8 %load4, 1
%add5 = add i8 %load5, 1
%add6 = add i8 %load6, 1
%add7 = add i8 %load7, 1
%add8 = add i8 %load8, 1
%add9 = add i8 %load9, 1
%add10 = add i8 %load10, 1
%add11 = add i8 %load11, 1
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 8
%gep_s5 = getelementptr i8, ptr %ps, i64 9
%gep_s6 = getelementptr i8, ptr %ps, i64 10
%gep_s7 = getelementptr i8, ptr %ps, i64 11
%gep_s8 = getelementptr i8, ptr %ps, i64 12
%gep_s9 = getelementptr i8, ptr %ps, i64 13
%gep_s10 = getelementptr i8, ptr %ps, i64 14
%gep_s11 = getelementptr i8, ptr %ps, i64 15
%gep_s12 = getelementptr i8, ptr %ps, i64 16
%gep_s13 = getelementptr i8, ptr %ps, i64 18
%gep_s14 = getelementptr i8, ptr %ps, i64 20
%gep_s15 = getelementptr i8, ptr %ps, i64 22
%gep_s16 = getelementptr i8, ptr %ps, i64 24
%gep_s17 = getelementptr i8, ptr %ps, i64 26
%gep_s18 = getelementptr i8, ptr %ps, i64 28
%gep_s19 = getelementptr i8, ptr %ps, i64 30
%gep_s20 = getelementptr i8, ptr %ps, i64 32
%gep_s21 = getelementptr i8, ptr %ps, i64 34
%gep_s22 = getelementptr i8, ptr %ps, i64 36
%gep_s23 = getelementptr i8, ptr %ps, i64 38
store i8 %load0 , ptr %gep_s0
store i8 %load1 , ptr %gep_s1
store i8 %load2 , ptr %gep_s2
store i8 %load3 , ptr %gep_s3
store i8 %add4 , ptr %gep_s4
store i8 %add5 , ptr %gep_s5
store i8 %add6 , ptr %gep_s6
store i8 %add7 , ptr %gep_s7
store i8 %add8 , ptr %gep_s8
store i8 %add9 , ptr %gep_s9
store i8 %add10 , ptr %gep_s10
store i8 %add11 , ptr %gep_s11
store i8 %load12 , ptr %gep_s12
store i8 %load13 , ptr %gep_s13
store i8 %load14 , ptr %gep_s14
store i8 %load15 , ptr %gep_s15
store i8 %load16 , ptr %gep_s16
store i8 %load17 , ptr %gep_s17
store i8 %load18 , ptr %gep_s18
store i8 %load19 , ptr %gep_s19
store i8 %load20 , ptr %gep_s20
store i8 %load21 , ptr %gep_s21
store i8 %load22 , ptr %gep_s22
store i8 %load23 , ptr %gep_s23
ret void
}
define void @constant_stride_reorder_data(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_reorder_data(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> [[TMP1]], <8 x i8> poison, <8 x i32> <i32 0, i32 2, i32 1, i32 7, i32 3, i32 5, i32 6, i32 4>
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP2]], ptr align 1 [[GEP_S0]], i64 2, <8 x i1> splat (i1 true), i32 8)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 8
%gep_s5 = getelementptr i8, ptr %ps, i64 10
%gep_s6 = getelementptr i8, ptr %ps, i64 12
%gep_s7 = getelementptr i8, ptr %ps, i64 14
store i8 %load0, ptr %gep_s0
store i8 %load2, ptr %gep_s1
store i8 %load1, ptr %gep_s2
store i8 %load7, ptr %gep_s3
store i8 %load3, ptr %gep_s4
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load4, ptr %gep_s7
ret void
}
define void @constant_stride_reorder_geps(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @constant_stride_reorder_geps(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[GEP_L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[GEP_L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> [[TMP1]], <8 x i8> poison, <8 x i32> <i32 0, i32 2, i32 1, i32 4, i32 7, i32 5, i32 6, i32 3>
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP2]], ptr align 1 [[GEP_S0]], i64 2, <8 x i1> splat (i1 true), i32 8)
; CHECK-NEXT: ret void
;
%gep_l0 = getelementptr i8, ptr %pl, i64 0
%gep_l1 = getelementptr i8, ptr %pl, i64 1
%gep_l2 = getelementptr i8, ptr %pl, i64 2
%gep_l3 = getelementptr i8, ptr %pl, i64 3
%gep_l4 = getelementptr i8, ptr %pl, i64 4
%gep_l5 = getelementptr i8, ptr %pl, i64 5
%gep_l6 = getelementptr i8, ptr %pl, i64 6
%gep_l7 = getelementptr i8, ptr %pl, i64 7
%load0 = load i8, ptr %gep_l0
%load1 = load i8, ptr %gep_l1
%load2 = load i8, ptr %gep_l2
%load3 = load i8, ptr %gep_l3
%load4 = load i8, ptr %gep_l4
%load5 = load i8, ptr %gep_l5
%load6 = load i8, ptr %gep_l6
%load7 = load i8, ptr %gep_l7
%gep_s0 = getelementptr i8, ptr %ps, i64 0
%gep_s1 = getelementptr i8, ptr %ps, i64 2
%gep_s2 = getelementptr i8, ptr %ps, i64 4
%gep_s3 = getelementptr i8, ptr %ps, i64 6
%gep_s4 = getelementptr i8, ptr %ps, i64 8
%gep_s5 = getelementptr i8, ptr %ps, i64 10
%gep_s6 = getelementptr i8, ptr %ps, i64 12
%gep_s7 = getelementptr i8, ptr %ps, i64 14
store i8 %load0, ptr %gep_s0
store i8 %load1, ptr %gep_s2
store i8 %load2, ptr %gep_s1
store i8 %load3, ptr %gep_s7
store i8 %load4, ptr %gep_s3
store i8 %load5, ptr %gep_s5
store i8 %load6, ptr %gep_s6
store i8 %load7, ptr %gep_s4
ret void
}
define void @reversed_addr_data_reorder(ptr %pl, ptr %ps) {
; CHECK-LABEL: define void @reversed_addr_data_reorder(
; CHECK-SAME: ptr [[PL:%.*]], ptr [[PS:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[L0:%.*]] = getelementptr i8, ptr [[PL]], i64 0
; CHECK-NEXT: [[S3:%.*]] = getelementptr i8, ptr [[PS]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[L0]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> [[TMP1]], <8 x i8> poison, <8 x i32> <i32 4, i32 5, i32 7, i32 2, i32 6, i32 1, i32 3, i32 0>
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP2]], ptr align 1 [[S3]], i64 2, <8 x i1> splat (i1 true), i32 8)
; CHECK-NEXT: ret void
;
%l0 = getelementptr i8, ptr %pl, i64 0
%l1 = getelementptr i8, ptr %pl, i64 1
%l2 = getelementptr i8, ptr %pl, i64 2
%l3 = getelementptr i8, ptr %pl, i64 3
%l4 = getelementptr i8, ptr %pl, i64 4
%l5 = getelementptr i8, ptr %pl, i64 5
%l6 = getelementptr i8, ptr %pl, i64 6
%l7 = getelementptr i8, ptr %pl, i64 7
%v0 = load i8, ptr %l0, align 1
%v1 = load i8, ptr %l1, align 1
%v2 = load i8, ptr %l2, align 1
%v3 = load i8, ptr %l3, align 1
%v4 = load i8, ptr %l4, align 1
%v5 = load i8, ptr %l5, align 1
%v6 = load i8, ptr %l6, align 1
%v7 = load i8, ptr %l7, align 1
%s0 = getelementptr i8, ptr %ps, i64 14
%s1 = getelementptr i8, ptr %ps, i64 12
%s2 = getelementptr i8, ptr %ps, i64 10
%s3 = getelementptr i8, ptr %ps, i64 8
%s4 = getelementptr i8, ptr %ps, i64 6
%s5 = getelementptr i8, ptr %ps, i64 4
%s6 = getelementptr i8, ptr %ps, i64 2
%s7 = getelementptr i8, ptr %ps, i64 0
store i8 %v0, ptr %s0, align 1
store i8 %v3, ptr %s1, align 1
store i8 %v1, ptr %s2, align 1
store i8 %v6, ptr %s3, align 1
store i8 %v2, ptr %s4, align 1
store i8 %v7, ptr %s5, align 1
store i8 %v5, ptr %s6, align 1
store i8 %v4, ptr %s7, align 1
ret void
}