blob: 8dfc40386bfbc6b0c43d4510264256722e5cfdb1 [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_L1:%.*]] = getelementptr i8, ptr [[PL]], i64 38
; CHECK-NEXT: [[GEP_L14:%.*]] = getelementptr i8, ptr [[PL]], i64 92
; CHECK-NEXT: [[GEP_S11:%.*]] = getelementptr i8, ptr [[PL]], i64 33
; CHECK-NEXT: [[GEP_L4:%.*]] = getelementptr i8, ptr [[PL]], i64 4
; CHECK-NEXT: [[GEP_L20:%.*]] = getelementptr i8, ptr [[PL]], i64 13
; CHECK-NEXT: [[GEP_L21:%.*]] = getelementptr i8, ptr [[PL]], i64 83
; CHECK-NEXT: [[GEP_L22:%.*]] = getelementptr i8, ptr [[PL]], i64 32
; CHECK-NEXT: [[GEP_L3:%.*]] = getelementptr i8, ptr [[PL]], i64 15
; CHECK-NEXT: [[GEP_L23:%.*]] = getelementptr i8, ptr [[PL]], i64 23
; CHECK-NEXT: [[LOAD5:%.*]] = load i8, ptr [[GEP_S0]], align 1
; CHECK-NEXT: [[LOAD7:%.*]] = load i8, ptr [[GEP_L1]], align 1
; CHECK-NEXT: [[LOAD14:%.*]] = load i8, ptr [[GEP_L14]], align 1
; CHECK-NEXT: [[LOAD15:%.*]] = load i8, ptr [[GEP_S11]], align 1
; CHECK-NEXT: [[LOAD20:%.*]] = load i8, ptr [[GEP_L20]], align 1
; CHECK-NEXT: [[LOAD21:%.*]] = load i8, ptr [[GEP_L21]], align 1
; CHECK-NEXT: [[LOAD22:%.*]] = load i8, ptr [[GEP_L22]], 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_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 2
; CHECK-NEXT: [[GEP_S9:%.*]] = getelementptr i8, ptr [[PS]], i64 4
; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr i8, ptr [[PS]], i64 6
; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 8
; CHECK-NEXT: [[GEP_S12:%.*]] = getelementptr i8, ptr [[PS]], i64 16
; CHECK-NEXT: [[GEP_S13:%.*]] = getelementptr i8, ptr [[PS]], i64 18
; CHECK-NEXT: [[GEP_S14:%.*]] = getelementptr i8, ptr [[PS]], i64 20
; CHECK-NEXT: [[GEP_S15:%.*]] = getelementptr i8, ptr [[PS]], i64 22
; CHECK-NEXT: [[GEP_S23:%.*]] = getelementptr i8, ptr [[PS]], i64 38
; CHECK-NEXT: [[TMP1:%.*]] = load <8 x i8>, ptr [[GEP_L4]], align 1
; CHECK-NEXT: [[TMP2:%.*]] = add <8 x i8> [[TMP1]], splat (i8 1)
; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr [[GEP_L3]], align 1
; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1
; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], align 1
; CHECK-NEXT: store i8 [[LOAD14]], ptr [[GEP_S9]], align 1
; CHECK-NEXT: store i8 [[LOAD15]], ptr [[GEP_S3]], align 1
; CHECK-NEXT: store <8 x i8> [[TMP2]], ptr [[GEP_S4]], align 1
; CHECK-NEXT: store i8 [[LOAD20]], ptr [[GEP_S12]], align 1
; CHECK-NEXT: store i8 [[LOAD21]], ptr [[GEP_S13]], align 1
; CHECK-NEXT: store i8 [[LOAD22]], ptr [[GEP_S14]], align 1
; CHECK-NEXT: call void @llvm.experimental.vp.strided.store.v8i8.p0.i64(<8 x i8> [[TMP3]], ptr align 1 [[GEP_S15]], i64 2, <8 x i1> splat (i1 true), i32 8)
; 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
}