1; RUN: opt -S -loop-vectorize < %s | FileCheck %s 2 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 4target triple = "x86_64-unknown-linux-gnu" 5 6define float @reduction_sum_float_ieee(i32 %n, float* %array) { 7; CHECK-LABEL: define float @reduction_sum_float_ieee( 8entry: 9 %entry.cond = icmp ne i32 0, 4096 10 br i1 %entry.cond, label %loop, label %loop.exit 11 12loop: 13 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] 14 %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] 15 %address = getelementptr float, float* %array, i32 %idx 16 %value = load float, float* %address 17 %sum.inc = fadd float %sum, %value 18 %idx.inc = add i32 %idx, 1 19 %be.cond = icmp ne i32 %idx.inc, 4096 20 br i1 %be.cond, label %loop, label %loop.exit 21 22loop.exit: 23 %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] 24; CHECK-NOT: %wide.load = load <4 x float>, <4 x float>* 25; CHECK: ret float %sum.lcssa 26 ret float %sum.lcssa 27} 28 29define float @reduction_sum_float_fastmath(i32 %n, float* %array) { 30; CHECK-LABEL: define float @reduction_sum_float_fastmath( 31; CHECK: fadd fast <4 x float> 32; CHECK: fadd fast <4 x float> 33; CHECK: fadd fast <4 x float> 34; CHECK: fadd fast <4 x float> 35; CHECK: fadd fast <4 x float> 36entry: 37 %entry.cond = icmp ne i32 0, 4096 38 br i1 %entry.cond, label %loop, label %loop.exit 39 40loop: 41 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] 42 %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] 43 %address = getelementptr float, float* %array, i32 %idx 44 %value = load float, float* %address 45 %sum.inc = fadd fast float %sum, %value 46 %idx.inc = add i32 %idx, 1 47 %be.cond = icmp ne i32 %idx.inc, 4096 48 br i1 %be.cond, label %loop, label %loop.exit 49 50loop.exit: 51 %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] 52; CHECK: ret float %sum.lcssa 53 ret float %sum.lcssa 54} 55 56define float @reduction_sum_float_only_reassoc(i32 %n, float* %array) { 57; CHECK-LABEL: define float @reduction_sum_float_only_reassoc( 58; CHECK-NOT: fadd fast 59; CHECK: fadd reassoc <4 x float> 60; CHECK: fadd reassoc <4 x float> 61; CHECK: fadd reassoc <4 x float> 62; CHECK: fadd reassoc <4 x float> 63; CHECK: fadd reassoc <4 x float> 64 65entry: 66 %entry.cond = icmp ne i32 0, 4096 67 br i1 %entry.cond, label %loop, label %loop.exit 68 69loop: 70 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] 71 %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] 72 %address = getelementptr float, float* %array, i32 %idx 73 %value = load float, float* %address 74 %sum.inc = fadd reassoc float %sum, %value 75 %idx.inc = add i32 %idx, 1 76 %be.cond = icmp ne i32 %idx.inc, 4096 77 br i1 %be.cond, label %loop, label %loop.exit 78 79loop.exit: 80 %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] 81; CHECK: ret float %sum.lcssa 82 ret float %sum.lcssa 83} 84 85define float @reduction_sum_float_only_reassoc_and_contract(i32 %n, float* %array) { 86; CHECK-LABEL: define float @reduction_sum_float_only_reassoc_and_contract( 87; CHECK-NOT: fadd fast 88; CHECK: fadd reassoc contract <4 x float> 89; CHECK: fadd reassoc contract <4 x float> 90; CHECK: fadd reassoc contract <4 x float> 91; CHECK: fadd reassoc contract <4 x float> 92; CHECK: fadd reassoc contract <4 x float> 93 94entry: 95 %entry.cond = icmp ne i32 0, 4096 96 br i1 %entry.cond, label %loop, label %loop.exit 97 98loop: 99 %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ] 100 %sum = phi float [ 0.000000e+00, %entry ], [ %sum.inc, %loop ] 101 %address = getelementptr float, float* %array, i32 %idx 102 %value = load float, float* %address 103 %sum.inc = fadd reassoc contract float %sum, %value 104 %idx.inc = add i32 %idx, 1 105 %be.cond = icmp ne i32 %idx.inc, 4096 106 br i1 %be.cond, label %loop, label %loop.exit 107 108loop.exit: 109 %sum.lcssa = phi float [ %sum.inc, %loop ], [ 0.000000e+00, %entry ] 110; CHECK: ret float %sum.lcssa 111 ret float %sum.lcssa 112} 113