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