blob: b037b329c9607e49ed204869fb52946169501c09 [file]
; 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
}