• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -cost-model -analyze -mtriple=systemz-unknown -mcpu=z13 | FileCheck %s
2;
3; Test that loads into operations that can fold one memory operand get zero
4; cost. In the case that both operands are loaded, one load should get a cost
5; value.
6
7define void @add() {
8  %li32 = load i32, i32* undef
9  add i32 %li32, undef
10
11  %li32_0 = load i32, i32* undef
12  %li32_1 = load i32, i32* undef
13  add i32 %li32_0, %li32_1
14
15  %li64 = load i64, i64* undef
16  add i64 %li64, undef
17
18  %li64_0 = load i64, i64* undef
19  %li64_1 = load i64, i64* undef
20  add i64 %li64_0, %li64_1
21
22  ret void;
23
24; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
25; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = add i32 %li32, undef
26; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
27; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
28; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = add i32 %li32_0, %li32_1
29; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
30; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = add i64 %li64, undef
31; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
32; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
33; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = add i64 %li64_0, %li64_1
34}
35
36define void @sub() {
37  %li32 = load i32, i32* undef
38  sub i32 %li32, undef
39
40  %li32_0 = load i32, i32* undef
41  %li32_1 = load i32, i32* undef
42  sub i32 %li32_0, %li32_1
43
44  %li64 = load i64, i64* undef
45  sub i64 %li64, undef
46
47  %li64_0 = load i64, i64* undef
48  %li64_1 = load i64, i64* undef
49  sub i64 %li64_0, %li64_1
50
51  ret void;
52
53; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
54; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = sub i32 %li32, undef
55; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
56; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
57; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = sub i32 %li32_0, %li32_1
58; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
59; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = sub i64 %li64, undef
60; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
61; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
62; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = sub i64 %li64_0, %li64_1
63}
64
65define void @mul() {
66  %li32 = load i32, i32* undef
67  mul i32 %li32, undef
68
69  %li32_0 = load i32, i32* undef
70  %li32_1 = load i32, i32* undef
71  mul i32 %li32_0, %li32_1
72
73  %li64 = load i64, i64* undef
74  mul i64 %li64, undef
75
76  %li64_0 = load i64, i64* undef
77  %li64_1 = load i64, i64* undef
78  mul i64 %li64_0, %li64_1
79
80  ret void;
81; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
82; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = mul i32 %li32, undef
83; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
84; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
85; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = mul i32 %li32_0, %li32_1
86; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
87; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = mul i64 %li64, undef
88; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
89; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
90; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = mul i64 %li64_0, %li64_1
91}
92
93define void @sdiv() {
94  %li32 = load i32, i32* undef
95  sdiv i32 %li32, undef
96
97  %li32_0 = load i32, i32* undef
98  %li32_1 = load i32, i32* undef
99  sdiv i32 %li32_0, %li32_1
100
101  %li64 = load i64, i64* undef
102  sdiv i64 %li64, undef
103
104  %li64_0 = load i64, i64* undef
105  %li64_1 = load i64, i64* undef
106  sdiv i64 %li64_0, %li64_1
107
108  ret void;
109; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
110; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %1 = sdiv i32 %li32, undef
111; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
112; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
113; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %2 = sdiv i32 %li32_0, %li32_1
114; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
115; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = sdiv i64 %li64, undef
116; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
117; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
118; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = sdiv i64 %li64_0, %li64_1
119}
120
121define void @udiv() {
122  %li32 = load i32, i32* undef
123  udiv i32 %li32, undef
124
125  %li32_0 = load i32, i32* undef
126  %li32_1 = load i32, i32* undef
127  udiv i32 %li32_0, %li32_1
128
129  %li64 = load i64, i64* undef
130  udiv i64 %li64, undef
131
132  %li64_0 = load i64, i64* undef
133  %li64_1 = load i64, i64* undef
134  udiv i64 %li64_0, %li64_1
135
136  ret void;
137; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
138; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %1 = udiv i32 %li32, undef
139; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
140; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
141; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %2 = udiv i32 %li32_0, %li32_1
142; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
143; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %3 = udiv i64 %li64, undef
144; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
145; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
146; CHECK: Cost Model: Found an estimated cost of 2 for instruction:   %4 = udiv i64 %li64_0, %li64_1
147}
148
149define void @and() {
150  %li32 = load i32, i32* undef
151  and i32 %li32, undef
152
153  %li32_0 = load i32, i32* undef
154  %li32_1 = load i32, i32* undef
155  and i32 %li32_0, %li32_1
156
157  %li64 = load i64, i64* undef
158  and i64 %li64, undef
159
160  %li64_0 = load i64, i64* undef
161  %li64_1 = load i64, i64* undef
162  and i64 %li64_0, %li64_1
163
164  ret void;
165; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
166; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = and i32 %li32, undef
167; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
168; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
169; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = and i32 %li32_0, %li32_1
170; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
171; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = and i64 %li64, undef
172; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
173; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
174; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = and i64 %li64_0, %li64_1
175}
176
177define void @or() {
178  %li32 = load i32, i32* undef
179  or i32 %li32, undef
180
181  %li32_0 = load i32, i32* undef
182  %li32_1 = load i32, i32* undef
183  or i32 %li32_0, %li32_1
184
185  %li64 = load i64, i64* undef
186  or i64 %li64, undef
187
188  %li64_0 = load i64, i64* undef
189  %li64_1 = load i64, i64* undef
190  or i64 %li64_0, %li64_1
191
192  ret void;
193; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
194; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = or i32 %li32, undef
195; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
196; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
197; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = or i32 %li32_0, %li32_1
198; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
199; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = or i64 %li64, undef
200; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
201; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
202; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = or i64 %li64_0, %li64_1
203}
204
205define void @xor() {
206  %li32 = load i32, i32* undef
207  xor i32 %li32, undef
208
209  %li32_0 = load i32, i32* undef
210  %li32_1 = load i32, i32* undef
211  xor i32 %li32_0, %li32_1
212
213  %li64 = load i64, i64* undef
214  xor i64 %li64, undef
215
216  %li64_0 = load i64, i64* undef
217  %li64_1 = load i64, i64* undef
218  xor i64 %li64_0, %li64_1
219
220  ret void;
221; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
222; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = xor i32 %li32, undef
223; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
224; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
225; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = xor i32 %li32_0, %li32_1
226; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
227; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = xor i64 %li64, undef
228; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
229; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
230; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = xor i64 %li64_0, %li64_1
231}
232
233define void @icmp() {
234  %li32 = load i32, i32* undef
235  icmp eq i32 %li32, undef
236
237  %li32_0 = load i32, i32* undef
238  %li32_1 = load i32, i32* undef
239  icmp eq i32 %li32_0, %li32_1
240
241  %li64 = load i64, i64* undef
242  icmp eq i64 %li64, undef
243
244  %li64_0 = load i64, i64* undef
245  %li64_1 = load i64, i64* undef
246  icmp eq i64 %li64_0, %li64_1
247
248  ret void;
249; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32 = load i32, i32* undef
250; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %1 = icmp eq i32 %li32, undef
251; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li32_0 = load i32, i32* undef
252; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li32_1 = load i32, i32* undef
253; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %2 = icmp eq i32 %li32_0, %li32_1
254; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64 = load i64, i64* undef
255; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %3 = icmp eq i64 %li64, undef
256; CHECK: Cost Model: Found an estimated cost of 0 for instruction:   %li64_0 = load i64, i64* undef
257; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %li64_1 = load i64, i64* undef
258; CHECK: Cost Model: Found an estimated cost of 1 for instruction:   %4 = icmp eq i64 %li64_0, %li64_1
259}
260