From c56410fdc7aab4efd8024ed1cc83d30ccc04b5b6 Mon Sep 17 00:00:00 2001 From: Ryan Buchner Date: Wed, 11 Mar 2026 17:30:09 -0700 Subject: [PATCH] [SLP] Pre-commit tests for constant strided stores (#185990) Tests for #185964 --- .../RISCV/basic-strided-stores.ll | 879 ++++++++++++++++++ 1 file changed, 879 insertions(+) create mode 100644 llvm/test/Transforms/SLPVectorizer/RISCV/basic-strided-stores.ll diff --git a/llvm/test/Transforms/SLPVectorizer/RISCV/basic-strided-stores.ll b/llvm/test/Transforms/SLPVectorizer/RISCV/basic-strided-stores.ll new file mode 100644 index 000000000000..c32875ffa402 --- /dev/null +++ b/llvm/test/Transforms/SLPVectorizer/RISCV/basic-strided-stores.ll @@ -0,0 +1,879 @@ +; 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 < %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_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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 2 +; CHECK-NEXT: [[GEP_S2:%.*]] = 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_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 10 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 12 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 14 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 7 +; CHECK-NEXT: [[GEP_S2:%.*]] = getelementptr i8, ptr [[PS]], i64 14 +; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr i8, ptr [[PS]], i64 21 +; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 28 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 35 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 42 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 49 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 2 +; CHECK-NEXT: [[GEP_S2:%.*]] = 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 9 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 11 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 13 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 15 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 7 +; CHECK-NEXT: [[GEP_S2:%.*]] = getelementptr i8, ptr [[PS]], i64 14 +; CHECK-NEXT: [[GEP_S3:%.*]] = getelementptr i8, ptr [[PS]], i64 21 +; CHECK-NEXT: [[GAP_PS:%.*]] = getelementptr i8, ptr [[PS]], i64 [[GAP]] +; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[GAP_PS]], i64 28 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[GAP_PS]], i64 35 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[GAP_PS]], i64 42 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[GAP_PS]], i64 49 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 2 +; CHECK-NEXT: [[GEP_S2:%.*]] = 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 5 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 8 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 11 +; CHECK-NEXT: [[GEP_S8:%.*]] = getelementptr i8, ptr [[PS]], i64 14 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S7]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S8]], 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 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_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: [[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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 2 +; CHECK-NEXT: [[GEP_S2:%.*]] = 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: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L4]], align 1 +; CHECK-NEXT: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; CHECK-NEXT: store i8 [[LOAD2]], ptr [[GEP_S2]], align 1 +; CHECK-NEXT: store i8 [[LOAD3]], ptr [[GEP_S3]], align 1 +; 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_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: [[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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 9 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 11 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 13 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 15 +; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1 +; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S4:%.*]] = getelementptr i8, ptr [[PS]], i64 5 +; CHECK-NEXT: [[GEP_S5:%.*]] = getelementptr i8, ptr [[PS]], i64 7 +; CHECK-NEXT: [[GEP_S6:%.*]] = getelementptr i8, ptr [[PS]], i64 9 +; CHECK-NEXT: [[GEP_S7:%.*]] = getelementptr i8, ptr [[PS]], i64 11 +; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i8>, ptr [[GEP_L0]], align 1 +; CHECK-NEXT: store <4 x i8> [[TMP1]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD4]], ptr [[GEP_S4]], align 1 +; CHECK-NEXT: store i8 [[LOAD5]], ptr [[GEP_S5]], align 1 +; CHECK-NEXT: store i8 [[LOAD6]], ptr [[GEP_S6]], align 1 +; CHECK-NEXT: store i8 [[LOAD7]], ptr [[GEP_S7]], 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 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_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: [[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: [[GEP_S0:%.*]] = getelementptr i8, ptr [[PS]], i64 0 +; CHECK-NEXT: [[GEP_S1:%.*]] = getelementptr i8, ptr [[PS]], i64 2 +; 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: store i8 [[LOAD0]], ptr [[GEP_S0]], align 1 +; CHECK-NEXT: store i8 [[LOAD1]], ptr [[GEP_S1]], align 1 +; 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_L16:%.*]] = getelementptr i8, ptr [[PL]], i64 16 +; CHECK-NEXT: [[GEP_L18:%.*]] = getelementptr i8, ptr [[PL]], i64 17 +; CHECK-NEXT: [[GEP_L9:%.*]] = getelementptr i8, ptr [[PL]], i64 18 +; CHECK-NEXT: [[GEP_L19:%.*]] = getelementptr i8, ptr [[PL]], i64 19 +; CHECK-NEXT: [[GEP_L24:%.*]] = getelementptr i8, ptr [[PL]], i64 20 +; CHECK-NEXT: [[GEP_L25:%.*]] = getelementptr i8, ptr [[PL]], i64 21 +; CHECK-NEXT: [[GEP_L26:%.*]] = getelementptr i8, ptr [[PL]], i64 22 +; 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: [[LOAD17:%.*]] = load i8, ptr [[GEP_L3]], align 1 +; CHECK-NEXT: [[LOAD16:%.*]] = load i8, ptr [[GEP_L16]], align 1 +; CHECK-NEXT: [[LOAD18:%.*]] = load i8, ptr [[GEP_L18]], align 1 +; CHECK-NEXT: [[LOAD9:%.*]] = load i8, ptr [[GEP_L9]], align 1 +; CHECK-NEXT: [[LOAD19:%.*]] = load i8, ptr [[GEP_L19]], align 1 +; CHECK-NEXT: [[LOAD24:%.*]] = load i8, ptr [[GEP_L24]], align 1 +; CHECK-NEXT: [[LOAD25:%.*]] = load i8, ptr [[GEP_L25]], align 1 +; CHECK-NEXT: [[LOAD26:%.*]] = load i8, ptr [[GEP_L26]], 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_S16:%.*]] = getelementptr i8, ptr [[PS]], i64 24 +; CHECK-NEXT: [[GEP_S17:%.*]] = getelementptr i8, ptr [[PS]], i64 26 +; CHECK-NEXT: [[GEP_S18:%.*]] = getelementptr i8, ptr [[PS]], i64 28 +; CHECK-NEXT: [[GEP_S19:%.*]] = getelementptr i8, ptr [[PS]], i64 30 +; CHECK-NEXT: [[GEP_S20:%.*]] = getelementptr i8, ptr [[PS]], i64 32 +; CHECK-NEXT: [[GEP_S21:%.*]] = getelementptr i8, ptr [[PS]], i64 34 +; CHECK-NEXT: [[GEP_S22:%.*]] = getelementptr i8, ptr [[PS]], i64 36 +; 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: 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: store i8 [[LOAD17]], ptr [[GEP_S15]], align 1 +; CHECK-NEXT: store i8 [[LOAD16]], ptr [[GEP_S16]], align 1 +; CHECK-NEXT: store i8 [[LOAD18]], ptr [[GEP_S17]], align 1 +; CHECK-NEXT: store i8 [[LOAD9]], ptr [[GEP_S18]], align 1 +; CHECK-NEXT: store i8 [[LOAD19]], ptr [[GEP_S19]], align 1 +; CHECK-NEXT: store i8 [[LOAD24]], ptr [[GEP_S20]], align 1 +; CHECK-NEXT: store i8 [[LOAD25]], ptr [[GEP_S21]], align 1 +; CHECK-NEXT: store i8 [[LOAD26]], ptr [[GEP_S22]], align 1 +; 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 +}