; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 ; RUN: opt -passes=sandbox-vectorizer -sbvec-passes="bottom-up-vec<>" %s -S | FileCheck %s define void @store_load(ptr %ptr) { ; CHECK-LABEL: define void @store_load( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4 ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4 ; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4 ; CHECK-NEXT: store float [[LD0]], ptr [[PTR0]], align 4 ; CHECK-NEXT: store float [[LD1]], ptr [[PTR1]], align 4 ; CHECK-NEXT: store <2 x float> [[VECL]], ptr [[PTR0]], align 4 ; 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 store float %ld0, ptr %ptr0 store float %ld1, ptr %ptr1 ret void } define void @store_fpext_load(ptr %ptr) { ; CHECK-LABEL: define void @store_fpext_load( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[PTRD0:%.*]] = getelementptr double, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTRD1:%.*]] = getelementptr double, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4 ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4 ; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4 ; CHECK-NEXT: [[FPEXT0:%.*]] = fpext float [[LD0]] to double ; CHECK-NEXT: [[FPEXT1:%.*]] = fpext float [[LD1]] to double ; CHECK-NEXT: [[VCAST:%.*]] = fpext <2 x float> [[VECL]] to <2 x double> ; CHECK-NEXT: store double [[FPEXT0]], ptr [[PTRD0]], align 8 ; CHECK-NEXT: store double [[FPEXT1]], ptr [[PTRD1]], align 8 ; CHECK-NEXT: store <2 x double> [[VCAST]], ptr [[PTRD0]], align 8 ; CHECK-NEXT: ret void ; %ptr0 = getelementptr float, ptr %ptr, i32 0 %ptr1 = getelementptr float, ptr %ptr, i32 1 %ptrd0 = getelementptr double, ptr %ptr, i32 0 %ptrd1 = getelementptr double, ptr %ptr, i32 1 %ld0 = load float, ptr %ptr0 %ld1 = load float, ptr %ptr1 %fpext0 = fpext float %ld0 to double %fpext1 = fpext float %ld1 to double store double %fpext0, ptr %ptrd0 store double %fpext1, ptr %ptrd1 ret void } ; TODO: Test store_zext_fcmp_load once we implement scheduler callbacks and legality diamond check ; TODO: Test store_fadd_load once we implement scheduler callbacks and legality diamond check define void @store_fneg_load(ptr %ptr) { ; CHECK-LABEL: define void @store_fneg_load( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[PTR0:%.*]] = getelementptr float, ptr [[PTR]], i32 0 ; CHECK-NEXT: [[PTR1:%.*]] = getelementptr float, ptr [[PTR]], i32 1 ; CHECK-NEXT: [[LD0:%.*]] = load float, ptr [[PTR0]], align 4 ; CHECK-NEXT: [[LD1:%.*]] = load float, ptr [[PTR1]], align 4 ; CHECK-NEXT: [[VECL:%.*]] = load <2 x float>, ptr [[PTR0]], align 4 ; CHECK-NEXT: [[FNEG0:%.*]] = fneg float [[LD0]] ; CHECK-NEXT: [[FNEG1:%.*]] = fneg float [[LD1]] ; CHECK-NEXT: [[VEC:%.*]] = fneg <2 x float> [[VECL]] ; CHECK-NEXT: store float [[FNEG0]], ptr [[PTR0]], align 4 ; CHECK-NEXT: store float [[FNEG1]], ptr [[PTR1]], align 4 ; CHECK-NEXT: store <2 x float> [[VEC]], ptr [[PTR0]], align 4 ; 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 %fneg0 = fneg float %ld0 %fneg1 = fneg float %ld1 store float %fneg0, ptr %ptr0 store float %fneg1, ptr %ptr1 ret void }