xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/RISCV/horizontal-list.ll (revision 58c8d73172a13d750c80ca0ef6849e52a0993e8d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=slp-vectorizer -S < %s -mtriple=riscv64-unknown-linux-gnu -mcpu=sifive-p670 -pass-remarks-output=%t| FileCheck %s
3; RUN: FileCheck --input-file=%t %s --check-prefix=YAML
4
5; YAML-LABEL: --- !Passed
6; YAML-NEXT: Pass:            slp-vectorizer
7; YAML-NEXT: Name:            VectorizedHorizontalReduction
8; YAML-NEXT: Function:        test
9; YAML-NEXT: Args:
10; YAML-NEXT:   - String:          'Vectorized horizontal reduction with cost '
11; YAML-NEXT:   - Cost:            '-35'
12; YAML-NEXT:   - String:          ' and with tree size '
13; YAML-NEXT:   - TreeSize:        '1'
14; YAML-NEXT: ...
15; YAML-NEXT: --- !Passed
16; YAML-NEXT: Pass:            slp-vectorizer
17; YAML-NEXT: Name:            VectorizedHorizontalReduction
18; YAML-NEXT: Function:        test
19; YAML-NEXT: Args:
20; YAML-NEXT:   - String:          'Vectorized horizontal reduction with cost '
21; YAML-NEXT:   - Cost:            '-14'
22; YAML-NEXT:   - String:          ' and with tree size '
23; YAML-NEXT:   - TreeSize:        '1'
24; YAML-NEXT: ...
25; YAML-NEXT: --- !Passed
26; YAML-NEXT: Pass:            slp-vectorizer
27; YAML-NEXT: Name:            VectorizedHorizontalReduction
28; YAML-NEXT: Function:        test
29; YAML-NEXT: Args:
30; YAML-NEXT:   - String:          'Vectorized horizontal reduction with cost '
31; YAML-NEXT:   - Cost:            '-4'
32; YAML-NEXT:   - String:          ' and with tree size '
33; YAML-NEXT:   - TreeSize:        '1'
34; YAML-NEXT:...
35define float @test(ptr %x) {
36; CHECK-LABEL: @test(
37; CHECK-NEXT:  entry:
38; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr [[X:%.*]], i64 1
39; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x float>, ptr [[ARRAYIDX]], align 4
40; CHECK-NEXT:    [[ARRAYIDX_16:%.*]] = getelementptr inbounds float, ptr [[X]], i64 17
41; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr [[ARRAYIDX_16]], align 4
42; CHECK-NEXT:    [[ARRAYIDX_24:%.*]] = getelementptr inbounds float, ptr [[X]], i64 25
43; CHECK-NEXT:    [[TMP2:%.*]] = load <4 x float>, ptr [[ARRAYIDX_24]], align 4
44; CHECK-NEXT:    [[ARRAYIDX_28:%.*]] = getelementptr inbounds float, ptr [[X]], i64 29
45; CHECK-NEXT:    [[TMP3:%.*]] = load float, ptr [[ARRAYIDX_28]], align 4
46; CHECK-NEXT:    [[ARRAYIDX_29:%.*]] = getelementptr inbounds float, ptr [[X]], i64 30
47; CHECK-NEXT:    [[TMP4:%.*]] = load float, ptr [[ARRAYIDX_29]], align 4
48; CHECK-NEXT:    [[TMP5:%.*]] = call fast float @llvm.vector.reduce.fadd.v16f32(float 0.000000e+00, <16 x float> [[TMP0]])
49; CHECK-NEXT:    [[TMP6:%.*]] = call fast float @llvm.vector.reduce.fadd.v8f32(float 0.000000e+00, <8 x float> [[TMP1]])
50; CHECK-NEXT:    [[OP_RDX:%.*]] = fadd fast float [[TMP5]], [[TMP6]]
51; CHECK-NEXT:    [[TMP7:%.*]] = call fast float @llvm.vector.reduce.fadd.v4f32(float 0.000000e+00, <4 x float> [[TMP2]])
52; CHECK-NEXT:    [[OP_RDX1:%.*]] = fadd fast float [[OP_RDX]], [[TMP7]]
53; CHECK-NEXT:    [[OP_RDX2:%.*]] = fadd fast float [[OP_RDX1]], [[TMP3]]
54; CHECK-NEXT:    [[OP_RDX3:%.*]] = fadd fast float [[OP_RDX2]], [[TMP4]]
55; CHECK-NEXT:    ret float [[OP_RDX3]]
56;
57  entry:
58  %arrayidx = getelementptr inbounds float, ptr %x, i64 1
59  %0 = load float, ptr %arrayidx, align 4
60  %arrayidx.1 = getelementptr inbounds float, ptr %x, i64 2
61  %1 = load float, ptr %arrayidx.1, align 4
62  %add.1 = fadd fast float %1, %0
63  %arrayidx.2 = getelementptr inbounds float, ptr %x, i64 3
64  %2 = load float, ptr %arrayidx.2, align 4
65  %add.2 = fadd fast float %2, %add.1
66  %arrayidx.3 = getelementptr inbounds float, ptr %x, i64 4
67  %3 = load float, ptr %arrayidx.3, align 4
68  %add.3 = fadd fast float %3, %add.2
69  %arrayidx.4 = getelementptr inbounds float, ptr %x, i64 5
70  %4 = load float, ptr %arrayidx.4, align 4
71  %add.4 = fadd fast float %4, %add.3
72  %arrayidx.5 = getelementptr inbounds float, ptr %x, i64 6
73  %5 = load float, ptr %arrayidx.5, align 4
74  %add.5 = fadd fast float %5, %add.4
75  %arrayidx.6 = getelementptr inbounds float, ptr %x, i64 7
76  %6 = load float, ptr %arrayidx.6, align 4
77  %add.6 = fadd fast float %6, %add.5
78  %arrayidx.7 = getelementptr inbounds float, ptr %x, i64 8
79  %7 = load float, ptr %arrayidx.7, align 4
80  %add.7 = fadd fast float %7, %add.6
81  %arrayidx.8 = getelementptr inbounds float, ptr %x, i64 9
82  %8 = load float, ptr %arrayidx.8, align 4
83  %add.8 = fadd fast float %8, %add.7
84  %arrayidx.9 = getelementptr inbounds float, ptr %x, i64 10
85  %9 = load float, ptr %arrayidx.9, align 4
86  %add.9 = fadd fast float %9, %add.8
87  %arrayidx.10 = getelementptr inbounds float, ptr %x, i64 11
88  %10 = load float, ptr %arrayidx.10, align 4
89  %add.10 = fadd fast float %10, %add.9
90  %arrayidx.11 = getelementptr inbounds float, ptr %x, i64 12
91  %11 = load float, ptr %arrayidx.11, align 4
92  %add.11 = fadd fast float %11, %add.10
93  %arrayidx.12 = getelementptr inbounds float, ptr %x, i64 13
94  %12 = load float, ptr %arrayidx.12, align 4
95  %add.12 = fadd fast float %12, %add.11
96  %arrayidx.13 = getelementptr inbounds float, ptr %x, i64 14
97  %13 = load float, ptr %arrayidx.13, align 4
98  %add.13 = fadd fast float %13, %add.12
99  %arrayidx.14 = getelementptr inbounds float, ptr %x, i64 15
100  %14 = load float, ptr %arrayidx.14, align 4
101  %add.14 = fadd fast float %14, %add.13
102  %arrayidx.15 = getelementptr inbounds float, ptr %x, i64 16
103  %15 = load float, ptr %arrayidx.15, align 4
104  %add.15 = fadd fast float %15, %add.14
105  %arrayidx.16 = getelementptr inbounds float, ptr %x, i64 17
106  %16 = load float, ptr %arrayidx.16, align 4
107  %add.16 = fadd fast float %16, %add.15
108  %arrayidx.17 = getelementptr inbounds float, ptr %x, i64 18
109  %17 = load float, ptr %arrayidx.17, align 4
110  %add.17 = fadd fast float %17, %add.16
111  %arrayidx.18 = getelementptr inbounds float, ptr %x, i64 19
112  %18 = load float, ptr %arrayidx.18, align 4
113  %add.18 = fadd fast float %18, %add.17
114  %arrayidx.19 = getelementptr inbounds float, ptr %x, i64 20
115  %19 = load float, ptr %arrayidx.19, align 4
116  %add.19 = fadd fast float %19, %add.18
117  %arrayidx.20 = getelementptr inbounds float, ptr %x, i64 21
118  %20 = load float, ptr %arrayidx.20, align 4
119  %add.20 = fadd fast float %20, %add.19
120  %arrayidx.21 = getelementptr inbounds float, ptr %x, i64 22
121  %21 = load float, ptr %arrayidx.21, align 4
122  %add.21 = fadd fast float %21, %add.20
123  %arrayidx.22 = getelementptr inbounds float, ptr %x, i64 23
124  %22 = load float, ptr %arrayidx.22, align 4
125  %add.22 = fadd fast float %22, %add.21
126  %arrayidx.23 = getelementptr inbounds float, ptr %x, i64 24
127  %23 = load float, ptr %arrayidx.23, align 4
128  %add.23 = fadd fast float %23, %add.22
129  %arrayidx.24 = getelementptr inbounds float, ptr %x, i64 25
130  %24 = load float, ptr %arrayidx.24, align 4
131  %add.24 = fadd fast float %24, %add.23
132  %arrayidx.25 = getelementptr inbounds float, ptr %x, i64 26
133  %25 = load float, ptr %arrayidx.25, align 4
134  %add.25 = fadd fast float %25, %add.24
135  %arrayidx.26 = getelementptr inbounds float, ptr %x, i64 27
136  %26 = load float, ptr %arrayidx.26, align 4
137  %add.26 = fadd fast float %26, %add.25
138  %arrayidx.27 = getelementptr inbounds float, ptr %x, i64 28
139  %27 = load float, ptr %arrayidx.27, align 4
140  %add.27 = fadd fast float %27, %add.26
141  %arrayidx.28 = getelementptr inbounds float, ptr %x, i64 29
142  %28 = load float, ptr %arrayidx.28, align 4
143  %add.28 = fadd fast float %28, %add.27
144  %arrayidx.29 = getelementptr inbounds float, ptr %x, i64 30
145  %29 = load float, ptr %arrayidx.29, align 4
146  %add.29 = fadd fast float %29, %add.28
147  ret float %add.29
148}
149