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