blob: 9e7a2f236d86b9dd1b279f92882ce7284f93ff91 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -passes=sandbox-vectorizer -sbvec-vec-reg-bits=1024 -sbvec-allow-non-pow2 -sbvec-collect-seeds=loads -sbvec-passes="seed-collection<tr-save,bottom-up-vec(top-down),tr-accept>" %s -S | FileCheck %s
define void @load_fadd_store(ptr %ptr, ptr %ptr2) {
; CHECK-LABEL: define void @load_fadd_store(
; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTR2:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META0:![0-9]+]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[VECL]], !sandboxvec [[META0]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%fadd0 = fadd float %ld0, %ld0
%fadd1 = fadd float %ld1, %ld1
ret void
}
define void @load_chain_store(ptr %ptr, ptr %ptr2) {
; CHECK-LABEL: define void @load_chain_store(
; CHECK-SAME: ptr [[PTR:%.*]], ptr [[PTR2:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META1:![0-9]+]]
; CHECK-NEXT: [[VEC:%.*]] = fmul <2 x float> [[VECL]], splat (float 3.000000e+00), !sandboxvec [[META1]]
; CHECK-NEXT: [[VEC1:%.*]] = fadd <2 x float> [[VEC]], splat (float 2.000000e+00), !sandboxvec [[META1]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%fmul0 = fmul float %ld0, 3.0
%fmul1 = fmul float %ld1, 3.0
%fadd0 = fadd float %fmul0, 2.0
%fadd1 = fadd float %fmul1, 2.0
ret void
}
define float @load_fadd_external_use(ptr %ptr) {
; CHECK-LABEL: define float @load_fadd_external_use(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META2:![0-9]+]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[VECL]], !sandboxvec [[META2]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VEC]], i32 0, !sandboxvec [[META2]]
; CHECK-NEXT: ret float [[UNPACK]]
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%fadd0 = fadd float %ld0, %ld0
%fadd1 = fadd float %ld1, %ld1
ret float %fadd0
}
define float @single_user_no_duplicate(ptr %ptr) {
; CHECK-LABEL: define float @single_user_no_duplicate(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META3:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META3]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META3]]
; CHECK-NEXT: [[FADD:%.*]] = fadd float [[UNPACK]], [[UNPACK1]]
; CHECK-NEXT: ret float [[FADD]]
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%fadd = fadd float %ld0, %ld1
ret float %fadd
}
define void @users_in_different_blocks(ptr %ptr, i1 %c) {
; CHECK-LABEL: define void @users_in_different_blocks(
; CHECK-SAME: ptr [[PTR:%.*]], i1 [[C:%.*]]) {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META4:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META4]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META4]]
; CHECK-NEXT: br i1 [[C]], label %[[BB0:.*]], label %[[BB1:.*]]
; CHECK: [[BB0]]:
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: ret void
; CHECK: [[BB1]]:
; CHECK-NEXT: [[FADD1:%.*]] = fadd float [[UNPACK1]], [[UNPACK1]]
; CHECK-NEXT: ret void
;
entry:
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
br i1 %c, label %if.then, label %if.else
if.then:
%fadd0 = fadd float %ld0, %ld0
ret void
if.else:
%fadd1 = fadd float %ld1, %ld1
ret void
}
define void @user_opcode_mismatch(ptr %ptr) {
; CHECK-LABEL: define void @user_opcode_mismatch(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META5:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META5]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META5]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[FMUL1:%.*]] = fmul float [[UNPACK1]], [[UNPACK1]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0 = fadd float %ld0, %ld0
%fmul1 = fmul float %ld1, %ld1
ret void
}
define void @user_type_mismatch(ptr %ptr) {
; CHECK-LABEL: define void @user_type_mismatch(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META6:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META6]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META6]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[EXT1:%.*]] = fpext float [[UNPACK1]] to double
; CHECK-NEXT: [[FADD1:%.*]] = fadd double [[EXT1]], [[EXT1]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0 = fadd float %ld0, %ld0
%ext1 = fpext float %ld1 to double
%fadd1 = fadd double %ext1, %ext1
ret void
}
define void @user_operand_index_mismatch(ptr %ptr, float %x) {
; CHECK-LABEL: define void @user_operand_index_mismatch(
; CHECK-SAME: ptr [[PTR:%.*]], float [[X:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META7:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META7]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META7]]
; CHECK-NEXT: [[FSUB0:%.*]] = fsub float [[UNPACK]], [[X]]
; CHECK-NEXT: [[FSUB1:%.*]] = fsub float [[X]], [[UNPACK1]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fsub0 = fsub float %ld0, %x
%fsub1 = fsub float %x, %ld1
ret void
}
define void @user_operand_index_mismatch_3wide(ptr %ptr, float %x) {
; CHECK-LABEL: define void @user_operand_index_mismatch_3wide(
; CHECK-SAME: ptr [[PTR:%.*]], float [[X:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META8:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <3 x float> [[VECL]], i32 0, !sandboxvec [[META8]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <3 x float> [[VECL]], i32 1, !sandboxvec [[META8]]
; CHECK-NEXT: [[UNPACK2:%.*]] = extractelement <3 x float> [[VECL]], i32 2, !sandboxvec [[META8]]
; CHECK-NEXT: [[FSUB0:%.*]] = fsub float [[UNPACK]], [[X]]
; CHECK-NEXT: [[FSUB1:%.*]] = fsub float [[X]], [[UNPACK1]]
; CHECK-NEXT: [[FSUB2:%.*]] = fsub float [[UNPACK2]], 0.000000e+00
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%ld2 = load float, ptr %ptr2, align 4
%fsub0 = fsub float %ld0, %x
%fsub1 = fsub float %x, %ld1
%fsub2 = fsub float %ld2, 0.0
ret void
}
define void @user_already_vectorized(ptr %ptr, float %a, float %b) {
; CHECK-LABEL: define void @user_already_vectorized(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0, !sandboxvec [[META9:![0-9]+]]
; CHECK-NEXT: [[PACK3:%.*]] = insertelement <2 x float> [[PACK2]], float [[A]], i32 1, !sandboxvec [[META9]]
; CHECK-NEXT: [[PACK:%.*]] = insertelement <2 x float> poison, float [[B]], i32 0, !sandboxvec [[META9]]
; CHECK-NEXT: [[PACK1:%.*]] = insertelement <2 x float> [[PACK]], float [[B]], i32 1, !sandboxvec [[META9]]
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META9]]
; CHECK-NEXT: [[VEC4:%.*]] = fadd <2 x float> [[VECL]], [[PACK3]], !sandboxvec [[META9]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[PACK1]], !sandboxvec [[META9]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0 = fadd float %ld0, %a
%fadd1 = fadd float %ld1, %a
%fadd0b = fadd float %ld0, %b
%fadd1b = fadd float %ld1, %b
ret void
}
define void @multiple_users_of_loads(ptr %ptr, float %a, float %b, float %c) {
; CHECK-LABEL: define void @multiple_users_of_loads(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]], float [[C:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK5:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0, !sandboxvec [[META10:![0-9]+]]
; CHECK-NEXT: [[PACK6:%.*]] = insertelement <2 x float> [[PACK5]], float [[A]], i32 1, !sandboxvec [[META10]]
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <2 x float> poison, float [[B]], i32 0, !sandboxvec [[META10]]
; CHECK-NEXT: [[PACK3:%.*]] = insertelement <2 x float> [[PACK2]], float [[B]], i32 1, !sandboxvec [[META10]]
; CHECK-NEXT: [[PACK:%.*]] = insertelement <2 x float> poison, float [[C]], i32 0, !sandboxvec [[META10]]
; CHECK-NEXT: [[PACK1:%.*]] = insertelement <2 x float> [[PACK]], float [[C]], i32 1, !sandboxvec [[META10]]
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META10]]
; CHECK-NEXT: [[VEC7:%.*]] = fadd <2 x float> [[VECL]], [[PACK6]], !sandboxvec [[META10]]
; CHECK-NEXT: [[VEC4:%.*]] = fadd <2 x float> [[VECL]], [[PACK3]], !sandboxvec [[META10]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[PACK1]], !sandboxvec [[META10]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0a = fadd float %ld0, %a
%fadd0b = fadd float %ld0, %b
%fadd0c = fadd float %ld0, %c
%fadd1a = fadd float %ld1, %a
%fadd1b = fadd float %ld1, %b
%fadd1c = fadd float %ld1, %c
ret void
}
define void @multiple_users_of_loads_diff_opcode(ptr %ptr, float %a, float %b) {
; CHECK-LABEL: define void @multiple_users_of_loads_diff_opcode(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK:%.*]] = insertelement <2 x float> poison, float [[B]], i32 0, !sandboxvec [[META11:![0-9]+]]
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <2 x float> [[PACK]], float [[B]], i32 1, !sandboxvec [[META11]]
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META11]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META11]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META11]]
; CHECK-NEXT: [[FADD0A:%.*]] = fadd float [[UNPACK]], [[A]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[PACK2]], !sandboxvec [[META11]]
; CHECK-NEXT: [[FSUB1A:%.*]] = fsub float [[UNPACK1]], [[A]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0a = fadd float %ld0, %a
%fadd0b = fadd float %ld0, %b
%fsub1a = fsub float %ld1, %a
%fadd1b = fadd float %ld1, %b
ret void
}
define void @users_in_arbitrary_order(ptr %ptr, float %a, float %b, float %c) {
; CHECK-LABEL: define void @users_in_arbitrary_order(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]], float [[C:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK8:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0, !sandboxvec [[META12:![0-9]+]]
; CHECK-NEXT: [[PACK9:%.*]] = insertelement <2 x float> [[PACK8]], float [[A]], i32 1, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK5:%.*]] = insertelement <2 x float> poison, float [[B]], i32 0, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK6:%.*]] = insertelement <2 x float> [[PACK5]], float [[B]], i32 1, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <2 x float> poison, float [[A]], i32 0, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK3:%.*]] = insertelement <2 x float> [[PACK2]], float [[A]], i32 1, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK:%.*]] = insertelement <2 x float> poison, float [[C]], i32 0, !sandboxvec [[META12]]
; CHECK-NEXT: [[PACK1:%.*]] = insertelement <2 x float> [[PACK]], float [[C]], i32 1, !sandboxvec [[META12]]
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META12]]
; CHECK-NEXT: [[VEC10:%.*]] = fadd <2 x float> [[VECL]], [[PACK9]], !sandboxvec [[META12]]
; CHECK-NEXT: [[VEC7:%.*]] = fadd <2 x float> [[VECL]], [[PACK6]], !sandboxvec [[META12]]
; CHECK-NEXT: [[VEC4:%.*]] = fsub <2 x float> [[VECL]], [[PACK3]], !sandboxvec [[META12]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <2 x float> [[VECL]], [[PACK1]], !sandboxvec [[META12]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0a = fadd float %ld0, %a
%fadd1a = fadd float %ld1, %a
%fadd0b = fadd float %ld0, %b
%fadd1b = fadd float %ld1, %b
%fsub0a = fsub float %ld0, %a
%fadd0c = fadd float %ld0, %c
%fadd1c = fadd float %ld1, %c
%fsub1a = fsub float %ld1, %a
ret void
}
define void @user_diff_fast_math_flags(ptr %ptr) {
; CHECK-LABEL: define void @user_diff_fast_math_flags(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META13:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META13]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META13]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd fast float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[FADD1:%.*]] = fadd float [[UNPACK1]], [[UNPACK1]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0 = fadd fast float %ld0, %ld0
%fadd1 = fadd float %ld1, %ld1
ret void
}
define void @user_diff_wrap_flags(ptr %ptr) {
; CHECK-LABEL: define void @user_diff_wrap_flags(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr i32, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x i32>, ptr [[PTR0]], align 4, !sandboxvec [[META14:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x i32> [[VECL]], i32 0, !sandboxvec [[META14]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x i32> [[VECL]], i32 1, !sandboxvec [[META14]]
; CHECK-NEXT: [[ADD0:%.*]] = add nsw i32 [[UNPACK]], 1
; CHECK-NEXT: [[ADD1:%.*]] = add i32 [[UNPACK1]], 1
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr i32, ptr %ptr, i32 0
%ptr1 = getelementptr i32, ptr %ptr, i32 1
%ld0 = load i32, ptr %ptr0, align 4
%ld1 = load i32, ptr %ptr1, align 4
%add0 = add nsw i32 %ld0, 1
%add1 = add i32 %ld1, 1
ret void
}
define void @user_duplicate_operand_other(ptr %ptr, float %other) {
; CHECK-LABEL: define void @user_duplicate_operand_other(
; CHECK-SAME: ptr [[PTR:%.*]], float [[OTHER:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META15:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <2 x float> [[VECL]], i32 0, !sandboxvec [[META15]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <2 x float> [[VECL]], i32 1, !sandboxvec [[META15]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[FADD1:%.*]] = fadd float [[UNPACK1]], [[OTHER]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
%fadd0 = fadd float %ld0, %ld0
%fadd1 = fadd float %ld1, %other
ret void
}
define void @user_stores_not_consecutive(ptr %ptr) {
; CHECK-LABEL: define void @user_stores_not_consecutive(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4, !sandboxvec [[META16:![0-9]+]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ld0 = load float, ptr %ptr0, align 4
%ld1 = load float, ptr %ptr1, align 4
ret void
}
; FIXME: Following test needs diamond reuse multi-input support in topdown
; vectorizer.
;define void @user_diamond_reuse_multi_input(ptr %ptr, ptr %ptr2) {
; %ptr0 = getelementptr float, ptr %ptr, i32 0
; %ptr1 = getelementptr float, ptr %ptr, i32 1
; %ptr2_0 = getelementptr float, ptr %ptr2, i32 0
; %ptr2_2 = getelementptr float, ptr %ptr2, i32 2
;
; %ld0 = load float, ptr %ptr0, align 4
; %ld1 = load float, ptr %ptr1, align 4
;
; %sub0 = fsub float %ld0, 0.000000e+00
; %sub1 = fsub float %ld1, 1.000000e+00
;
; %add0 = fadd float %ld0, 0.000000e+00
; %add1 = fadd float %ld1, 0.000000e+00
;
; %diam0 = fsub float %sub0, %add0
; %diam1 = fsub float %sub1, %add1
;
; store float %diam0, ptr %ptr2_0, align 4
; store float %diam1, ptr %ptr2_2, align 4
; ret void
;}
define void @load_fadd_store_3wide(ptr %ptr) {
; CHECK-LABEL: define void @load_fadd_store_3wide(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[G0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[G0]], align 4, !sandboxvec [[META17:![0-9]+]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <3 x float> [[VECL]], [[VECL]], !sandboxvec [[META17]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%ld2 = load float, ptr %ptr2
%fadd0 = fadd float %ld0, %ld0
%fadd1 = fadd float %ld1, %ld1
%fadd2 = fadd float %ld2, %ld2
ret void
}
define void @user_already_vectorized_3wide(ptr %ptr, float %a, float %b) {
; CHECK-LABEL: define void @user_already_vectorized_3wide(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]]) {
; CHECK-NEXT: [[G0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK3:%.*]] = insertelement <3 x float> poison, float [[A]], i32 0, !sandboxvec [[META18:![0-9]+]]
; CHECK-NEXT: [[PACK4:%.*]] = insertelement <3 x float> [[PACK3]], float [[A]], i32 1, !sandboxvec [[META18]]
; CHECK-NEXT: [[PACK5:%.*]] = insertelement <3 x float> [[PACK4]], float [[A]], i32 2, !sandboxvec [[META18]]
; CHECK-NEXT: [[PACK:%.*]] = insertelement <3 x float> poison, float [[B]], i32 0, !sandboxvec [[META18]]
; CHECK-NEXT: [[PACK1:%.*]] = insertelement <3 x float> [[PACK]], float [[B]], i32 1, !sandboxvec [[META18]]
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <3 x float> [[PACK1]], float [[B]], i32 2, !sandboxvec [[META18]]
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[G0]], align 4, !sandboxvec [[META18]]
; CHECK-NEXT: [[VEC6:%.*]] = fadd <3 x float> [[VECL]], [[PACK5]], !sandboxvec [[META18]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <3 x float> [[VECL]], [[PACK2]], !sandboxvec [[META18]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%ld2 = load float, ptr %ptr2
%fadd0a = fadd float %ld0, %a
%fadd0b = fadd float %ld0, %b
%fadd1a = fadd float %ld1, %a
%fadd1b = fadd float %ld1, %b
%fadd2a = fadd float %ld2, %a
%fadd2b = fadd float %ld2, %b
ret void
}
define void @user_opcode_mismatch_3wide(ptr %ptr) {
; CHECK-LABEL: define void @user_opcode_mismatch_3wide(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[G0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[G0]], align 4, !sandboxvec [[META19:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <3 x float> [[VECL]], i32 0, !sandboxvec [[META19]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <3 x float> [[VECL]], i32 1, !sandboxvec [[META19]]
; CHECK-NEXT: [[UNPACK2:%.*]] = extractelement <3 x float> [[VECL]], i32 2, !sandboxvec [[META19]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[FADD1:%.*]] = fadd float [[UNPACK1]], [[UNPACK1]]
; CHECK-NEXT: [[FMUL2:%.*]] = fmul float [[UNPACK2]], [[UNPACK2]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%ld2 = load float, ptr %ptr2
%fadd0 = fadd float %ld0, %ld0
%fadd1 = fadd float %ld1, %ld1
%fmul2 = fmul float %ld2, %ld2
ret void
}
define void @claimed_rollback_partial_bundle(ptr %ptr, float %a, float %b) {
; CHECK-LABEL: define void @claimed_rollback_partial_bundle(
; CHECK-SAME: ptr [[PTR:%.*]], float [[A:%.*]], float [[B:%.*]]) {
; CHECK-NEXT: [[G0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[PACK:%.*]] = insertelement <3 x float> poison, float [[B]], i32 0, !sandboxvec [[META20:![0-9]+]]
; CHECK-NEXT: [[PACK2:%.*]] = insertelement <3 x float> [[PACK]], float [[B]], i32 1, !sandboxvec [[META20]]
; CHECK-NEXT: [[PACK3:%.*]] = insertelement <3 x float> [[PACK2]], float [[B]], i32 2, !sandboxvec [[META20]]
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[G0]], align 4, !sandboxvec [[META20]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <3 x float> [[VECL]], i32 0, !sandboxvec [[META20]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <3 x float> [[VECL]], i32 1, !sandboxvec [[META20]]
; CHECK-NEXT: [[FADD0A:%.*]] = fadd float [[UNPACK]], [[A]]
; CHECK-NEXT: [[VEC:%.*]] = fadd <3 x float> [[VECL]], [[PACK3]], !sandboxvec [[META20]]
; CHECK-NEXT: [[FADD1A:%.*]] = fadd float [[UNPACK1]], [[A]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%ld2 = load float, ptr %ptr2
%fadd0a = fadd float %ld0, %a
%fadd0b = fadd float %ld0, %b
%fadd1a = fadd float %ld1, %a
%fadd1b = fadd float %ld1, %b
%fadd2b = fadd float %ld2, %b
ret void
}
define void @user_middle_lane_mismatch_3wide(ptr %ptr) {
; CHECK-LABEL: define void @user_middle_lane_mismatch_3wide(
; CHECK-SAME: ptr [[PTR:%.*]]) {
; CHECK-NEXT: [[G0:%.*]] = getelementptr float, ptr [[PTR]], i32 0
; CHECK-NEXT: [[VECL:%.*]] = load <3 x float>, ptr [[G0]], align 4, !sandboxvec [[META21:![0-9]+]]
; CHECK-NEXT: [[UNPACK:%.*]] = extractelement <3 x float> [[VECL]], i32 0, !sandboxvec [[META21]]
; CHECK-NEXT: [[UNPACK1:%.*]] = extractelement <3 x float> [[VECL]], i32 1, !sandboxvec [[META21]]
; CHECK-NEXT: [[UNPACK2:%.*]] = extractelement <3 x float> [[VECL]], i32 2, !sandboxvec [[META21]]
; CHECK-NEXT: [[FADD0:%.*]] = fadd float [[UNPACK]], [[UNPACK]]
; CHECK-NEXT: [[FMUL1:%.*]] = fmul float [[UNPACK1]], [[UNPACK1]]
; CHECK-NEXT: [[FADD2:%.*]] = fadd float [[UNPACK2]], [[UNPACK2]]
; CHECK-NEXT: ret void
;
%ptr0 = getelementptr float, ptr %ptr, i32 0
%ptr1 = getelementptr float, ptr %ptr, i32 1
%ptr2 = getelementptr float, ptr %ptr, i32 2
%ld0 = load float, ptr %ptr0
%ld1 = load float, ptr %ptr1
%ld2 = load float, ptr %ptr2
%fadd0 = fadd float %ld0, %ld0
%fmul1 = fmul float %ld1, %ld1
%fadd2 = fadd float %ld2, %ld2
ret void
}
;.
; CHECK: [[META0]] = distinct !{!"sandboxregion"}
; CHECK: [[META1]] = distinct !{!"sandboxregion"}
; CHECK: [[META2]] = distinct !{!"sandboxregion"}
; CHECK: [[META3]] = distinct !{!"sandboxregion"}
; CHECK: [[META4]] = distinct !{!"sandboxregion"}
; CHECK: [[META5]] = distinct !{!"sandboxregion"}
; CHECK: [[META6]] = distinct !{!"sandboxregion"}
; CHECK: [[META7]] = distinct !{!"sandboxregion"}
; CHECK: [[META8]] = distinct !{!"sandboxregion"}
; CHECK: [[META9]] = distinct !{!"sandboxregion"}
; CHECK: [[META10]] = distinct !{!"sandboxregion"}
; CHECK: [[META11]] = distinct !{!"sandboxregion"}
; CHECK: [[META12]] = distinct !{!"sandboxregion"}
; CHECK: [[META13]] = distinct !{!"sandboxregion"}
; CHECK: [[META14]] = distinct !{!"sandboxregion"}
; CHECK: [[META15]] = distinct !{!"sandboxregion"}
; CHECK: [[META16]] = distinct !{!"sandboxregion"}
; CHECK: [[META17]] = distinct !{!"sandboxregion"}
; CHECK: [[META18]] = distinct !{!"sandboxregion"}
; CHECK: [[META19]] = distinct !{!"sandboxregion"}
; CHECK: [[META20]] = distinct !{!"sandboxregion"}
; CHECK: [[META21]] = distinct !{!"sandboxregion"}
;.