| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: opt -mtriple=x86_64-- -passes=load-store-vectorizer -S -o - %s | FileCheck %s |
| |
| ; Two GEPs with different source element types and different strides |
| ; must not be vectorized. The byte offset cannot be constant. |
| define void @mismatched_stride(ptr %p, ptr %idx_ptr, ptr %out) { |
| ; CHECK-LABEL: define void @mismatched_stride( |
| ; CHECK-SAME: ptr [[P:%.*]], ptr [[IDX_PTR:%.*]], ptr [[OUT:%.*]]) { |
| ; CHECK-NEXT: [[X:%.*]] = load i32, ptr [[IDX_PTR]], align 4 |
| ; CHECK-NEXT: [[Y:%.*]] = add nsw i32 [[X]], 1 |
| ; CHECK-NEXT: [[SX:%.*]] = sext i32 [[X]] to i64 |
| ; CHECK-NEXT: [[SY:%.*]] = sext i32 [[Y]] to i64 |
| ; CHECK-NEXT: [[A:%.*]] = getelementptr i8, ptr [[P]], i64 [[SX]] |
| ; CHECK-NEXT: [[B:%.*]] = getelementptr i32, ptr [[P]], i64 [[SY]] |
| ; CHECK-NEXT: [[VA:%.*]] = load i8, ptr [[A]], align 2 |
| ; CHECK-NEXT: [[VB:%.*]] = load i8, ptr [[B]], align 2 |
| ; CHECK-NEXT: [[SUM:%.*]] = add i8 [[VA]], [[VB]] |
| ; CHECK-NEXT: store i8 [[SUM]], ptr [[OUT]], align 1 |
| ; CHECK-NEXT: ret void |
| ; |
| %x = load i32, ptr %idx_ptr |
| %y = add nsw i32 %x, 1 |
| %sx = sext i32 %x to i64 |
| %sy = sext i32 %y to i64 |
| %a = getelementptr i8, ptr %p, i64 %sx |
| %b = getelementptr i32, ptr %p, i64 %sy |
| %va = load i8, ptr %a, align 2 |
| %vb = load i8, ptr %b, align 2 |
| %sum = add i8 %va, %vb |
| store i8 %sum, ptr %out |
| ret void |
| } |
| |
| ; the last operand strides match, but the first doesn't |
| define i32 @mismatched_stride_vec(ptr %p, i64 %i, i32 %x) { |
| ; CHECK-LABEL: define i32 @mismatched_stride_vec( |
| ; CHECK-SAME: ptr [[P:%.*]], i64 [[I:%.*]], i32 [[X:%.*]]) { |
| ; CHECK-NEXT: [[Y:%.*]] = add nsw i32 [[X]], 1 |
| ; CHECK-NEXT: [[SX:%.*]] = sext i32 [[X]] to i64 |
| ; CHECK-NEXT: [[SY:%.*]] = sext i32 [[Y]] to i64 |
| ; CHECK-NEXT: [[A:%.*]] = getelementptr [4 x i32], ptr [[P]], i64 [[I]], i64 [[SX]] |
| ; CHECK-NEXT: [[B:%.*]] = getelementptr [8 x i32], ptr [[P]], i64 [[I]], i64 [[SY]] |
| ; CHECK-NEXT: [[VA1:%.*]] = load i32, ptr [[A]], align 4 |
| ; CHECK-NEXT: [[VB2:%.*]] = load i32, ptr [[B]], align 4 |
| ; CHECK-NEXT: [[SUM:%.*]] = add i32 [[VA1]], [[VB2]] |
| ; CHECK-NEXT: ret i32 [[SUM]] |
| ; |
| %y = add nsw i32 %x, 1 |
| %sx = sext i32 %x to i64 |
| %sy = sext i32 %y to i64 |
| %a = getelementptr [4 x i32], ptr %p, i64 %i, i64 %sx |
| %b = getelementptr [8 x i32], ptr %p, i64 %i, i64 %sy |
| %va = load i32, ptr %a, align 4 |
| %vb = load i32, ptr %b, align 4 |
| %sum = add i32 %va, %vb |
| ret i32 %sum |
| } |