1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -cost-model -analyze -mtriple=thumbv8m.main < %s | FileCheck %s --check-prefix=V8M
3; RUN: opt -cost-model -analyze -mtriple=armv8a-linux-gnueabihf < %s | FileCheck %s --check-prefix=NEON
4; RUN: opt -cost-model -analyze -mtriple=armv8.1m.main -mattr=+mve < %s | FileCheck %s --check-prefix=MVE
5
6define i32 @reduce_i64(i32 %arg) {
7; V8M-LABEL: 'reduce_i64'
8; V8M-NEXT:  Cost Model: Found an estimated cost of 2 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef)
9; V8M-NEXT:  Cost Model: Found an estimated cost of 13 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef)
10; V8M-NEXT:  Cost Model: Found an estimated cost of 35 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef)
11; V8M-NEXT:  Cost Model: Found an estimated cost of 79 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef)
12; V8M-NEXT:  Cost Model: Found an estimated cost of 167 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef)
13; V8M-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
14;
15; NEON-LABEL: 'reduce_i64'
16; NEON-NEXT:  Cost Model: Found an estimated cost of 3 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef)
17; NEON-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef)
18; NEON-NEXT:  Cost Model: Found an estimated cost of 31 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef)
19; NEON-NEXT:  Cost Model: Found an estimated cost of 76 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef)
20; NEON-NEXT:  Cost Model: Found an estimated cost of 178 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef)
21; NEON-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
22;
23; MVE-LABEL: 'reduce_i64'
24; MVE-NEXT:  Cost Model: Found an estimated cost of 8 for instruction: %V1 = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef)
25; MVE-NEXT:  Cost Model: Found an estimated cost of 148 for instruction: %V2 = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef)
26; MVE-NEXT:  Cost Model: Found an estimated cost of 288 for instruction: %V4 = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef)
27; MVE-NEXT:  Cost Model: Found an estimated cost of 568 for instruction: %V8 = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef)
28; MVE-NEXT:  Cost Model: Found an estimated cost of 1128 for instruction: %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef)
29; MVE-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
30;
31  %V1  = call i64 @llvm.vector.reduce.umax.v1i64(<1 x i64> undef)
32  %V2  = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> undef)
33  %V4  = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> undef)
34  %V8  = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> undef)
35  %V16 = call i64 @llvm.vector.reduce.umax.v16i64(<16 x i64> undef)
36  ret i32 undef
37}
38
39define i32 @reduce_i32(i32 %arg) {
40; V8M-LABEL: 'reduce_i32'
41; V8M-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef)
42; V8M-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef)
43; V8M-NEXT:  Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
44; V8M-NEXT:  Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef)
45; V8M-NEXT:  Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef)
46; V8M-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
47;
48; NEON-LABEL: 'reduce_i32'
49; NEON-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef)
50; NEON-NEXT:  Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef)
51; NEON-NEXT:  Cost Model: Found an estimated cost of 81 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
52; NEON-NEXT:  Cost Model: Found an estimated cost of 133 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef)
53; NEON-NEXT:  Cost Model: Found an estimated cost of 237 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef)
54; NEON-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
55;
56; MVE-LABEL: 'reduce_i32'
57; MVE-NEXT:  Cost Model: Found an estimated cost of 76 for instruction: %V2 = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef)
58; MVE-NEXT:  Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef)
59; MVE-NEXT:  Cost Model: Found an estimated cost of 208 for instruction: %V8 = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
60; MVE-NEXT:  Cost Model: Found an estimated cost of 376 for instruction: %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef)
61; MVE-NEXT:  Cost Model: Found an estimated cost of 712 for instruction: %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef)
62; MVE-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
63;
64  %V2  = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> undef)
65  %V4  = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> undef)
66  %V8  = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> undef)
67  %V16 = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> undef)
68  %V32 = call i32 @llvm.vector.reduce.umax.v32i32(<32 x i32> undef)
69  ret i32 undef
70}
71
72define i32 @reduce_i16(i32 %arg) {
73; V8M-LABEL: 'reduce_i16'
74; V8M-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef)
75; V8M-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef)
76; V8M-NEXT:  Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef)
77; V8M-NEXT:  Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef)
78; V8M-NEXT:  Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef)
79; V8M-NEXT:  Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef)
80; V8M-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
81;
82; NEON-LABEL: 'reduce_i16'
83; NEON-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef)
84; NEON-NEXT:  Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef)
85; NEON-NEXT:  Cost Model: Found an estimated cost of 153 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef)
86; NEON-NEXT:  Cost Model: Found an estimated cost of 203 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef)
87; NEON-NEXT:  Cost Model: Found an estimated cost of 303 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef)
88; NEON-NEXT:  Cost Model: Found an estimated cost of 503 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef)
89; NEON-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
90;
91; MVE-LABEL: 'reduce_i16'
92; MVE-NEXT:  Cost Model: Found an estimated cost of 76 for instruction: %V2 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef)
93; MVE-NEXT:  Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef)
94; MVE-NEXT:  Cost Model: Found an estimated cost of 400 for instruction: %V8 = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef)
95; MVE-NEXT:  Cost Model: Found an estimated cost of 532 for instruction: %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef)
96; MVE-NEXT:  Cost Model: Found an estimated cost of 860 for instruction: %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef)
97; MVE-NEXT:  Cost Model: Found an estimated cost of 1516 for instruction: %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef)
98; MVE-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
99;
100  %V2  = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> undef)
101  %V4  = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> undef)
102  %V8  = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> undef)
103  %V16 = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> undef)
104  %V32 = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> undef)
105  %V64 = call i16 @llvm.vector.reduce.umax.v64i16(<64 x i16> undef)
106  ret i32 undef
107}
108
109define i32 @reduce_i8(i32 %arg) {
110; V8M-LABEL: 'reduce_i8'
111; V8M-NEXT:  Cost Model: Found an estimated cost of 7 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef)
112; V8M-NEXT:  Cost Model: Found an estimated cost of 19 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef)
113; V8M-NEXT:  Cost Model: Found an estimated cost of 43 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef)
114; V8M-NEXT:  Cost Model: Found an estimated cost of 91 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef)
115; V8M-NEXT:  Cost Model: Found an estimated cost of 187 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef)
116; V8M-NEXT:  Cost Model: Found an estimated cost of 379 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef)
117; V8M-NEXT:  Cost Model: Found an estimated cost of 763 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef)
118; V8M-NEXT:  Cost Model: Found an estimated cost of 1 for instruction: ret i32 undef
119;
120; NEON-LABEL: 'reduce_i8'
121; NEON-NEXT:  Cost Model: Found an estimated cost of 17 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef)
122; NEON-NEXT:  Cost Model: Found an estimated cost of 55 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef)
123; NEON-NEXT:  Cost Model: Found an estimated cost of 153 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef)
124; NEON-NEXT:  Cost Model: Found an estimated cost of 395 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef)
125; NEON-NEXT:  Cost Model: Found an estimated cost of 493 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef)
126; NEON-NEXT:  Cost Model: Found an estimated cost of 689 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef)
127; NEON-NEXT:  Cost Model: Found an estimated cost of 1081 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef)
128; NEON-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
129;
130; MVE-LABEL: 'reduce_i8'
131; MVE-NEXT:  Cost Model: Found an estimated cost of 76 for instruction: %V2 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef)
132; MVE-NEXT:  Cost Model: Found an estimated cost of 140 for instruction: %V4 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef)
133; MVE-NEXT:  Cost Model: Found an estimated cost of 400 for instruction: %V8 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef)
134; MVE-NEXT:  Cost Model: Found an estimated cost of 1044 for instruction: %V16 = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef)
135; MVE-NEXT:  Cost Model: Found an estimated cost of 1304 for instruction: %V32 = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef)
136; MVE-NEXT:  Cost Model: Found an estimated cost of 1952 for instruction: %V64 = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef)
137; MVE-NEXT:  Cost Model: Found an estimated cost of 3248 for instruction: %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef)
138; MVE-NEXT:  Cost Model: Found an estimated cost of 0 for instruction: ret i32 undef
139;
140  %V2   = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> undef)
141  %V4   = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> undef)
142  %V8   = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> undef)
143  %V16  = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> undef)
144  %V32  = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> undef)
145  %V64  = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> undef)
146  %V128 = call i8 @llvm.vector.reduce.umax.v128i8(<128 x i8> undef)
147  ret i32 undef
148}
149
150declare i64 @llvm.vector.reduce.umax.v1i64(<1 x i64>)
151declare i64 @llvm.vector.reduce.umax.v2i64(<2 x i64>)
152declare i64 @llvm.vector.reduce.umax.v4i64(<4 x i64>)
153declare i64 @llvm.vector.reduce.umax.v8i64(<8 x i64>)
154declare i64 @llvm.vector.reduce.umax.v16i64(<16 x i64>)
155
156declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>)
157declare i32 @llvm.vector.reduce.umax.v4i32(<4 x i32>)
158declare i32 @llvm.vector.reduce.umax.v8i32(<8 x i32>)
159declare i32 @llvm.vector.reduce.umax.v16i32(<16 x i32>)
160declare i32 @llvm.vector.reduce.umax.v32i32(<32 x i32>)
161
162declare i16 @llvm.vector.reduce.umax.v2i16(<2 x i16>)
163declare i16 @llvm.vector.reduce.umax.v4i16(<4 x i16>)
164declare i16 @llvm.vector.reduce.umax.v8i16(<8 x i16>)
165declare i16 @llvm.vector.reduce.umax.v16i16(<16 x i16>)
166declare i16 @llvm.vector.reduce.umax.v32i16(<32 x i16>)
167declare i16 @llvm.vector.reduce.umax.v64i16(<64 x i16>)
168
169declare i8 @llvm.vector.reduce.umax.v2i8(<2 x i8>)
170declare i8 @llvm.vector.reduce.umax.v4i8(<4 x i8>)
171declare i8 @llvm.vector.reduce.umax.v8i8(<8 x i8>)
172declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>)
173declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)
174declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>)
175declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>)
176