; RUN: opt -S -loop-vectorize < %s | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define float @reduction_sum_float_ieee(i32 %n, float* %array) { ; CHECK-LABEL: define float @reduction_sum_float_ieee( entry: %entry.cond = icmp ne i32 0, 4096 br i1 %entry.cond, label %loop, label %loop.exit loop: %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] %address = getelementptr float, float* %array, i32 %idx %value = load float, float* %address %sum.inc = fadd float %sum, %value %idx.inc = add i32 %idx, 1 %be.cond = icmp ne i32 %idx.inc, 4096 br i1 %be.cond, label %loop, label %loop.exit loop.exit: %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] ; CHECK-NOT: %wide.load = load <4 x float>, <4 x float>* ; CHECK: ret float %sum.lcssa ret float %sum.lcssa } define float @reduction_sum_float_fastmath(i32 %n, float* %array) { ; CHECK-LABEL: define float @reduction_sum_float_fastmath( ; CHECK: fadd fast <4 x float> ; CHECK: fadd fast <4 x float> ; CHECK: fadd fast <4 x float> ; CHECK: fadd fast <4 x float> ; CHECK: fadd fast <4 x float> entry: %entry.cond = icmp ne i32 0, 4096 br i1 %entry.cond, label %loop, label %loop.exit loop: %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] %address = getelementptr float, float* %array, i32 %idx %value = load float, float* %address %sum.inc = fadd fast float %sum, %value %idx.inc = add i32 %idx, 1 %be.cond = icmp ne i32 %idx.inc, 4096 br i1 %be.cond, label %loop, label %loop.exit loop.exit: %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] ; CHECK: ret float %sum.lcssa ret float %sum.lcssa } define float @reduction_sum_float_only_reassoc(i32 %n, float* %array) { ; CHECK-LABEL: define float @reduction_sum_float_only_reassoc( ; CHECK-NOT: fadd fast ; CHECK: fadd reassoc <4 x float> ; CHECK: fadd reassoc <4 x float> ; CHECK: fadd reassoc <4 x float> ; CHECK: fadd reassoc <4 x float> ; CHECK: fadd reassoc <4 x float> entry: %entry.cond = icmp ne i32 0, 4096 br i1 %entry.cond, label %loop, label %loop.exit loop: %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] %address = getelementptr float, float* %array, i32 %idx %value = load float, float* %address %sum.inc = fadd reassoc float %sum, %value %idx.inc = add i32 %idx, 1 %be.cond = icmp ne i32 %idx.inc, 4096 br i1 %be.cond, label %loop, label %loop.exit loop.exit: %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] ; CHECK: ret float %sum.lcssa ret float %sum.lcssa } define float @reduction_sum_float_only_reassoc_and_contract(i32 %n, float* %array) { ; CHECK-LABEL: define float @reduction_sum_float_only_reassoc_and_contract( ; CHECK-NOT: fadd fast ; CHECK: fadd reassoc contract <4 x float> ; CHECK: fadd reassoc contract <4 x float> ; CHECK: fadd reassoc contract <4 x float> ; CHECK: fadd reassoc contract <4 x float> ; CHECK: fadd reassoc contract <4 x float> entry: %entry.cond = icmp ne i32 0, 4096 br i1 %entry.cond, label %loop, label %loop.exit loop: %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] %address = getelementptr float, float* %array, i32 %idx %value = load float, float* %address %sum.inc = fadd reassoc contract float %sum, %value %idx.inc = add i32 %idx, 1 %be.cond = icmp ne i32 %idx.inc, 4096 br i1 %be.cond, label %loop, label %loop.exit loop.exit: %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] ; CHECK: ret float %sum.lcssa ret float %sum.lcssa }