LLVM 23.0.0git
TargetLoweringBase.cpp
Go to the documentation of this file.
1//===- TargetLoweringBase.cpp - Implement the TargetLoweringBase class ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This implements the TargetLoweringBase class.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/ADT/BitVector.h"
14#include "llvm/ADT/DenseMap.h"
15#include "llvm/ADT/STLExtras.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/ADT/Twine.h"
20#include "llvm/Analysis/Loads.h"
39#include "llvm/IR/Attributes.h"
40#include "llvm/IR/CallingConv.h"
41#include "llvm/IR/DataLayout.h"
43#include "llvm/IR/Function.h"
44#include "llvm/IR/GlobalValue.h"
46#include "llvm/IR/IRBuilder.h"
47#include "llvm/IR/Module.h"
48#include "llvm/IR/Type.h"
58#include <algorithm>
59#include <cassert>
60#include <cstdint>
61#include <cstring>
62#include <string>
63#include <tuple>
64#include <utility>
65
66using namespace llvm;
67
69 "jump-is-expensive", cl::init(false),
70 cl::desc("Do not create extra branches to split comparison logic."),
72
74 ("min-jump-table-entries", cl::init(4), cl::Hidden,
75 cl::desc("Set minimum number of entries to use a jump table."));
76
78 ("max-jump-table-size", cl::init(UINT_MAX), cl::Hidden,
79 cl::desc("Set maximum size of jump tables."));
80
81/// Minimum jump table density for normal functions.
83 JumpTableDensity("jump-table-density", cl::init(10), cl::Hidden,
84 cl::desc("Minimum density for building a jump table in "
85 "a normal function"));
86
87/// Minimum jump table density for -Os or -Oz functions.
89 "optsize-jump-table-density", cl::init(40), cl::Hidden,
90 cl::desc("Minimum density for building a jump table in "
91 "an optsize function"));
92
94 "min-bit-test-cmps", cl::init(2), cl::Hidden,
95 cl::desc("Set minimum of largest number of comparisons "
96 "to use bit test for switch."));
97
99 "max-store-memset", cl::init(0), cl::Hidden,
100 cl::desc("Override target's MaxStoresPerMemset and "
101 "MaxStoresPerMemsetOptSize. "
102 "Set to 0 to use the target default."));
103
105 "max-store-memcpy", cl::init(0), cl::Hidden,
106 cl::desc("Override target's MaxStoresPerMemcpy and "
107 "MaxStoresPerMemcpyOptSize. "
108 "Set to 0 to use the target default."));
109
111 "max-store-memmove", cl::init(0), cl::Hidden,
112 cl::desc("Override target's MaxStoresPerMemmove and "
113 "MaxStoresPerMemmoveOptSize. "
114 "Set to 0 to use the target default."));
115
116// FIXME: This option is only to test if the strict fp operation processed
117// correctly by preventing mutating strict fp operation to normal fp operation
118// during development. When the backend supports strict float operation, this
119// option will be meaningless.
120static cl::opt<bool> DisableStrictNodeMutation("disable-strictnode-mutation",
121 cl::desc("Don't mutate strict-float node to a legalize node"),
122 cl::init(false), cl::Hidden);
123
124LLVM_ABI RTLIB::Libcall RTLIB::getSHL(EVT VT) {
125 if (VT == MVT::i16)
126 return RTLIB::SHL_I16;
127 if (VT == MVT::i32)
128 return RTLIB::SHL_I32;
129 if (VT == MVT::i64)
130 return RTLIB::SHL_I64;
131 if (VT == MVT::i128)
132 return RTLIB::SHL_I128;
133
134 return RTLIB::UNKNOWN_LIBCALL;
135}
136
137LLVM_ABI RTLIB::Libcall RTLIB::getSRL(EVT VT) {
138 if (VT == MVT::i16)
139 return RTLIB::SRL_I16;
140 if (VT == MVT::i32)
141 return RTLIB::SRL_I32;
142 if (VT == MVT::i64)
143 return RTLIB::SRL_I64;
144 if (VT == MVT::i128)
145 return RTLIB::SRL_I128;
146
147 return RTLIB::UNKNOWN_LIBCALL;
148}
149
150LLVM_ABI RTLIB::Libcall RTLIB::getSRA(EVT VT) {
151 if (VT == MVT::i16)
152 return RTLIB::SRA_I16;
153 if (VT == MVT::i32)
154 return RTLIB::SRA_I32;
155 if (VT == MVT::i64)
156 return RTLIB::SRA_I64;
157 if (VT == MVT::i128)
158 return RTLIB::SRA_I128;
159
160 return RTLIB::UNKNOWN_LIBCALL;
161}
162
163LLVM_ABI RTLIB::Libcall RTLIB::getMUL(EVT VT) {
164 if (VT == MVT::i16)
165 return RTLIB::MUL_I16;
166 if (VT == MVT::i32)
167 return RTLIB::MUL_I32;
168 if (VT == MVT::i64)
169 return RTLIB::MUL_I64;
170 if (VT == MVT::i128)
171 return RTLIB::MUL_I128;
172 return RTLIB::UNKNOWN_LIBCALL;
173}
174
175LLVM_ABI RTLIB::Libcall RTLIB::getMULO(EVT VT) {
176 if (VT == MVT::i32)
177 return RTLIB::MULO_I32;
178 if (VT == MVT::i64)
179 return RTLIB::MULO_I64;
180 if (VT == MVT::i128)
181 return RTLIB::MULO_I128;
182 return RTLIB::UNKNOWN_LIBCALL;
183}
184
185LLVM_ABI RTLIB::Libcall RTLIB::getSDIV(EVT VT) {
186 if (VT == MVT::i16)
187 return RTLIB::SDIV_I16;
188 if (VT == MVT::i32)
189 return RTLIB::SDIV_I32;
190 if (VT == MVT::i64)
191 return RTLIB::SDIV_I64;
192 if (VT == MVT::i128)
193 return RTLIB::SDIV_I128;
194 return RTLIB::UNKNOWN_LIBCALL;
195}
196
197LLVM_ABI RTLIB::Libcall RTLIB::getUDIV(EVT VT) {
198 if (VT == MVT::i16)
199 return RTLIB::UDIV_I16;
200 if (VT == MVT::i32)
201 return RTLIB::UDIV_I32;
202 if (VT == MVT::i64)
203 return RTLIB::UDIV_I64;
204 if (VT == MVT::i128)
205 return RTLIB::UDIV_I128;
206 return RTLIB::UNKNOWN_LIBCALL;
207}
208
209LLVM_ABI RTLIB::Libcall RTLIB::getSREM(EVT VT) {
210 if (VT == MVT::i16)
211 return RTLIB::SREM_I16;
212 if (VT == MVT::i32)
213 return RTLIB::SREM_I32;
214 if (VT == MVT::i64)
215 return RTLIB::SREM_I64;
216 if (VT == MVT::i128)
217 return RTLIB::SREM_I128;
218 return RTLIB::UNKNOWN_LIBCALL;
219}
220
221LLVM_ABI RTLIB::Libcall RTLIB::getUREM(EVT VT) {
222 if (VT == MVT::i16)
223 return RTLIB::UREM_I16;
224 if (VT == MVT::i32)
225 return RTLIB::UREM_I32;
226 if (VT == MVT::i64)
227 return RTLIB::UREM_I64;
228 if (VT == MVT::i128)
229 return RTLIB::UREM_I128;
230 return RTLIB::UNKNOWN_LIBCALL;
231}
232
233LLVM_ABI RTLIB::Libcall RTLIB::getCTPOP(EVT VT) {
234 if (VT == MVT::i32)
235 return RTLIB::CTPOP_I32;
236 if (VT == MVT::i64)
237 return RTLIB::CTPOP_I64;
238 if (VT == MVT::i128)
239 return RTLIB::CTPOP_I128;
240 return RTLIB::UNKNOWN_LIBCALL;
241}
242
243/// GetFPLibCall - Helper to return the right libcall for the given floating
244/// point type, or UNKNOWN_LIBCALL if there is none.
245RTLIB::Libcall RTLIB::getFPLibCall(EVT VT,
246 RTLIB::Libcall Call_F32,
247 RTLIB::Libcall Call_F64,
248 RTLIB::Libcall Call_F80,
249 RTLIB::Libcall Call_F128,
250 RTLIB::Libcall Call_PPCF128) {
251 return
252 VT == MVT::f32 ? Call_F32 :
253 VT == MVT::f64 ? Call_F64 :
254 VT == MVT::f80 ? Call_F80 :
255 VT == MVT::f128 ? Call_F128 :
256 VT == MVT::ppcf128 ? Call_PPCF128 :
257 RTLIB::UNKNOWN_LIBCALL;
258}
259
260/// getFPEXT - Return the FPEXT_*_* value for the given types, or
261/// UNKNOWN_LIBCALL if there is none.
262RTLIB::Libcall RTLIB::getFPEXT(EVT OpVT, EVT RetVT) {
263 if (OpVT == MVT::f16) {
264 if (RetVT == MVT::f32)
265 return FPEXT_F16_F32;
266 if (RetVT == MVT::f64)
267 return FPEXT_F16_F64;
268 if (RetVT == MVT::f80)
269 return FPEXT_F16_F80;
270 if (RetVT == MVT::f128)
271 return FPEXT_F16_F128;
272 } else if (OpVT == MVT::f32) {
273 if (RetVT == MVT::f64)
274 return FPEXT_F32_F64;
275 if (RetVT == MVT::f128)
276 return FPEXT_F32_F128;
277 if (RetVT == MVT::ppcf128)
278 return FPEXT_F32_PPCF128;
279 } else if (OpVT == MVT::f64) {
280 if (RetVT == MVT::f128)
281 return FPEXT_F64_F128;
282 else if (RetVT == MVT::ppcf128)
283 return FPEXT_F64_PPCF128;
284 } else if (OpVT == MVT::f80) {
285 if (RetVT == MVT::f128)
286 return FPEXT_F80_F128;
287 } else if (OpVT == MVT::bf16) {
288 if (RetVT == MVT::f32)
289 return FPEXT_BF16_F32;
290 }
291
292 return UNKNOWN_LIBCALL;
293}
294
295/// getFPROUND - Return the FPROUND_*_* value for the given types, or
296/// UNKNOWN_LIBCALL if there is none.
297RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {
298 if (RetVT == MVT::f16) {
299 if (OpVT == MVT::f32)
300 return FPROUND_F32_F16;
301 if (OpVT == MVT::f64)
302 return FPROUND_F64_F16;
303 if (OpVT == MVT::f80)
304 return FPROUND_F80_F16;
305 if (OpVT == MVT::f128)
306 return FPROUND_F128_F16;
307 if (OpVT == MVT::ppcf128)
308 return FPROUND_PPCF128_F16;
309 } else if (RetVT == MVT::bf16) {
310 if (OpVT == MVT::f32)
311 return FPROUND_F32_BF16;
312 if (OpVT == MVT::f64)
313 return FPROUND_F64_BF16;
314 if (OpVT == MVT::f80)
315 return FPROUND_F80_BF16;
316 if (OpVT == MVT::f128)
317 return FPROUND_F128_BF16;
318 } else if (RetVT == MVT::f32) {
319 if (OpVT == MVT::f64)
320 return FPROUND_F64_F32;
321 if (OpVT == MVT::f80)
322 return FPROUND_F80_F32;
323 if (OpVT == MVT::f128)
324 return FPROUND_F128_F32;
325 if (OpVT == MVT::ppcf128)
326 return FPROUND_PPCF128_F32;
327 } else if (RetVT == MVT::f64) {
328 if (OpVT == MVT::f80)
329 return FPROUND_F80_F64;
330 if (OpVT == MVT::f128)
331 return FPROUND_F128_F64;
332 if (OpVT == MVT::ppcf128)
333 return FPROUND_PPCF128_F64;
334 } else if (RetVT == MVT::f80) {
335 if (OpVT == MVT::f128)
336 return FPROUND_F128_F80;
337 }
338
339 return UNKNOWN_LIBCALL;
340}
341
342/// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or
343/// UNKNOWN_LIBCALL if there is none.
344RTLIB::Libcall RTLIB::getFPTOSINT(EVT OpVT, EVT RetVT) {
345 if (OpVT == MVT::f16) {
346 if (RetVT == MVT::i32)
347 return FPTOSINT_F16_I32;
348 if (RetVT == MVT::i64)
349 return FPTOSINT_F16_I64;
350 if (RetVT == MVT::i128)
351 return FPTOSINT_F16_I128;
352 } else if (OpVT == MVT::f32) {
353 if (RetVT == MVT::i32)
354 return FPTOSINT_F32_I32;
355 if (RetVT == MVT::i64)
356 return FPTOSINT_F32_I64;
357 if (RetVT == MVT::i128)
358 return FPTOSINT_F32_I128;
359 } else if (OpVT == MVT::f64) {
360 if (RetVT == MVT::i32)
361 return FPTOSINT_F64_I32;
362 if (RetVT == MVT::i64)
363 return FPTOSINT_F64_I64;
364 if (RetVT == MVT::i128)
365 return FPTOSINT_F64_I128;
366 } else if (OpVT == MVT::f80) {
367 if (RetVT == MVT::i32)
368 return FPTOSINT_F80_I32;
369 if (RetVT == MVT::i64)
370 return FPTOSINT_F80_I64;
371 if (RetVT == MVT::i128)
372 return FPTOSINT_F80_I128;
373 } else if (OpVT == MVT::f128) {
374 if (RetVT == MVT::i32)
375 return FPTOSINT_F128_I32;
376 if (RetVT == MVT::i64)
377 return FPTOSINT_F128_I64;
378 if (RetVT == MVT::i128)
379 return FPTOSINT_F128_I128;
380 } else if (OpVT == MVT::ppcf128) {
381 if (RetVT == MVT::i32)
382 return FPTOSINT_PPCF128_I32;
383 if (RetVT == MVT::i64)
384 return FPTOSINT_PPCF128_I64;
385 if (RetVT == MVT::i128)
386 return FPTOSINT_PPCF128_I128;
387 }
388 return UNKNOWN_LIBCALL;
389}
390
391/// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or
392/// UNKNOWN_LIBCALL if there is none.
393RTLIB::Libcall RTLIB::getFPTOUINT(EVT OpVT, EVT RetVT) {
394 if (OpVT == MVT::f16) {
395 if (RetVT == MVT::i32)
396 return FPTOUINT_F16_I32;
397 if (RetVT == MVT::i64)
398 return FPTOUINT_F16_I64;
399 if (RetVT == MVT::i128)
400 return FPTOUINT_F16_I128;
401 } else if (OpVT == MVT::f32) {
402 if (RetVT == MVT::i32)
403 return FPTOUINT_F32_I32;
404 if (RetVT == MVT::i64)
405 return FPTOUINT_F32_I64;
406 if (RetVT == MVT::i128)
407 return FPTOUINT_F32_I128;
408 } else if (OpVT == MVT::f64) {
409 if (RetVT == MVT::i32)
410 return FPTOUINT_F64_I32;
411 if (RetVT == MVT::i64)
412 return FPTOUINT_F64_I64;
413 if (RetVT == MVT::i128)
414 return FPTOUINT_F64_I128;
415 } else if (OpVT == MVT::f80) {
416 if (RetVT == MVT::i32)
417 return FPTOUINT_F80_I32;
418 if (RetVT == MVT::i64)
419 return FPTOUINT_F80_I64;
420 if (RetVT == MVT::i128)
421 return FPTOUINT_F80_I128;
422 } else if (OpVT == MVT::f128) {
423 if (RetVT == MVT::i32)
424 return FPTOUINT_F128_I32;
425 if (RetVT == MVT::i64)
426 return FPTOUINT_F128_I64;
427 if (RetVT == MVT::i128)
428 return FPTOUINT_F128_I128;
429 } else if (OpVT == MVT::ppcf128) {
430 if (RetVT == MVT::i32)
431 return FPTOUINT_PPCF128_I32;
432 if (RetVT == MVT::i64)
433 return FPTOUINT_PPCF128_I64;
434 if (RetVT == MVT::i128)
435 return FPTOUINT_PPCF128_I128;
436 }
437 return UNKNOWN_LIBCALL;
438}
439
440/// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or
441/// UNKNOWN_LIBCALL if there is none.
442RTLIB::Libcall RTLIB::getSINTTOFP(EVT OpVT, EVT RetVT) {
443 if (OpVT == MVT::i32) {
444 if (RetVT == MVT::f16)
445 return SINTTOFP_I32_F16;
446 if (RetVT == MVT::f32)
447 return SINTTOFP_I32_F32;
448 if (RetVT == MVT::f64)
449 return SINTTOFP_I32_F64;
450 if (RetVT == MVT::f80)
451 return SINTTOFP_I32_F80;
452 if (RetVT == MVT::f128)
453 return SINTTOFP_I32_F128;
454 if (RetVT == MVT::ppcf128)
455 return SINTTOFP_I32_PPCF128;
456 } else if (OpVT == MVT::i64) {
457 if (RetVT == MVT::bf16)
458 return SINTTOFP_I64_BF16;
459 if (RetVT == MVT::f16)
460 return SINTTOFP_I64_F16;
461 if (RetVT == MVT::f32)
462 return SINTTOFP_I64_F32;
463 if (RetVT == MVT::f64)
464 return SINTTOFP_I64_F64;
465 if (RetVT == MVT::f80)
466 return SINTTOFP_I64_F80;
467 if (RetVT == MVT::f128)
468 return SINTTOFP_I64_F128;
469 if (RetVT == MVT::ppcf128)
470 return SINTTOFP_I64_PPCF128;
471 } else if (OpVT == MVT::i128) {
472 if (RetVT == MVT::f16)
473 return SINTTOFP_I128_F16;
474 if (RetVT == MVT::f32)
475 return SINTTOFP_I128_F32;
476 if (RetVT == MVT::f64)
477 return SINTTOFP_I128_F64;
478 if (RetVT == MVT::f80)
479 return SINTTOFP_I128_F80;
480 if (RetVT == MVT::f128)
481 return SINTTOFP_I128_F128;
482 if (RetVT == MVT::ppcf128)
483 return SINTTOFP_I128_PPCF128;
484 }
485 return UNKNOWN_LIBCALL;
486}
487
488/// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or
489/// UNKNOWN_LIBCALL if there is none.
490RTLIB::Libcall RTLIB::getUINTTOFP(EVT OpVT, EVT RetVT) {
491 if (OpVT == MVT::i32) {
492 if (RetVT == MVT::f16)
493 return UINTTOFP_I32_F16;
494 if (RetVT == MVT::f32)
495 return UINTTOFP_I32_F32;
496 if (RetVT == MVT::f64)
497 return UINTTOFP_I32_F64;
498 if (RetVT == MVT::f80)
499 return UINTTOFP_I32_F80;
500 if (RetVT == MVT::f128)
501 return UINTTOFP_I32_F128;
502 if (RetVT == MVT::ppcf128)
503 return UINTTOFP_I32_PPCF128;
504 } else if (OpVT == MVT::i64) {
505 if (RetVT == MVT::bf16)
506 return UINTTOFP_I64_BF16;
507 if (RetVT == MVT::f16)
508 return UINTTOFP_I64_F16;
509 if (RetVT == MVT::f32)
510 return UINTTOFP_I64_F32;
511 if (RetVT == MVT::f64)
512 return UINTTOFP_I64_F64;
513 if (RetVT == MVT::f80)
514 return UINTTOFP_I64_F80;
515 if (RetVT == MVT::f128)
516 return UINTTOFP_I64_F128;
517 if (RetVT == MVT::ppcf128)
518 return UINTTOFP_I64_PPCF128;
519 } else if (OpVT == MVT::i128) {
520 if (RetVT == MVT::f16)
521 return UINTTOFP_I128_F16;
522 if (RetVT == MVT::f32)
523 return UINTTOFP_I128_F32;
524 if (RetVT == MVT::f64)
525 return UINTTOFP_I128_F64;
526 if (RetVT == MVT::f80)
527 return UINTTOFP_I128_F80;
528 if (RetVT == MVT::f128)
529 return UINTTOFP_I128_F128;
530 if (RetVT == MVT::ppcf128)
531 return UINTTOFP_I128_PPCF128;
532 }
533 return UNKNOWN_LIBCALL;
534}
535
536RTLIB::Libcall RTLIB::getPOWI(EVT RetVT) {
537 return getFPLibCall(RetVT, POWI_F32, POWI_F64, POWI_F80, POWI_F128,
538 POWI_PPCF128);
539}
540
541RTLIB::Libcall RTLIB::getPOW(EVT RetVT) {
542 // TODO: Tablegen should generate this function
543 if (RetVT.isVector()) {
544 if (!RetVT.isSimple())
545 return RTLIB::UNKNOWN_LIBCALL;
546 switch (RetVT.getSimpleVT().SimpleTy) {
547 case MVT::v4f32:
548 return RTLIB::POW_V4F32;
549 case MVT::v2f64:
550 return RTLIB::POW_V2F64;
551 case MVT::nxv4f32:
552 return RTLIB::POW_NXV4F32;
553 case MVT::nxv2f64:
554 return RTLIB::POW_NXV2F64;
555 default:
556 return RTLIB::UNKNOWN_LIBCALL;
557 }
558 }
559
560 return getFPLibCall(RetVT, POW_F32, POW_F64, POW_F80, POW_F128, POW_PPCF128);
561}
562
563RTLIB::Libcall RTLIB::getLDEXP(EVT RetVT) {
564 return getFPLibCall(RetVT, LDEXP_F32, LDEXP_F64, LDEXP_F80, LDEXP_F128,
565 LDEXP_PPCF128);
566}
567
568RTLIB::Libcall RTLIB::getFREXP(EVT RetVT) {
569 return getFPLibCall(RetVT, FREXP_F32, FREXP_F64, FREXP_F80, FREXP_F128,
570 FREXP_PPCF128);
571}
572
573RTLIB::Libcall RTLIB::getSIN(EVT RetVT) {
574 return getFPLibCall(RetVT, SIN_F32, SIN_F64, SIN_F80, SIN_F128, SIN_PPCF128);
575}
576
577RTLIB::Libcall RTLIB::getCOS(EVT RetVT) {
578 return getFPLibCall(RetVT, COS_F32, COS_F64, COS_F80, COS_F128, COS_PPCF128);
579}
580
581RTLIB::Libcall RTLIB::getSINCOS(EVT RetVT) {
582 // TODO: Tablegen should generate this function
583 if (RetVT.isVector()) {
584 if (!RetVT.isSimple())
585 return RTLIB::UNKNOWN_LIBCALL;
586 switch (RetVT.getSimpleVT().SimpleTy) {
587 case MVT::v4f32:
588 return RTLIB::SINCOS_V4F32;
589 case MVT::v2f64:
590 return RTLIB::SINCOS_V2F64;
591 case MVT::nxv4f32:
592 return RTLIB::SINCOS_NXV4F32;
593 case MVT::nxv2f64:
594 return RTLIB::SINCOS_NXV2F64;
595 default:
596 return RTLIB::UNKNOWN_LIBCALL;
597 }
598 }
599
600 return getFPLibCall(RetVT, SINCOS_F32, SINCOS_F64, SINCOS_F80, SINCOS_F128,
601 SINCOS_PPCF128);
602}
603
604RTLIB::Libcall RTLIB::getSINCOSPI(EVT RetVT) {
605 // TODO: Tablegen should generate this function
606 if (RetVT.isVector()) {
607 if (!RetVT.isSimple())
608 return RTLIB::UNKNOWN_LIBCALL;
609 switch (RetVT.getSimpleVT().SimpleTy) {
610 case MVT::v4f32:
611 return RTLIB::SINCOSPI_V4F32;
612 case MVT::v2f64:
613 return RTLIB::SINCOSPI_V2F64;
614 case MVT::nxv4f32:
615 return RTLIB::SINCOSPI_NXV4F32;
616 case MVT::nxv2f64:
617 return RTLIB::SINCOSPI_NXV2F64;
618 default:
619 return RTLIB::UNKNOWN_LIBCALL;
620 }
621 }
622
623 return getFPLibCall(RetVT, SINCOSPI_F32, SINCOSPI_F64, SINCOSPI_F80,
624 SINCOSPI_F128, SINCOSPI_PPCF128);
625}
626
627RTLIB::Libcall RTLIB::getSINCOS_STRET(EVT RetVT) {
628 return getFPLibCall(RetVT, SINCOS_STRET_F32, SINCOS_STRET_F64,
629 UNKNOWN_LIBCALL, UNKNOWN_LIBCALL, UNKNOWN_LIBCALL);
630}
631
632RTLIB::Libcall RTLIB::getREM(EVT VT) {
633 // TODO: Tablegen should generate this function
634 if (VT.isVector()) {
635 if (!VT.isSimple())
636 return RTLIB::UNKNOWN_LIBCALL;
637 switch (VT.getSimpleVT().SimpleTy) {
638 case MVT::v4f32:
639 return RTLIB::REM_V4F32;
640 case MVT::v2f64:
641 return RTLIB::REM_V2F64;
642 case MVT::nxv4f32:
643 return RTLIB::REM_NXV4F32;
644 case MVT::nxv2f64:
645 return RTLIB::REM_NXV2F64;
646 default:
647 return RTLIB::UNKNOWN_LIBCALL;
648 }
649 }
650
651 return getFPLibCall(VT, REM_F32, REM_F64, REM_F80, REM_F128, REM_PPCF128);
652}
653
654RTLIB::Libcall RTLIB::getCBRT(EVT VT) {
655 // TODO: Tablegen should generate this function
656 if (VT.isVector()) {
657 if (!VT.isSimple())
658 return RTLIB::UNKNOWN_LIBCALL;
659 switch (VT.getSimpleVT().SimpleTy) {
660 case MVT::v4f32:
661 return RTLIB::CBRT_V4F32;
662 case MVT::v2f64:
663 return RTLIB::CBRT_V2F64;
664 case MVT::nxv4f32:
665 return RTLIB::CBRT_NXV4F32;
666 case MVT::nxv2f64:
667 return RTLIB::CBRT_NXV2F64;
668 default:
669 return RTLIB::UNKNOWN_LIBCALL;
670 }
671 }
672
673 return getFPLibCall(VT, CBRT_F32, CBRT_F64, CBRT_F80, CBRT_F128,
674 CBRT_PPCF128);
675}
676
677RTLIB::Libcall RTLIB::getMODF(EVT RetVT) {
678 // TODO: Tablegen should generate this function
679 if (RetVT.isVector()) {
680 if (!RetVT.isSimple())
681 return RTLIB::UNKNOWN_LIBCALL;
682 switch (RetVT.getSimpleVT().SimpleTy) {
683 case MVT::v4f32:
684 return RTLIB::MODF_V4F32;
685 case MVT::v2f64:
686 return RTLIB::MODF_V2F64;
687 case MVT::nxv4f32:
688 return RTLIB::MODF_NXV4F32;
689 case MVT::nxv2f64:
690 return RTLIB::MODF_NXV2F64;
691 default:
692 return RTLIB::UNKNOWN_LIBCALL;
693 }
694 }
695
696 return getFPLibCall(RetVT, MODF_F32, MODF_F64, MODF_F80, MODF_F128,
697 MODF_PPCF128);
698}
699
700RTLIB::Libcall RTLIB::getLROUND(EVT VT) {
701 if (VT == MVT::f32)
702 return RTLIB::LROUND_F32;
703 if (VT == MVT::f64)
704 return RTLIB::LROUND_F64;
705 if (VT == MVT::f80)
706 return RTLIB::LROUND_F80;
707 if (VT == MVT::f128)
708 return RTLIB::LROUND_F128;
709 if (VT == MVT::ppcf128)
710 return RTLIB::LROUND_PPCF128;
711
712 return RTLIB::UNKNOWN_LIBCALL;
713}
714
715RTLIB::Libcall RTLIB::getLLROUND(EVT VT) {
716 if (VT == MVT::f32)
717 return RTLIB::LLROUND_F32;
718 if (VT == MVT::f64)
719 return RTLIB::LLROUND_F64;
720 if (VT == MVT::f80)
721 return RTLIB::LLROUND_F80;
722 if (VT == MVT::f128)
723 return RTLIB::LLROUND_F128;
724 if (VT == MVT::ppcf128)
725 return RTLIB::LLROUND_PPCF128;
726
727 return RTLIB::UNKNOWN_LIBCALL;
728}
729
730RTLIB::Libcall RTLIB::getLRINT(EVT VT) {
731 if (VT == MVT::f32)
732 return RTLIB::LRINT_F32;
733 if (VT == MVT::f64)
734 return RTLIB::LRINT_F64;
735 if (VT == MVT::f80)
736 return RTLIB::LRINT_F80;
737 if (VT == MVT::f128)
738 return RTLIB::LRINT_F128;
739 if (VT == MVT::ppcf128)
740 return RTLIB::LRINT_PPCF128;
741 return RTLIB::UNKNOWN_LIBCALL;
742}
743
744RTLIB::Libcall RTLIB::getLLRINT(EVT VT) {
745 if (VT == MVT::f32)
746 return RTLIB::LLRINT_F32;
747 if (VT == MVT::f64)
748 return RTLIB::LLRINT_F64;
749 if (VT == MVT::f80)
750 return RTLIB::LLRINT_F80;
751 if (VT == MVT::f128)
752 return RTLIB::LLRINT_F128;
753 if (VT == MVT::ppcf128)
754 return RTLIB::LLRINT_PPCF128;
755 return RTLIB::UNKNOWN_LIBCALL;
756}
757
758RTLIB::Libcall RTLIB::getOutlineAtomicHelper(const Libcall (&LC)[5][4],
759 AtomicOrdering Order,
760 uint64_t MemSize) {
761 unsigned ModeN, ModelN;
762 switch (MemSize) {
763 case 1:
764 ModeN = 0;
765 break;
766 case 2:
767 ModeN = 1;
768 break;
769 case 4:
770 ModeN = 2;
771 break;
772 case 8:
773 ModeN = 3;
774 break;
775 case 16:
776 ModeN = 4;
777 break;
778 default:
779 return RTLIB::UNKNOWN_LIBCALL;
780 }
781
782 switch (Order) {
784 ModelN = 0;
785 break;
787 ModelN = 1;
788 break;
790 ModelN = 2;
791 break;
794 ModelN = 3;
795 break;
796 default:
797 return UNKNOWN_LIBCALL;
798 }
799
800 return LC[ModeN][ModelN];
801}
802
803RTLIB::Libcall RTLIB::getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order,
804 MVT VT) {
805 if (!VT.isScalarInteger())
806 return UNKNOWN_LIBCALL;
807 uint64_t MemSize = VT.getScalarSizeInBits() / 8;
808
809#define LCALLS(A, B) \
810 { A##B##_RELAX, A##B##_ACQ, A##B##_REL, A##B##_ACQ_REL }
811#define LCALL5(A) \
812 LCALLS(A, 1), LCALLS(A, 2), LCALLS(A, 4), LCALLS(A, 8), LCALLS(A, 16)
813 switch (Opc) {
815 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_CAS)};
816 return getOutlineAtomicHelper(LC, Order, MemSize);
817 }
818 case ISD::ATOMIC_SWAP: {
819 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_SWP)};
820 return getOutlineAtomicHelper(LC, Order, MemSize);
821 }
823 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDADD)};
824 return getOutlineAtomicHelper(LC, Order, MemSize);
825 }
826 case ISD::ATOMIC_LOAD_OR: {
827 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDSET)};
828 return getOutlineAtomicHelper(LC, Order, MemSize);
829 }
831 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDCLR)};
832 return getOutlineAtomicHelper(LC, Order, MemSize);
833 }
835 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDEOR)};
836 return getOutlineAtomicHelper(LC, Order, MemSize);
837 }
838 default:
839 return UNKNOWN_LIBCALL;
840 }
841#undef LCALLS
842#undef LCALL5
843}
844
845RTLIB::Libcall RTLIB::getSYNC(unsigned Opc, MVT VT) {
846#define OP_TO_LIBCALL(Name, Enum) \
847 case Name: \
848 switch (VT.SimpleTy) { \
849 default: \
850 return UNKNOWN_LIBCALL; \
851 case MVT::i8: \
852 return Enum##_1; \
853 case MVT::i16: \
854 return Enum##_2; \
855 case MVT::i32: \
856 return Enum##_4; \
857 case MVT::i64: \
858 return Enum##_8; \
859 case MVT::i128: \
860 return Enum##_16; \
861 }
862
863 switch (Opc) {
864 OP_TO_LIBCALL(ISD::ATOMIC_SWAP, SYNC_LOCK_TEST_AND_SET)
865 OP_TO_LIBCALL(ISD::ATOMIC_CMP_SWAP, SYNC_VAL_COMPARE_AND_SWAP)
866 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_ADD, SYNC_FETCH_AND_ADD)
867 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_SUB, SYNC_FETCH_AND_SUB)
868 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_AND, SYNC_FETCH_AND_AND)
869 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_OR, SYNC_FETCH_AND_OR)
870 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_XOR, SYNC_FETCH_AND_XOR)
871 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_NAND, SYNC_FETCH_AND_NAND)
872 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MAX, SYNC_FETCH_AND_MAX)
873 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMAX, SYNC_FETCH_AND_UMAX)
874 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MIN, SYNC_FETCH_AND_MIN)
875 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMIN, SYNC_FETCH_AND_UMIN)
876 }
877
878#undef OP_TO_LIBCALL
879
880 return UNKNOWN_LIBCALL;
881}
882
884 switch (ElementSize) {
885 case 1:
886 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_1;
887 case 2:
888 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_2;
889 case 4:
890 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_4;
891 case 8:
892 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_8;
893 case 16:
894 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_16;
895 default:
896 return UNKNOWN_LIBCALL;
897 }
898}
899
901 switch (ElementSize) {
902 case 1:
903 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1;
904 case 2:
905 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2;
906 case 4:
907 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4;
908 case 8:
909 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8;
910 case 16:
911 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16;
912 default:
913 return UNKNOWN_LIBCALL;
914 }
915}
916
918 switch (ElementSize) {
919 case 1:
920 return MEMSET_ELEMENT_UNORDERED_ATOMIC_1;
921 case 2:
922 return MEMSET_ELEMENT_UNORDERED_ATOMIC_2;
923 case 4:
924 return MEMSET_ELEMENT_UNORDERED_ATOMIC_4;
925 case 8:
926 return MEMSET_ELEMENT_UNORDERED_ATOMIC_8;
927 case 16:
928 return MEMSET_ELEMENT_UNORDERED_ATOMIC_16;
929 default:
930 return UNKNOWN_LIBCALL;
931 }
932}
933
935 RTLIB::LibcallImpl Impl) const {
936 switch (Impl) {
937 case RTLIB::impl___aeabi_dcmpeq__une:
938 case RTLIB::impl___aeabi_fcmpeq__une:
939 // Usage in the eq case, so we have to invert the comparison.
940 return ISD::SETEQ;
941 case RTLIB::impl___aeabi_dcmpeq__oeq:
942 case RTLIB::impl___aeabi_fcmpeq__oeq:
943 // Normal comparison to boolean value.
944 return ISD::SETNE;
945 case RTLIB::impl___aeabi_dcmplt:
946 case RTLIB::impl___aeabi_dcmple:
947 case RTLIB::impl___aeabi_dcmpge:
948 case RTLIB::impl___aeabi_dcmpgt:
949 case RTLIB::impl___aeabi_dcmpun:
950 case RTLIB::impl___aeabi_fcmplt:
951 case RTLIB::impl___aeabi_fcmple:
952 case RTLIB::impl___aeabi_fcmpge:
953 case RTLIB::impl___aeabi_fcmpgt:
954 /// The AEABI versions return a typical boolean value, so we can compare
955 /// against the integer result as simply != 0.
956 return ISD::SETNE;
957 default:
958 break;
959 }
960
961 // Assume libgcc/compiler-rt behavior. Most of the cases are really aliases of
962 // each other, and return a 3-way comparison style result of -1, 0, or 1
963 // depending on lt/eq/gt.
964 //
965 // FIXME: It would be cleaner to directly express this as a 3-way comparison
966 // soft FP libcall instead of individual compares.
967 RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl);
968 switch (LC) {
969 case RTLIB::OEQ_F32:
970 case RTLIB::OEQ_F64:
971 case RTLIB::OEQ_F128:
972 case RTLIB::OEQ_PPCF128:
973 return ISD::SETEQ;
974 case RTLIB::UNE_F32:
975 case RTLIB::UNE_F64:
976 case RTLIB::UNE_F128:
977 case RTLIB::UNE_PPCF128:
978 return ISD::SETNE;
979 case RTLIB::OGE_F32:
980 case RTLIB::OGE_F64:
981 case RTLIB::OGE_F128:
982 case RTLIB::OGE_PPCF128:
983 return ISD::SETGE;
984 case RTLIB::OLT_F32:
985 case RTLIB::OLT_F64:
986 case RTLIB::OLT_F128:
987 case RTLIB::OLT_PPCF128:
988 return ISD::SETLT;
989 case RTLIB::OLE_F32:
990 case RTLIB::OLE_F64:
991 case RTLIB::OLE_F128:
992 case RTLIB::OLE_PPCF128:
993 return ISD::SETLE;
994 case RTLIB::OGT_F32:
995 case RTLIB::OGT_F64:
996 case RTLIB::OGT_F128:
997 case RTLIB::OGT_PPCF128:
998 return ISD::SETGT;
999 case RTLIB::UO_F32:
1000 case RTLIB::UO_F64:
1001 case RTLIB::UO_F128:
1002 case RTLIB::UO_PPCF128:
1003 return ISD::SETNE;
1004 default:
1005 llvm_unreachable("not a compare libcall");
1006 }
1007}
1008
1009/// NOTE: The TargetMachine owns TLOF.
1011 const TargetSubtargetInfo &STI)
1012 : TM(tm),
1013 RuntimeLibcallInfo(TM.getTargetTriple(), TM.Options.ExceptionModel,
1014 TM.Options.FloatABIType, TM.Options.EABIVersion,
1015 TM.Options.MCOptions.getABIName(), TM.Options.VecLib),
1016 Libcalls(RuntimeLibcallInfo, STI) {
1017 initActions();
1018
1019 // Perform these initializations only once.
1025 HasExtractBitsInsn = false;
1026 JumpIsExpensive = JumpIsExpensiveOverride;
1028 EnableExtLdPromotion = false;
1029 StackPointerRegisterToSaveRestore = 0;
1030 BooleanContents = UndefinedBooleanContent;
1031 BooleanFloatContents = UndefinedBooleanContent;
1032 BooleanVectorContents = UndefinedBooleanContent;
1033 SchedPreferenceInfo = Sched::ILP;
1036 MaxBytesForAlignment = 0;
1037 MaxAtomicSizeInBitsSupported = 0;
1038
1039 // Assume that even with libcalls, no target supports wider than 128 bit
1040 // division.
1041 MaxDivRemBitWidthSupported = 128;
1042
1043 MaxLargeFPConvertBitWidthSupported = 128;
1044
1045 MinCmpXchgSizeInBits = 0;
1046 SupportsUnalignedAtomics = false;
1047
1048 MinimumBitTestCmps = MinimumBitTestCmpsOverride;
1049}
1050
1051// Define the virtual destructor out-of-line to act as a key method to anchor
1052// debug info (see coding standards).
1054
1056 // All operations default to being supported.
1057 memset(OpActions, 0, sizeof(OpActions));
1058 memset(LoadExtActions, 0, sizeof(LoadExtActions));
1059 memset(AtomicLoadExtActions, 0, sizeof(AtomicLoadExtActions));
1060 memset(TruncStoreActions, 0, sizeof(TruncStoreActions));
1061 memset(IndexedModeActions, 0, sizeof(IndexedModeActions));
1062 memset(CondCodeActions, 0, sizeof(CondCodeActions));
1063 llvm::fill(RegClassForVT, nullptr);
1064 llvm::fill(TargetDAGCombineArray, 0);
1065
1066 // Let extending atomic loads be unsupported by default.
1067 for (MVT ValVT : MVT::all_valuetypes())
1068 for (MVT MemVT : MVT::all_valuetypes())
1070 Expand);
1071
1072 // We're somewhat special casing MVT::i2 and MVT::i4. Ideally we want to
1073 // remove this and targets should individually set these types if not legal.
1076 for (MVT VT : {MVT::i2, MVT::i4})
1077 OpActions[(unsigned)VT.SimpleTy][NT] = Expand;
1078 }
1079 for (MVT AVT : MVT::all_valuetypes()) {
1080 for (MVT VT : {MVT::i2, MVT::i4, MVT::v128i2, MVT::v64i4}) {
1081 setTruncStoreAction(AVT, VT, Expand);
1084 }
1085 }
1086 for (unsigned IM = (unsigned)ISD::PRE_INC;
1087 IM != (unsigned)ISD::LAST_INDEXED_MODE; ++IM) {
1088 for (MVT VT : {MVT::i2, MVT::i4}) {
1093 }
1094 }
1095
1096 for (MVT VT : MVT::fp_valuetypes()) {
1097 MVT IntVT = MVT::getIntegerVT(VT.getFixedSizeInBits());
1098 if (IntVT.isValid()) {
1101 }
1102 }
1103
1104 // If f16 fma is not natively supported, the value must be promoted to an f64
1105 // (and not to f32!) to prevent double rounding issues.
1106 AddPromotedToType(ISD::FMA, MVT::f16, MVT::f64);
1107 AddPromotedToType(ISD::STRICT_FMA, MVT::f16, MVT::f64);
1108
1109 // Set default actions for various operations.
1110 for (MVT VT : MVT::all_valuetypes()) {
1111 // Default all indexed load / store to expand.
1112 for (unsigned IM = (unsigned)ISD::PRE_INC;
1113 IM != (unsigned)ISD::LAST_INDEXED_MODE; ++IM) {
1118 }
1119
1120 // Most backends expect to see the node which just returns the value loaded.
1122
1123 // These operations default to expand.
1152 ISD::FMULADD},
1153 VT, Expand);
1154
1155 // Overflow operations default to expand
1158 VT, Expand);
1159
1160 // Carry-using overflow operations default to expand.
1163 VT, Expand);
1164
1165 // ADDC/ADDE/SUBC/SUBE default to expand.
1167 Expand);
1168
1169 // [US]CMP default to expand
1171
1172 // Halving adds
1175 Expand);
1176
1177 // Absolute difference
1179
1180 // Carry-less multiply
1182
1183 // Saturated trunc
1187
1188 // These default to Expand so they will be expanded to CTLZ/CTTZ by default.
1190 Expand);
1192
1194
1195 // These library functions default to expand.
1198 VT, Expand);
1199
1200 // These operations default to expand for vector types.
1201 if (VT.isVector())
1207 VT, Expand);
1208
1209 // Constrained floating-point operations default to expand.
1210#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
1211 setOperationAction(ISD::STRICT_##DAGN, VT, Expand);
1212#include "llvm/IR/ConstrainedOps.def"
1213
1214 // For most targets @llvm.get.dynamic.area.offset just returns 0.
1216
1217 // Vector reduction default to expand.
1225 VT, Expand);
1226
1227 // Named vector shuffles default to expand.
1229 Expand);
1230
1231 // Only some target support this vector operation. Most need to expand it.
1233
1234 // VP operations default to expand.
1235#define BEGIN_REGISTER_VP_SDNODE(SDOPC, ...) \
1236 setOperationAction(ISD::SDOPC, VT, Expand);
1237#include "llvm/IR/VPIntrinsics.def"
1238
1239 // Masked vector extracts default to expand.
1241
1244
1245 // FP environment operations default to expand.
1249
1251 }
1252
1253 // Most targets ignore the @llvm.prefetch intrinsic.
1255
1256 // Most targets also ignore the @llvm.readcyclecounter intrinsic.
1258
1259 // Most targets also ignore the @llvm.readsteadycounter intrinsic.
1261
1262 // ConstantFP nodes default to expand. Targets can either change this to
1263 // Legal, in which case all fp constants are legal, or use isFPImmLegal()
1264 // to optimize expansions for certain constants.
1266 {MVT::bf16, MVT::f16, MVT::f32, MVT::f64, MVT::f80, MVT::f128},
1267 Expand);
1268
1269 // Insert custom handling default for llvm.canonicalize.*.
1271 {MVT::f16, MVT::f32, MVT::f64, MVT::f128}, Expand);
1272
1273 // FIXME: Query RuntimeLibCalls to make the decision.
1275 {MVT::f32, MVT::f64, MVT::f128}, LibCall);
1276
1279 MVT::f16, Promote);
1280 // Default ISD::TRAP to expand (which turns it into abort).
1281 setOperationAction(ISD::TRAP, MVT::Other, Expand);
1282
1283 // On most systems, DEBUGTRAP and TRAP have no difference. The "Expand"
1284 // here is to inform DAG Legalizer to replace DEBUGTRAP with TRAP.
1286
1288
1291
1292 for (MVT VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {
1295 }
1297
1298 // This one by default will call __clear_cache unless the target
1299 // wants something different.
1301
1302 // By default, STACKADDRESS nodes are expanded like STACKSAVE nodes.
1303 // On SPARC targets, custom lowering is required.
1305}
1306
1308 EVT) const {
1309 return MVT::getIntegerVT(DL.getPointerSizeInBits(0));
1310}
1311
1313 const DataLayout &DL) const {
1314 assert(LHSTy.isInteger() && "Shift amount is not an integer type!");
1315 if (LHSTy.isVector())
1316 return LHSTy;
1317 MVT ShiftVT = getScalarShiftAmountTy(DL, LHSTy);
1318 // If any possible shift value won't fit in the prefered type, just use
1319 // something safe. Assume it will be legalized when the shift is expanded.
1320 if (ShiftVT.getSizeInBits() < Log2_32_Ceil(LHSTy.getSizeInBits()))
1321 ShiftVT = MVT::i32;
1322 assert(ShiftVT.getSizeInBits() >= Log2_32_Ceil(LHSTy.getSizeInBits()) &&
1323 "ShiftVT is still too small!");
1324 return ShiftVT;
1325}
1326
1327bool TargetLoweringBase::canOpTrap(unsigned Op, EVT VT) const {
1328 assert(isTypeLegal(VT));
1329 switch (Op) {
1330 default:
1331 return false;
1332 case ISD::SDIV:
1333 case ISD::UDIV:
1334 case ISD::SREM:
1335 case ISD::UREM:
1336 return true;
1337 }
1338}
1339
1341 unsigned DestAS) const {
1342 return TM.isNoopAddrSpaceCast(SrcAS, DestAS);
1343}
1344
1346 Type *RetTy, ElementCount EC, bool ZeroIsPoison,
1347 const ConstantRange *VScaleRange) const {
1348 // Find the smallest "sensible" element type to use for the expansion.
1349 ConstantRange CR(APInt(64, EC.getKnownMinValue()));
1350 if (EC.isScalable())
1351 CR = CR.umul_sat(*VScaleRange);
1352
1353 if (ZeroIsPoison)
1354 CR = CR.subtract(APInt(64, 1));
1355
1356 unsigned EltWidth = RetTy->getScalarSizeInBits();
1357 EltWidth = std::min(EltWidth, CR.getActiveBits());
1358 EltWidth = std::max(llvm::bit_ceil(EltWidth), (unsigned)8);
1359
1360 return EltWidth;
1361}
1362
1364 // If the command-line option was specified, ignore this request.
1365 if (!JumpIsExpensiveOverride.getNumOccurrences())
1366 JumpIsExpensive = isExpensive;
1367}
1368
1371 // If this is a simple type, use the ComputeRegisterProp mechanism.
1372 if (VT.isSimple()) {
1373 MVT SVT = VT.getSimpleVT();
1374 assert((unsigned)SVT.SimpleTy < std::size(TransformToType));
1375 MVT NVT = TransformToType[SVT.SimpleTy];
1376 LegalizeTypeAction LA = ValueTypeActions.getTypeAction(SVT);
1377
1378 assert((LA == TypeLegal || LA == TypeSoftenFloat ||
1379 LA == TypeSoftPromoteHalf ||
1380 (NVT.isVector() ||
1381 ValueTypeActions.getTypeAction(NVT) != TypePromoteInteger)) &&
1382 "Promote may not follow Expand or Promote");
1383
1384 if (LA == TypeSplitVector)
1385 return LegalizeKind(LA, EVT(SVT).getHalfNumVectorElementsVT(Context));
1386 if (LA == TypeScalarizeVector)
1387 return LegalizeKind(LA, SVT.getVectorElementType());
1388 return LegalizeKind(LA, NVT);
1389 }
1390
1391 // Handle Extended Scalar Types.
1392 if (!VT.isVector()) {
1393 assert(VT.isInteger() && "Float types must be simple");
1394 unsigned BitSize = VT.getSizeInBits();
1395 // First promote to a power-of-two size, then expand if necessary.
1396 if (BitSize < 8 || !isPowerOf2_32(BitSize)) {
1397 EVT NVT = VT.getRoundIntegerType(Context);
1398 assert(NVT != VT && "Unable to round integer VT");
1399 LegalizeKind NextStep = getTypeConversion(Context, NVT);
1400 // Avoid multi-step promotion.
1401 if (NextStep.first == TypePromoteInteger)
1402 return NextStep;
1403 // Return rounded integer type.
1404 return LegalizeKind(TypePromoteInteger, NVT);
1405 }
1406
1408 EVT::getIntegerVT(Context, VT.getSizeInBits() / 2));
1409 }
1410
1411 // Handle vector types.
1412 ElementCount NumElts = VT.getVectorElementCount();
1413 EVT EltVT = VT.getVectorElementType();
1414
1415 // Vectors with only one element are always scalarized.
1416 if (NumElts.isScalar())
1417 return LegalizeKind(TypeScalarizeVector, EltVT);
1418
1419 // Try to widen vector elements until the element type is a power of two and
1420 // promote it to a legal type later on, for example:
1421 // <3 x i8> -> <4 x i8> -> <4 x i32>
1422 if (EltVT.isInteger()) {
1423 // Vectors with a number of elements that is not a power of two are always
1424 // widened, for example <3 x i8> -> <4 x i8>.
1425 if (!VT.isPow2VectorType()) {
1426 NumElts = NumElts.coefficientNextPowerOf2();
1427 EVT NVT = EVT::getVectorVT(Context, EltVT, NumElts);
1428 return LegalizeKind(TypeWidenVector, NVT);
1429 }
1430
1431 // Examine the element type.
1432 LegalizeKind LK = getTypeConversion(Context, EltVT);
1433
1434 // If type is to be expanded, split the vector.
1435 // <4 x i140> -> <2 x i140>
1436 if (LK.first == TypeExpandInteger) {
1437 if (NumElts.isScalable() && NumElts.getKnownMinValue() == 1)
1440 VT.getHalfNumVectorElementsVT(Context));
1441 }
1442
1443 // Promote the integer element types until a legal vector type is found
1444 // or until the element integer type is too big. If a legal type was not
1445 // found, fallback to the usual mechanism of widening/splitting the
1446 // vector.
1447 EVT OldEltVT = EltVT;
1448 while (true) {
1449 // Increase the bitwidth of the element to the next pow-of-two
1450 // (which is greater than 8 bits).
1451 EltVT = EVT::getIntegerVT(Context, 1 + EltVT.getSizeInBits())
1452 .getRoundIntegerType(Context);
1453
1454 // Stop trying when getting a non-simple element type.
1455 // Note that vector elements may be greater than legal vector element
1456 // types. Example: X86 XMM registers hold 64bit element on 32bit
1457 // systems.
1458 if (!EltVT.isSimple())
1459 break;
1460
1461 // Build a new vector type and check if it is legal.
1462 MVT NVT = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);
1463 // Found a legal promoted vector type.
1464 if (NVT != MVT() && ValueTypeActions.getTypeAction(NVT) == TypeLegal)
1466 EVT::getVectorVT(Context, EltVT, NumElts));
1467 }
1468
1469 // Reset the type to the unexpanded type if we did not find a legal vector
1470 // type with a promoted vector element type.
1471 EltVT = OldEltVT;
1472 }
1473
1474 // Try to widen the vector until a legal type is found.
1475 // If there is no wider legal type, split the vector.
1476 while (true) {
1477 // Round up to the next power of 2.
1478 NumElts = NumElts.coefficientNextPowerOf2();
1479
1480 // If there is no simple vector type with this many elements then there
1481 // cannot be a larger legal vector type. Note that this assumes that
1482 // there are no skipped intermediate vector types in the simple types.
1483 if (!EltVT.isSimple())
1484 break;
1485 MVT LargerVector = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);
1486 if (LargerVector == MVT())
1487 break;
1488
1489 // If this type is legal then widen the vector.
1490 if (ValueTypeActions.getTypeAction(LargerVector) == TypeLegal)
1491 return LegalizeKind(TypeWidenVector, LargerVector);
1492 }
1493
1494 // Widen odd vectors to next power of two.
1495 if (!VT.isPow2VectorType()) {
1496 EVT NVT = VT.getPow2VectorType(Context);
1497 return LegalizeKind(TypeWidenVector, NVT);
1498 }
1499
1502
1503 // Vectors with illegal element types are expanded.
1504 EVT NVT = EVT::getVectorVT(Context, EltVT,
1506 return LegalizeKind(TypeSplitVector, NVT);
1507}
1508
1509static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT,
1510 unsigned &NumIntermediates,
1511 MVT &RegisterVT,
1512 TargetLoweringBase *TLI) {
1513 // Figure out the right, legal destination reg to copy into.
1515 MVT EltTy = VT.getVectorElementType();
1516
1517 unsigned NumVectorRegs = 1;
1518
1519 // Scalable vectors cannot be scalarized, so splitting or widening is
1520 // required.
1521 if (VT.isScalableVector() && !isPowerOf2_32(EC.getKnownMinValue()))
1523 "Splitting or widening of non-power-of-2 MVTs is not implemented.");
1524
1525 // FIXME: We don't support non-power-of-2-sized vectors for now.
1526 // Ideally we could break down into LHS/RHS like LegalizeDAG does.
1527 if (!isPowerOf2_32(EC.getKnownMinValue())) {
1528 // Split EC to unit size (scalable property is preserved).
1529 NumVectorRegs = EC.getKnownMinValue();
1530 EC = ElementCount::getFixed(1);
1531 }
1532
1533 // Divide the input until we get to a supported size. This will
1534 // always end up with an EC that represent a scalar or a scalable
1535 // scalar.
1536 while (EC.getKnownMinValue() > 1 &&
1537 !TLI->isTypeLegal(MVT::getVectorVT(EltTy, EC))) {
1538 EC = EC.divideCoefficientBy(2);
1539 NumVectorRegs <<= 1;
1540 }
1541
1542 NumIntermediates = NumVectorRegs;
1543
1544 MVT NewVT = MVT::getVectorVT(EltTy, EC);
1545 if (!TLI->isTypeLegal(NewVT))
1546 NewVT = EltTy;
1547 IntermediateVT = NewVT;
1548
1549 unsigned LaneSizeInBits = NewVT.getScalarSizeInBits();
1550
1551 // Convert sizes such as i33 to i64.
1552 LaneSizeInBits = llvm::bit_ceil(LaneSizeInBits);
1553
1554 MVT DestVT = TLI->getRegisterType(NewVT);
1555 RegisterVT = DestVT;
1556 if (EVT(DestVT).bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16.
1557 return NumVectorRegs * (LaneSizeInBits / DestVT.getScalarSizeInBits());
1558
1559 // Otherwise, promotion or legal types use the same number of registers as
1560 // the vector decimated to the appropriate level.
1561 return NumVectorRegs;
1562}
1563
1564/// isLegalRC - Return true if the value types that can be represented by the
1565/// specified register class are all legal.
1567 const TargetRegisterClass &RC) const {
1568 for (const auto *I = TRI.legalclasstypes_begin(RC); *I != MVT::Other; ++I)
1569 if (isTypeLegal(*I))
1570 return true;
1571 return false;
1572}
1573
1574/// Replace/modify any TargetFrameIndex operands with a targte-dependent
1575/// sequence of memory operands that is recognized by PrologEpilogInserter.
1578 MachineBasicBlock *MBB) const {
1579 MachineInstr *MI = &InitialMI;
1580 MachineFunction &MF = *MI->getMF();
1581 MachineFrameInfo &MFI = MF.getFrameInfo();
1582
1583 // We're handling multiple types of operands here:
1584 // PATCHPOINT MetaArgs - live-in, read only, direct
1585 // STATEPOINT Deopt Spill - live-through, read only, indirect
1586 // STATEPOINT Deopt Alloca - live-through, read only, direct
1587 // (We're currently conservative and mark the deopt slots read/write in
1588 // practice.)
1589 // STATEPOINT GC Spill - live-through, read/write, indirect
1590 // STATEPOINT GC Alloca - live-through, read/write, direct
1591 // The live-in vs live-through is handled already (the live through ones are
1592 // all stack slots), but we need to handle the different type of stackmap
1593 // operands and memory effects here.
1594
1595 if (llvm::none_of(MI->operands(),
1596 [](MachineOperand &Operand) { return Operand.isFI(); }))
1597 return MBB;
1598
1599 MachineInstrBuilder MIB = BuildMI(MF, MI->getDebugLoc(), MI->getDesc());
1600
1601 // Inherit previous memory operands.
1602 MIB.cloneMemRefs(*MI);
1603
1604 for (unsigned i = 0; i < MI->getNumOperands(); ++i) {
1605 MachineOperand &MO = MI->getOperand(i);
1606 if (!MO.isFI()) {
1607 // Index of Def operand this Use it tied to.
1608 // Since Defs are coming before Uses, if Use is tied, then
1609 // index of Def must be smaller that index of that Use.
1610 // Also, Defs preserve their position in new MI.
1611 unsigned TiedTo = i;
1612 if (MO.isReg() && MO.isTied())
1613 TiedTo = MI->findTiedOperandIdx(i);
1614 MIB.add(MO);
1615 if (TiedTo < i)
1616 MIB->tieOperands(TiedTo, MIB->getNumOperands() - 1);
1617 continue;
1618 }
1619
1620 // foldMemoryOperand builds a new MI after replacing a single FI operand
1621 // with the canonical set of five x86 addressing-mode operands.
1622 int FI = MO.getIndex();
1623
1624 // Add frame index operands recognized by stackmaps.cpp
1626 // indirect-mem-ref tag, size, #FI, offset.
1627 // Used for spills inserted by StatepointLowering. This codepath is not
1628 // used for patchpoints/stackmaps at all, for these spilling is done via
1629 // foldMemoryOperand callback only.
1630 assert(MI->getOpcode() == TargetOpcode::STATEPOINT && "sanity");
1631 MIB.addImm(StackMaps::IndirectMemRefOp);
1632 MIB.addImm(MFI.getObjectSize(FI));
1633 MIB.add(MO);
1634 MIB.addImm(0);
1635 } else {
1636 // direct-mem-ref tag, #FI, offset.
1637 // Used by patchpoint, and direct alloca arguments to statepoints
1638 MIB.addImm(StackMaps::DirectMemRefOp);
1639 MIB.add(MO);
1640 MIB.addImm(0);
1641 }
1642
1643 assert(MIB->mayLoad() && "Folded a stackmap use to a non-load!");
1644
1645 // Add a new memory operand for this FI.
1646 assert(MFI.getObjectOffset(FI) != -1);
1647
1648 // Note: STATEPOINT MMOs are added during SelectionDAG. STACKMAP, and
1649 // PATCHPOINT should be updated to do the same. (TODO)
1650 if (MI->getOpcode() != TargetOpcode::STATEPOINT) {
1651 auto Flags = MachineMemOperand::MOLoad;
1653 MachinePointerInfo::getFixedStack(MF, FI), Flags,
1655 MIB->addMemOperand(MF, MMO);
1656 }
1657 }
1658 MBB->insert(MachineBasicBlock::iterator(MI), MIB);
1659 MI->eraseFromParent();
1660 return MBB;
1661}
1662
1663/// findRepresentativeClass - Return the largest legal super-reg register class
1664/// of the register class for the specified type and its associated "cost".
1665// This function is in TargetLowering because it uses RegClassForVT which would
1666// need to be moved to TargetRegisterInfo and would necessitate moving
1667// isTypeLegal over as well - a massive change that would just require
1668// TargetLowering having a TargetRegisterInfo class member that it would use.
1669std::pair<const TargetRegisterClass *, uint8_t>
1671 MVT VT) const {
1672 const TargetRegisterClass *RC = RegClassForVT[VT.SimpleTy];
1673 if (!RC)
1674 return std::make_pair(RC, 0);
1675
1676 // Compute the set of all super-register classes.
1677 BitVector SuperRegRC(TRI->getNumRegClasses());
1678 for (SuperRegClassIterator RCI(RC, TRI); RCI.isValid(); ++RCI)
1679 SuperRegRC.setBitsInMask(RCI.getMask());
1680
1681 // Find the first legal register class with the largest spill size.
1682 const TargetRegisterClass *BestRC = RC;
1683 for (unsigned i : SuperRegRC.set_bits()) {
1684 const TargetRegisterClass *SuperRC = TRI->getRegClass(i);
1685 // We want the largest possible spill size.
1686 if (TRI->getSpillSize(*SuperRC) <= TRI->getSpillSize(*BestRC))
1687 continue;
1688 if (!isLegalRC(*TRI, *SuperRC))
1689 continue;
1690 BestRC = SuperRC;
1691 }
1692 return std::make_pair(BestRC, 1);
1693}
1694
1695/// computeRegisterProperties - Once all of the register classes are added,
1696/// this allows us to compute derived properties we expose.
1698 const TargetRegisterInfo *TRI) {
1699 // Everything defaults to needing one register.
1700 for (unsigned i = 0; i != MVT::VALUETYPE_SIZE; ++i) {
1701 NumRegistersForVT[i] = 1;
1702 RegisterTypeForVT[i] = TransformToType[i] = (MVT::SimpleValueType)i;
1703 }
1704 // ...except isVoid, which doesn't need any registers.
1705 NumRegistersForVT[MVT::isVoid] = 0;
1706
1707 // Find the largest integer register class.
1708 unsigned LargestIntReg = MVT::LAST_INTEGER_VALUETYPE;
1709 for (; RegClassForVT[LargestIntReg] == nullptr; --LargestIntReg)
1710 assert(LargestIntReg != MVT::i1 && "No integer registers defined!");
1711
1712 // Every integer value type larger than this largest register takes twice as
1713 // many registers to represent as the previous ValueType.
1714 for (unsigned ExpandedReg = LargestIntReg + 1;
1715 ExpandedReg <= MVT::LAST_INTEGER_VALUETYPE; ++ExpandedReg) {
1716 NumRegistersForVT[ExpandedReg] = 2*NumRegistersForVT[ExpandedReg-1];
1717 RegisterTypeForVT[ExpandedReg] = (MVT::SimpleValueType)LargestIntReg;
1718 TransformToType[ExpandedReg] = (MVT::SimpleValueType)(ExpandedReg - 1);
1719 ValueTypeActions.setTypeAction((MVT::SimpleValueType)ExpandedReg,
1721 }
1722
1723 // Inspect all of the ValueType's smaller than the largest integer
1724 // register to see which ones need promotion.
1725 unsigned LegalIntReg = LargestIntReg;
1726 for (unsigned IntReg = LargestIntReg - 1;
1727 IntReg >= (unsigned)MVT::i1; --IntReg) {
1728 MVT IVT = (MVT::SimpleValueType)IntReg;
1729 if (isTypeLegal(IVT)) {
1730 LegalIntReg = IntReg;
1731 } else {
1732 RegisterTypeForVT[IntReg] = TransformToType[IntReg] =
1733 (MVT::SimpleValueType)LegalIntReg;
1734 ValueTypeActions.setTypeAction(IVT, TypePromoteInteger);
1735 }
1736 }
1737
1738 // ppcf128 type is really two f64's.
1739 if (!isTypeLegal(MVT::ppcf128)) {
1740 if (isTypeLegal(MVT::f64)) {
1741 NumRegistersForVT[MVT::ppcf128] = 2*NumRegistersForVT[MVT::f64];
1742 RegisterTypeForVT[MVT::ppcf128] = MVT::f64;
1743 TransformToType[MVT::ppcf128] = MVT::f64;
1744 ValueTypeActions.setTypeAction(MVT::ppcf128, TypeExpandFloat);
1745 } else {
1746 NumRegistersForVT[MVT::ppcf128] = NumRegistersForVT[MVT::i128];
1747 RegisterTypeForVT[MVT::ppcf128] = RegisterTypeForVT[MVT::i128];
1748 TransformToType[MVT::ppcf128] = MVT::i128;
1749 ValueTypeActions.setTypeAction(MVT::ppcf128, TypeSoftenFloat);
1750 }
1751 }
1752
1753 // Decide how to handle f128. If the target does not have native f128 support,
1754 // expand it to i128 and we will be generating soft float library calls.
1755 if (!isTypeLegal(MVT::f128)) {
1756 NumRegistersForVT[MVT::f128] = NumRegistersForVT[MVT::i128];
1757 RegisterTypeForVT[MVT::f128] = RegisterTypeForVT[MVT::i128];
1758 TransformToType[MVT::f128] = MVT::i128;
1759 ValueTypeActions.setTypeAction(MVT::f128, TypeSoftenFloat);
1760 }
1761
1762 // Decide how to handle f80. If the target does not have native f80 support,
1763 // expand it to i96 and we will be generating soft float library calls.
1764 if (!isTypeLegal(MVT::f80)) {
1765 NumRegistersForVT[MVT::f80] = 3*NumRegistersForVT[MVT::i32];
1766 RegisterTypeForVT[MVT::f80] = RegisterTypeForVT[MVT::i32];
1767 TransformToType[MVT::f80] = MVT::i32;
1768 ValueTypeActions.setTypeAction(MVT::f80, TypeSoftenFloat);
1769 }
1770
1771 // Decide how to handle f64. If the target does not have native f64 support,
1772 // expand it to i64 and we will be generating soft float library calls.
1773 if (!isTypeLegal(MVT::f64)) {
1774 NumRegistersForVT[MVT::f64] = NumRegistersForVT[MVT::i64];
1775 RegisterTypeForVT[MVT::f64] = RegisterTypeForVT[MVT::i64];
1776 TransformToType[MVT::f64] = MVT::i64;
1777 ValueTypeActions.setTypeAction(MVT::f64, TypeSoftenFloat);
1778 }
1779
1780 // Decide how to handle f32. If the target does not have native f32 support,
1781 // expand it to i32 and we will be generating soft float library calls.
1782 if (!isTypeLegal(MVT::f32)) {
1783 NumRegistersForVT[MVT::f32] = NumRegistersForVT[MVT::i32];
1784 RegisterTypeForVT[MVT::f32] = RegisterTypeForVT[MVT::i32];
1785 TransformToType[MVT::f32] = MVT::i32;
1786 ValueTypeActions.setTypeAction(MVT::f32, TypeSoftenFloat);
1787 }
1788
1789 // Decide how to handle f16. If the target does not have native f16 support,
1790 // promote it to f32, because there are no f16 library calls (except for
1791 // conversions).
1792 if (!isTypeLegal(MVT::f16)) {
1793 // Allow targets to control how we legalize half.
1794 bool UseFPRegsForHalfType = useFPRegsForHalfType();
1795
1796 if (!UseFPRegsForHalfType) {
1797 NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::i16];
1798 RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::i16];
1799 } else {
1800 NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::f32];
1801 RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::f32];
1802 }
1803 TransformToType[MVT::f16] = MVT::f32;
1804 ValueTypeActions.setTypeAction(MVT::f16, TypeSoftPromoteHalf);
1805 }
1806
1807 // Decide how to handle bf16. If the target does not have native bf16 support,
1808 // promote it to f32, because there are no bf16 library calls (except for
1809 // converting from f32 to bf16).
1810 if (!isTypeLegal(MVT::bf16)) {
1811 NumRegistersForVT[MVT::bf16] = NumRegistersForVT[MVT::f32];
1812 RegisterTypeForVT[MVT::bf16] = RegisterTypeForVT[MVT::f32];
1813 TransformToType[MVT::bf16] = MVT::f32;
1814 ValueTypeActions.setTypeAction(MVT::bf16, TypeSoftPromoteHalf);
1815 }
1816
1817 // Loop over all of the vector value types to see which need transformations.
1818 for (unsigned i = MVT::FIRST_VECTOR_VALUETYPE;
1819 i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++i) {
1820 MVT VT = (MVT::SimpleValueType) i;
1821 if (isTypeLegal(VT))
1822 continue;
1823
1824 MVT EltVT = VT.getVectorElementType();
1826 bool IsLegalWiderType = false;
1827 bool IsScalable = VT.isScalableVector();
1828 LegalizeTypeAction PreferredAction = getPreferredVectorAction(VT);
1829 switch (PreferredAction) {
1830 case TypePromoteInteger: {
1831 MVT::SimpleValueType EndVT = IsScalable ?
1832 MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE :
1833 MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE;
1834 // Try to promote the elements of integer vectors. If no legal
1835 // promotion was found, fall through to the widen-vector method.
1836 for (unsigned nVT = i + 1;
1837 (MVT::SimpleValueType)nVT <= EndVT; ++nVT) {
1838 MVT SVT = (MVT::SimpleValueType) nVT;
1839 // Promote vectors of integers to vectors with the same number
1840 // of elements, with a wider element type.
1841 if (SVT.getScalarSizeInBits() > EltVT.getFixedSizeInBits() &&
1842 SVT.getVectorElementCount() == EC && isTypeLegal(SVT)) {
1843 TransformToType[i] = SVT;
1844 RegisterTypeForVT[i] = SVT;
1845 NumRegistersForVT[i] = 1;
1846 ValueTypeActions.setTypeAction(VT, TypePromoteInteger);
1847 IsLegalWiderType = true;
1848 break;
1849 }
1850 }
1851 if (IsLegalWiderType)
1852 break;
1853 [[fallthrough]];
1854 }
1855
1856 case TypeWidenVector:
1857 if (isPowerOf2_32(EC.getKnownMinValue())) {
1858 // Try to widen the vector.
1859 for (unsigned nVT = i + 1; nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {
1860 MVT SVT = (MVT::SimpleValueType) nVT;
1861 if (SVT.getVectorElementType() == EltVT &&
1862 SVT.isScalableVector() == IsScalable &&
1864 EC.getKnownMinValue() &&
1865 isTypeLegal(SVT)) {
1866 TransformToType[i] = SVT;
1867 RegisterTypeForVT[i] = SVT;
1868 NumRegistersForVT[i] = 1;
1869 ValueTypeActions.setTypeAction(VT, TypeWidenVector);
1870 IsLegalWiderType = true;
1871 break;
1872 }
1873 }
1874 if (IsLegalWiderType)
1875 break;
1876 } else {
1877 // Only widen to the next power of 2 to keep consistency with EVT.
1878 MVT NVT = VT.getPow2VectorType();
1879 if (isTypeLegal(NVT)) {
1880 TransformToType[i] = NVT;
1881 ValueTypeActions.setTypeAction(VT, TypeWidenVector);
1882 RegisterTypeForVT[i] = NVT;
1883 NumRegistersForVT[i] = 1;
1884 break;
1885 }
1886 }
1887 [[fallthrough]];
1888
1889 case TypeSplitVector:
1890 case TypeScalarizeVector: {
1891 MVT IntermediateVT;
1892 MVT RegisterVT;
1893 unsigned NumIntermediates;
1894 unsigned NumRegisters = getVectorTypeBreakdownMVT(VT, IntermediateVT,
1895 NumIntermediates, RegisterVT, this);
1896 NumRegistersForVT[i] = NumRegisters;
1897 assert(NumRegistersForVT[i] == NumRegisters &&
1898 "NumRegistersForVT size cannot represent NumRegisters!");
1899 RegisterTypeForVT[i] = RegisterVT;
1900
1901 MVT NVT = VT.getPow2VectorType();
1902 if (NVT == VT) {
1903 // Type is already a power of 2. The default action is to split.
1904 TransformToType[i] = MVT::Other;
1905 if (PreferredAction == TypeScalarizeVector)
1906 ValueTypeActions.setTypeAction(VT, TypeScalarizeVector);
1907 else if (PreferredAction == TypeSplitVector)
1908 ValueTypeActions.setTypeAction(VT, TypeSplitVector);
1909 else if (EC.getKnownMinValue() > 1)
1910 ValueTypeActions.setTypeAction(VT, TypeSplitVector);
1911 else
1912 ValueTypeActions.setTypeAction(VT, EC.isScalable()
1915 } else {
1916 TransformToType[i] = NVT;
1917 ValueTypeActions.setTypeAction(VT, TypeWidenVector);
1918 }
1919 break;
1920 }
1921 default:
1922 llvm_unreachable("Unknown vector legalization action!");
1923 }
1924 }
1925
1926 // Determine the 'representative' register class for each value type.
1927 // An representative register class is the largest (meaning one which is
1928 // not a sub-register class / subreg register class) legal register class for
1929 // a group of value types. For example, on i386, i8, i16, and i32
1930 // representative would be GR32; while on x86_64 it's GR64.
1931 for (unsigned i = 0; i != MVT::VALUETYPE_SIZE; ++i) {
1932 const TargetRegisterClass* RRC;
1933 uint8_t Cost;
1935 RepRegClassForVT[i] = RRC;
1936 RepRegClassCostForVT[i] = Cost;
1937 }
1938}
1939
1941 EVT VT) const {
1942 assert(!VT.isVector() && "No default SetCC type for vectors!");
1943 return getPointerTy(DL).SimpleTy;
1944}
1945
1947 return MVT::i32; // return the default value
1948}
1949
1950/// getVectorTypeBreakdown - Vector types are broken down into some number of
1951/// legal first class types. For example, MVT::v8f32 maps to 2 MVT::v4f32
1952/// with Altivec or SSE1, or 8 promoted MVT::f64 values with the X86 FP stack.
1953/// Similarly, MVT::v2i64 turns into 4 MVT::i32 values with both PPC and X86.
1954///
1955/// This method returns the number of registers needed, and the VT for each
1956/// register. It also returns the VT and quantity of the intermediate values
1957/// before they are promoted/expanded.
1959 EVT VT, EVT &IntermediateVT,
1960 unsigned &NumIntermediates,
1961 MVT &RegisterVT) const {
1962 ElementCount EltCnt = VT.getVectorElementCount();
1963
1964 // If there is a wider vector type with the same element type as this one,
1965 // or a promoted vector type that has the same number of elements which
1966 // are wider, then we should convert to that legal vector type.
1967 // This handles things like <2 x float> -> <4 x float> and
1968 // <4 x i1> -> <4 x i32>.
1969 LegalizeTypeAction TA = getTypeAction(Context, VT);
1970 if (!EltCnt.isScalar() &&
1971 (TA == TypeWidenVector || TA == TypePromoteInteger)) {
1972 EVT RegisterEVT = getTypeToTransformTo(Context, VT);
1973 if (isTypeLegal(RegisterEVT)) {
1974 IntermediateVT = RegisterEVT;
1975 RegisterVT = RegisterEVT.getSimpleVT();
1976 NumIntermediates = 1;
1977 return 1;
1978 }
1979 }
1980
1981 // Figure out the right, legal destination reg to copy into.
1982 EVT EltTy = VT.getVectorElementType();
1983
1984 unsigned NumVectorRegs = 1;
1985
1986 // Scalable vectors cannot be scalarized, so handle the legalisation of the
1987 // types like done elsewhere in SelectionDAG.
1988 if (EltCnt.isScalable()) {
1989 LegalizeKind LK;
1990 EVT PartVT = VT;
1991 do {
1992 // Iterate until we've found a legal (part) type to hold VT.
1993 LK = getTypeConversion(Context, PartVT);
1994 PartVT = LK.second;
1995 } while (LK.first != TypeLegal);
1996
1997 if (!PartVT.isVector()) {
1999 "Don't know how to legalize this scalable vector type");
2000 }
2001
2002 NumIntermediates =
2005 IntermediateVT = PartVT;
2006 RegisterVT = getRegisterType(Context, IntermediateVT);
2007 return NumIntermediates;
2008 }
2009
2010 // FIXME: We don't support non-power-of-2-sized vectors for now. Ideally
2011 // we could break down into LHS/RHS like LegalizeDAG does.
2012 if (!isPowerOf2_32(EltCnt.getKnownMinValue())) {
2013 NumVectorRegs = EltCnt.getKnownMinValue();
2014 EltCnt = ElementCount::getFixed(1);
2015 }
2016
2017 // Divide the input until we get to a supported size. This will always
2018 // end with a scalar if the target doesn't support vectors.
2019 while (EltCnt.getKnownMinValue() > 1 &&
2020 !isTypeLegal(EVT::getVectorVT(Context, EltTy, EltCnt))) {
2021 EltCnt = EltCnt.divideCoefficientBy(2);
2022 NumVectorRegs <<= 1;
2023 }
2024
2025 NumIntermediates = NumVectorRegs;
2026
2027 EVT NewVT = EVT::getVectorVT(Context, EltTy, EltCnt);
2028 if (!isTypeLegal(NewVT))
2029 NewVT = EltTy;
2030 IntermediateVT = NewVT;
2031
2032 MVT DestVT = getRegisterType(Context, NewVT);
2033 RegisterVT = DestVT;
2034
2035 if (EVT(DestVT).bitsLT(NewVT)) { // Value is expanded, e.g. i64 -> i16.
2036 TypeSize NewVTSize = NewVT.getSizeInBits();
2037 // Convert sizes such as i33 to i64.
2039 NewVTSize = NewVTSize.coefficientNextPowerOf2();
2040 return NumVectorRegs*(NewVTSize/DestVT.getSizeInBits());
2041 }
2042
2043 // Otherwise, promotion or legal types use the same number of registers as
2044 // the vector decimated to the appropriate level.
2045 return NumVectorRegs;
2046}
2047
2049 uint64_t NumCases,
2051 ProfileSummaryInfo *PSI,
2052 BlockFrequencyInfo *BFI) const {
2053 // FIXME: This function check the maximum table size and density, but the
2054 // minimum size is not checked. It would be nice if the minimum size is
2055 // also combined within this function. Currently, the minimum size check is
2056 // performed in findJumpTable() in SelectionDAGBuiler and
2057 // getEstimatedNumberOfCaseClusters() in BasicTTIImpl.
2058 const bool OptForSize =
2059 llvm::shouldOptimizeForSize(SI->getParent(), PSI, BFI);
2060 const unsigned MinDensity = getMinimumJumpTableDensity(OptForSize);
2061 const unsigned MaxJumpTableSize = getMaximumJumpTableSize();
2062
2063 // Check whether the number of cases is small enough and
2064 // the range is dense enough for a jump table.
2065 return (OptForSize || Range <= MaxJumpTableSize) &&
2066 (NumCases * 100 >= Range * MinDensity);
2067}
2068
2070 EVT ConditionVT) const {
2071 return getRegisterType(Context, ConditionVT);
2072}
2073
2074/// Get the EVTs and ArgFlags collections that represent the legalized return
2075/// type of the given function. This does not require a DAG or a return value,
2076/// and is suitable for use before any DAGs for the function are constructed.
2077/// TODO: Move this out of TargetLowering.cpp.
2079 AttributeList attr,
2081 const TargetLowering &TLI, const DataLayout &DL) {
2083 ComputeValueTypes(DL, ReturnType, Types);
2084 unsigned NumValues = Types.size();
2085 if (NumValues == 0) return;
2086
2087 for (Type *Ty : Types) {
2088 EVT VT = TLI.getValueType(DL, Ty);
2089 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;
2090
2091 if (attr.hasRetAttr(Attribute::SExt))
2092 ExtendKind = ISD::SIGN_EXTEND;
2093 else if (attr.hasRetAttr(Attribute::ZExt))
2094 ExtendKind = ISD::ZERO_EXTEND;
2095
2096 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())
2097 VT = TLI.getTypeForExtReturn(ReturnType->getContext(), VT, ExtendKind);
2098
2099 unsigned NumParts =
2100 TLI.getNumRegistersForCallingConv(ReturnType->getContext(), CC, VT);
2101 MVT PartVT =
2102 TLI.getRegisterTypeForCallingConv(ReturnType->getContext(), CC, VT);
2103
2104 // 'inreg' on function refers to return value
2106 if (attr.hasRetAttr(Attribute::InReg))
2107 Flags.setInReg();
2108
2109 // Propagate extension type if any
2110 if (attr.hasRetAttr(Attribute::SExt))
2111 Flags.setSExt();
2112 else if (attr.hasRetAttr(Attribute::ZExt))
2113 Flags.setZExt();
2114
2115 for (unsigned i = 0; i < NumParts; ++i)
2116 Outs.push_back(ISD::OutputArg(Flags, PartVT, VT, Ty, 0, 0));
2117 }
2118}
2119
2121 const DataLayout &DL) const {
2122 return DL.getABITypeAlign(Ty);
2123}
2124
2126 LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace,
2127 Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const {
2128 // Check if the specified alignment is sufficient based on the data layout.
2129 // TODO: While using the data layout works in practice, a better solution
2130 // would be to implement this check directly (make this a virtual function).
2131 // For example, the ABI alignment may change based on software platform while
2132 // this function should only be affected by hardware implementation.
2133 Type *Ty = VT.getTypeForEVT(Context);
2134 if (VT.isZeroSized() || Alignment >= DL.getABITypeAlign(Ty)) {
2135 // Assume that an access that meets the ABI-specified alignment is fast.
2136 if (Fast != nullptr)
2137 *Fast = 1;
2138 return true;
2139 }
2140
2141 // This is a misaligned access.
2142 return allowsMisalignedMemoryAccesses(VT, AddrSpace, Alignment, Flags, Fast);
2143}
2144
2146 LLVMContext &Context, const DataLayout &DL, EVT VT,
2147 const MachineMemOperand &MMO, unsigned *Fast) const {
2148 return allowsMemoryAccessForAlignment(Context, DL, VT, MMO.getAddrSpace(),
2149 MMO.getAlign(), MMO.getFlags(), Fast);
2150}
2151
2153 const DataLayout &DL, EVT VT,
2154 unsigned AddrSpace, Align Alignment,
2156 unsigned *Fast) const {
2157 return allowsMemoryAccessForAlignment(Context, DL, VT, AddrSpace, Alignment,
2158 Flags, Fast);
2159}
2160
2162 const DataLayout &DL, EVT VT,
2163 const MachineMemOperand &MMO,
2164 unsigned *Fast) const {
2165 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(), MMO.getAlign(),
2166 MMO.getFlags(), Fast);
2167}
2168
2170 const DataLayout &DL, LLT Ty,
2171 const MachineMemOperand &MMO,
2172 unsigned *Fast) const {
2173 EVT VT = getApproximateEVTForLLT(Ty, Context);
2174 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(), MMO.getAlign(),
2175 MMO.getFlags(), Fast);
2176}
2177
2178unsigned TargetLoweringBase::getMaxStoresPerMemset(bool OptSize) const {
2181
2183}
2184
2185unsigned TargetLoweringBase::getMaxStoresPerMemcpy(bool OptSize) const {
2188
2190}
2191
2195
2197}
2198
2199//===----------------------------------------------------------------------===//
2200// TargetTransformInfo Helpers
2201//===----------------------------------------------------------------------===//
2202
2204 enum InstructionOpcodes {
2205#define HANDLE_INST(NUM, OPCODE, CLASS) OPCODE = NUM,
2206#define LAST_OTHER_INST(NUM) InstructionOpcodesCount = NUM
2207#include "llvm/IR/Instruction.def"
2208 };
2209 switch (static_cast<InstructionOpcodes>(Opcode)) {
2210 case Ret: return 0;
2211 case Br: return 0;
2212 case Switch: return 0;
2213 case IndirectBr: return 0;
2214 case Invoke: return 0;
2215 case CallBr: return 0;
2216 case Resume: return 0;
2217 case Unreachable: return 0;
2218 case CleanupRet: return 0;
2219 case CatchRet: return 0;
2220 case CatchPad: return 0;
2221 case CatchSwitch: return 0;
2222 case CleanupPad: return 0;
2223 case FNeg: return ISD::FNEG;
2224 case Add: return ISD::ADD;
2225 case FAdd: return ISD::FADD;
2226 case Sub: return ISD::SUB;
2227 case FSub: return ISD::FSUB;
2228 case Mul: return ISD::MUL;
2229 case FMul: return ISD::FMUL;
2230 case UDiv: return ISD::UDIV;
2231 case SDiv: return ISD::SDIV;
2232 case FDiv: return ISD::FDIV;
2233 case URem: return ISD::UREM;
2234 case SRem: return ISD::SREM;
2235 case FRem: return ISD::FREM;
2236 case Shl: return ISD::SHL;
2237 case LShr: return ISD::SRL;
2238 case AShr: return ISD::SRA;
2239 case And: return ISD::AND;
2240 case Or: return ISD::OR;
2241 case Xor: return ISD::XOR;
2242 case Alloca: return 0;
2243 case Load: return ISD::LOAD;
2244 case Store: return ISD::STORE;
2245 case GetElementPtr: return 0;
2246 case Fence: return 0;
2247 case AtomicCmpXchg: return 0;
2248 case AtomicRMW: return 0;
2249 case Trunc: return ISD::TRUNCATE;
2250 case ZExt: return ISD::ZERO_EXTEND;
2251 case SExt: return ISD::SIGN_EXTEND;
2252 case FPToUI: return ISD::FP_TO_UINT;
2253 case FPToSI: return ISD::FP_TO_SINT;
2254 case UIToFP: return ISD::UINT_TO_FP;
2255 case SIToFP: return ISD::SINT_TO_FP;
2256 case FPTrunc: return ISD::FP_ROUND;
2257 case FPExt: return ISD::FP_EXTEND;
2258 case PtrToAddr: return ISD::BITCAST;
2259 case PtrToInt: return ISD::BITCAST;
2260 case IntToPtr: return ISD::BITCAST;
2261 case BitCast: return ISD::BITCAST;
2262 case AddrSpaceCast: return ISD::ADDRSPACECAST;
2263 case ICmp: return ISD::SETCC;
2264 case FCmp: return ISD::SETCC;
2265 case PHI: return 0;
2266 case Call: return 0;
2267 case Select: return ISD::SELECT;
2268 case UserOp1: return 0;
2269 case UserOp2: return 0;
2270 case VAArg: return 0;
2271 case ExtractElement: return ISD::EXTRACT_VECTOR_ELT;
2272 case InsertElement: return ISD::INSERT_VECTOR_ELT;
2273 case ShuffleVector: return ISD::VECTOR_SHUFFLE;
2274 case ExtractValue: return ISD::MERGE_VALUES;
2275 case InsertValue: return ISD::MERGE_VALUES;
2276 case LandingPad: return 0;
2277 case Freeze: return ISD::FREEZE;
2278 }
2279
2280 llvm_unreachable("Unknown instruction type encountered!");
2281}
2282
2284 switch (ID) {
2285 case Intrinsic::exp:
2286 return ISD::FEXP;
2287 case Intrinsic::exp2:
2288 return ISD::FEXP2;
2289 case Intrinsic::log:
2290 return ISD::FLOG;
2291 default:
2292 return ISD::DELETED_NODE;
2293 }
2294}
2295
2296Value *
2298 bool UseTLS) const {
2299 // compiler-rt provides a variable with a magic name. Targets that do not
2300 // link with compiler-rt may also provide such a variable.
2301 Module *M = IRB.GetInsertBlock()->getParent()->getParent();
2302
2303 RTLIB::LibcallImpl UnsafeStackPtrImpl =
2304 Libcalls.getLibcallImpl(RTLIB::SAFESTACK_UNSAFE_STACK_PTR);
2305 if (UnsafeStackPtrImpl == RTLIB::Unsupported)
2306 return nullptr;
2307
2308 StringRef UnsafeStackPtrVar =
2310 auto UnsafeStackPtr =
2311 dyn_cast_or_null<GlobalVariable>(M->getNamedValue(UnsafeStackPtrVar));
2312
2313 const DataLayout &DL = M->getDataLayout();
2314 PointerType *StackPtrTy = DL.getAllocaPtrType(M->getContext());
2315
2316 if (!UnsafeStackPtr) {
2317 auto TLSModel = UseTLS ?
2320 // The global variable is not defined yet, define it ourselves.
2321 // We use the initial-exec TLS model because we do not support the
2322 // variable living anywhere other than in the main executable.
2323 UnsafeStackPtr = new GlobalVariable(
2324 *M, StackPtrTy, false, GlobalValue::ExternalLinkage, nullptr,
2325 UnsafeStackPtrVar, nullptr, TLSModel);
2326 } else {
2327 // The variable exists, check its type and attributes.
2328 //
2329 // FIXME: Move to IR verifier.
2330 if (UnsafeStackPtr->getValueType() != StackPtrTy)
2331 report_fatal_error(Twine(UnsafeStackPtrVar) + " must have void* type");
2332 if (UseTLS != UnsafeStackPtr->isThreadLocal())
2333 report_fatal_error(Twine(UnsafeStackPtrVar) + " must " +
2334 (UseTLS ? "" : "not ") + "be thread-local");
2335 }
2336 return UnsafeStackPtr;
2337}
2338
2340 IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const {
2341 RTLIB::LibcallImpl SafestackPointerAddressImpl =
2342 Libcalls.getLibcallImpl(RTLIB::SAFESTACK_POINTER_ADDRESS);
2343 if (SafestackPointerAddressImpl == RTLIB::Unsupported)
2344 return getDefaultSafeStackPointerLocation(IRB, true);
2345
2346 Module *M = IRB.GetInsertBlock()->getParent()->getParent();
2347 auto *PtrTy = PointerType::getUnqual(M->getContext());
2348
2349 // Android provides a libc function to retrieve the address of the current
2350 // thread's unsafe stack pointer.
2351 FunctionCallee Fn =
2353 SafestackPointerAddressImpl),
2354 PtrTy);
2355 return IRB.CreateCall(Fn);
2356}
2357
2358//===----------------------------------------------------------------------===//
2359// Loop Strength Reduction hooks
2360//===----------------------------------------------------------------------===//
2361
2362/// isLegalAddressingMode - Return true if the addressing mode represented
2363/// by AM is legal for this target, for a load/store of the specified type.
2365 const AddrMode &AM, Type *Ty,
2366 unsigned AS, Instruction *I) const {
2367 // The default implementation of this implements a conservative RISCy, r+r and
2368 // r+i addr mode.
2369
2370 // Scalable offsets not supported
2371 if (AM.ScalableOffset)
2372 return false;
2373
2374 // Allows a sign-extended 16-bit immediate field.
2375 if (AM.BaseOffs <= -(1LL << 16) || AM.BaseOffs >= (1LL << 16)-1)
2376 return false;
2377
2378 // No global is ever allowed as a base.
2379 if (AM.BaseGV)
2380 return false;
2381
2382 // Only support r+r,
2383 switch (AM.Scale) {
2384 case 0: // "r+i" or just "i", depending on HasBaseReg.
2385 break;
2386 case 1:
2387 if (AM.HasBaseReg && AM.BaseOffs) // "r+r+i" is not allowed.
2388 return false;
2389 // Otherwise we have r+r or r+i.
2390 break;
2391 case 2:
2392 if (AM.HasBaseReg || AM.BaseOffs) // 2*r+r or 2*r+i is not allowed.
2393 return false;
2394 // Allow 2*r as r+r.
2395 break;
2396 default: // Don't allow n * r
2397 return false;
2398 }
2399
2400 return true;
2401}
2402
2403//===----------------------------------------------------------------------===//
2404// Stack Protector
2405//===----------------------------------------------------------------------===//
2406
2407// For OpenBSD return its special guard variable. Otherwise return nullptr,
2408// so that SelectionDAG handle SSP.
2409Value *
2411 const LibcallLoweringInfo &Libcalls) const {
2412 RTLIB::LibcallImpl GuardLocalImpl =
2413 Libcalls.getLibcallImpl(RTLIB::STACK_CHECK_GUARD);
2414 if (GuardLocalImpl != RTLIB::impl___guard_local)
2415 return nullptr;
2416
2417 Module &M = *IRB.GetInsertBlock()->getParent()->getParent();
2418 const DataLayout &DL = M.getDataLayout();
2419 PointerType *PtrTy =
2420 PointerType::get(M.getContext(), DL.getDefaultGlobalsAddressSpace());
2421 GlobalVariable *G =
2422 M.getOrInsertGlobal(getLibcallImplName(GuardLocalImpl), PtrTy);
2423 G->setVisibility(GlobalValue::HiddenVisibility);
2424 return G;
2425}
2426
2427// Currently only support "standard" __stack_chk_guard.
2428// TODO: add LOAD_STACK_GUARD support.
2430 Module &M, const LibcallLoweringInfo &Libcalls) const {
2431 RTLIB::LibcallImpl StackGuardImpl =
2432 Libcalls.getLibcallImpl(RTLIB::STACK_CHECK_GUARD);
2433 if (StackGuardImpl == RTLIB::Unsupported)
2434 return;
2435
2436 StringRef StackGuardVarName = getLibcallImplName(StackGuardImpl);
2437 M.getOrInsertGlobal(
2438 StackGuardVarName, PointerType::getUnqual(M.getContext()), [=, &M]() {
2439 auto *GV = new GlobalVariable(M, PointerType::getUnqual(M.getContext()),
2440 false, GlobalVariable::ExternalLinkage,
2441 nullptr, StackGuardVarName);
2442
2443 // FreeBSD has "__stack_chk_guard" defined externally on libc.so
2444 if (M.getDirectAccessExternalData() &&
2445 !TM.getTargetTriple().isOSCygMing() &&
2446 !(TM.getTargetTriple().isPPC64() &&
2447 TM.getTargetTriple().isOSFreeBSD()) &&
2448 (!TM.getTargetTriple().isOSDarwin() ||
2449 TM.getRelocationModel() == Reloc::Static))
2450 GV->setDSOLocal(true);
2451
2452 return GV;
2453 });
2454}
2455
2456// Currently only support "standard" __stack_chk_guard.
2457// TODO: add LOAD_STACK_GUARD support.
2459 const Module &M, const LibcallLoweringInfo &Libcalls) const {
2460 RTLIB::LibcallImpl GuardVarImpl =
2461 Libcalls.getLibcallImpl(RTLIB::STACK_CHECK_GUARD);
2462 if (GuardVarImpl == RTLIB::Unsupported)
2463 return nullptr;
2464 return M.getNamedValue(getLibcallImplName(GuardVarImpl));
2465}
2466
2468 const Module &M, const LibcallLoweringInfo &Libcalls) const {
2469 // MSVC CRT has a function to validate security cookie.
2470 RTLIB::LibcallImpl SecurityCheckCookieLibcall =
2471 Libcalls.getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);
2472 if (SecurityCheckCookieLibcall != RTLIB::Unsupported)
2473 return M.getFunction(getLibcallImplName(SecurityCheckCookieLibcall));
2474 return nullptr;
2475}
2476
2480
2484
2485unsigned TargetLoweringBase::getMinimumJumpTableDensity(bool OptForSize) const {
2486 return OptForSize ? OptsizeJumpTableDensity : JumpTableDensity;
2487}
2488
2492
2496
2500
2502 return MinimumBitTestCmps;
2503}
2504
2506 MinimumBitTestCmps = Val;
2507}
2508
2510 if (TM.Options.LoopAlignment)
2511 return Align(TM.Options.LoopAlignment);
2512 return PrefLoopAlignment;
2513}
2514
2516 MachineBasicBlock *MBB) const {
2517 return MaxBytesForAlignment;
2518}
2519
2520//===----------------------------------------------------------------------===//
2521// Reciprocal Estimates
2522//===----------------------------------------------------------------------===//
2523
2524/// Get the reciprocal estimate attribute string for a function that will
2525/// override the target defaults.
2527 const Function &F = MF.getFunction();
2528 return F.getFnAttribute("reciprocal-estimates").getValueAsString();
2529}
2530
2531/// Construct a string for the given reciprocal operation of the given type.
2532/// This string should match the corresponding option to the front-end's
2533/// "-mrecip" flag assuming those strings have been passed through in an
2534/// attribute string. For example, "vec-divf" for a division of a vXf32.
2535static std::string getReciprocalOpName(bool IsSqrt, EVT VT) {
2536 std::string Name = VT.isVector() ? "vec-" : "";
2537
2538 Name += IsSqrt ? "sqrt" : "div";
2539
2540 // TODO: Handle other float types?
2541 if (VT.getScalarType() == MVT::f64) {
2542 Name += "d";
2543 } else if (VT.getScalarType() == MVT::f16) {
2544 Name += "h";
2545 } else {
2546 assert(VT.getScalarType() == MVT::f32 &&
2547 "Unexpected FP type for reciprocal estimate");
2548 Name += "f";
2549 }
2550
2551 return Name;
2552}
2553
2554/// Return the character position and value (a single numeric character) of a
2555/// customized refinement operation in the input string if it exists. Return
2556/// false if there is no customized refinement step count.
2557static bool parseRefinementStep(StringRef In, size_t &Position,
2558 uint8_t &Value) {
2559 const char RefStepToken = ':';
2560 Position = In.find(RefStepToken);
2561 if (Position == StringRef::npos)
2562 return false;
2563
2564 StringRef RefStepString = In.substr(Position + 1);
2565 // Allow exactly one numeric character for the additional refinement
2566 // step parameter.
2567 if (RefStepString.size() == 1) {
2568 char RefStepChar = RefStepString[0];
2569 if (isDigit(RefStepChar)) {
2570 Value = RefStepChar - '0';
2571 return true;
2572 }
2573 }
2574 report_fatal_error("Invalid refinement step for -recip.");
2575}
2576
2577/// For the input attribute string, return one of the ReciprocalEstimate enum
2578/// status values (enabled, disabled, or not specified) for this operation on
2579/// the specified data type.
2580static int getOpEnabled(bool IsSqrt, EVT VT, StringRef Override) {
2581 if (Override.empty())
2583
2584 SmallVector<StringRef, 4> OverrideVector;
2585 Override.split(OverrideVector, ',');
2586 unsigned NumArgs = OverrideVector.size();
2587
2588 // Check if "all", "none", or "default" was specified.
2589 if (NumArgs == 1) {
2590 // Look for an optional setting of the number of refinement steps needed
2591 // for this type of reciprocal operation.
2592 size_t RefPos;
2593 uint8_t RefSteps;
2594 if (parseRefinementStep(Override, RefPos, RefSteps)) {
2595 // Split the string for further processing.
2596 Override = Override.substr(0, RefPos);
2597 }
2598
2599 // All reciprocal types are enabled.
2600 if (Override == "all")
2602
2603 // All reciprocal types are disabled.
2604 if (Override == "none")
2606
2607 // Target defaults for enablement are used.
2608 if (Override == "default")
2610 }
2611
2612 // The attribute string may omit the size suffix ('f'/'d').
2613 std::string VTName = getReciprocalOpName(IsSqrt, VT);
2614 std::string VTNameNoSize = VTName;
2615 VTNameNoSize.pop_back();
2616 static const char DisabledPrefix = '!';
2617
2618 for (StringRef RecipType : OverrideVector) {
2619 size_t RefPos;
2620 uint8_t RefSteps;
2621 if (parseRefinementStep(RecipType, RefPos, RefSteps))
2622 RecipType = RecipType.substr(0, RefPos);
2623
2624 // Ignore the disablement token for string matching.
2625 bool IsDisabled = RecipType[0] == DisabledPrefix;
2626 if (IsDisabled)
2627 RecipType = RecipType.substr(1);
2628
2629 if (RecipType == VTName || RecipType == VTNameNoSize)
2632 }
2633
2635}
2636
2637/// For the input attribute string, return the customized refinement step count
2638/// for this operation on the specified data type. If the step count does not
2639/// exist, return the ReciprocalEstimate enum value for unspecified.
2640static int getOpRefinementSteps(bool IsSqrt, EVT VT, StringRef Override) {
2641 if (Override.empty())
2643
2644 SmallVector<StringRef, 4> OverrideVector;
2645 Override.split(OverrideVector, ',');
2646 unsigned NumArgs = OverrideVector.size();
2647
2648 // Check if "all", "default", or "none" was specified.
2649 if (NumArgs == 1) {
2650 // Look for an optional setting of the number of refinement steps needed
2651 // for this type of reciprocal operation.
2652 size_t RefPos;
2653 uint8_t RefSteps;
2654 if (!parseRefinementStep(Override, RefPos, RefSteps))
2656
2657 // Split the string for further processing.
2658 Override = Override.substr(0, RefPos);
2659 assert(Override != "none" &&
2660 "Disabled reciprocals, but specifed refinement steps?");
2661
2662 // If this is a general override, return the specified number of steps.
2663 if (Override == "all" || Override == "default")
2664 return RefSteps;
2665 }
2666
2667 // The attribute string may omit the size suffix ('f'/'d').
2668 std::string VTName = getReciprocalOpName(IsSqrt, VT);
2669 std::string VTNameNoSize = VTName;
2670 VTNameNoSize.pop_back();
2671
2672 for (StringRef RecipType : OverrideVector) {
2673 size_t RefPos;
2674 uint8_t RefSteps;
2675 if (!parseRefinementStep(RecipType, RefPos, RefSteps))
2676 continue;
2677
2678 RecipType = RecipType.substr(0, RefPos);
2679 if (RecipType == VTName || RecipType == VTNameNoSize)
2680 return RefSteps;
2681 }
2682
2684}
2685
2690
2695
2700
2705
2707 EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG,
2708 const MachineMemOperand &MMO) const {
2709 // Single-element vectors are scalarized, so we should generally avoid having
2710 // any memory operations on such types, as they would get scalarized too.
2711 if (LoadVT.isFixedLengthVector() && BitcastVT.isFixedLengthVector() &&
2712 BitcastVT.getVectorNumElements() == 1)
2713 return false;
2714
2715 // Don't do if we could do an indexed load on the original type, but not on
2716 // the new one.
2717 if (!LoadVT.isSimple() || !BitcastVT.isSimple())
2718 return true;
2719
2720 MVT LoadMVT = LoadVT.getSimpleVT();
2721
2722 // Don't bother doing this if it's just going to be promoted again later, as
2723 // doing so might interfere with other combines.
2724 if (getOperationAction(ISD::LOAD, LoadMVT) == Promote &&
2725 getTypeToPromoteTo(ISD::LOAD, LoadMVT) == BitcastVT.getSimpleVT())
2726 return false;
2727
2728 unsigned Fast = 0;
2729 return allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), BitcastVT,
2730 MMO, &Fast) &&
2731 Fast;
2732}
2733
2737
2739 const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC,
2740 const TargetLibraryInfo *LibInfo) const {
2742 if (LI.isVolatile())
2744
2745 if (LI.hasMetadata(LLVMContext::MD_nontemporal))
2747
2748 if (LI.hasMetadata(LLVMContext::MD_invariant_load))
2750
2752 LI.getAlign(), DL, &LI, AC,
2753 /*DT=*/nullptr, LibInfo))
2755
2756 Flags |= getTargetMMOFlags(LI);
2757 return Flags;
2758}
2759
2762 const DataLayout &DL) const {
2764
2765 if (SI.isVolatile())
2767
2768 if (SI.hasMetadata(LLVMContext::MD_nontemporal))
2770
2771 // FIXME: Not preserving dereferenceable
2772 Flags |= getTargetMMOFlags(SI);
2773 return Flags;
2774}
2775
2778 const DataLayout &DL) const {
2780
2781 if (const AtomicRMWInst *RMW = dyn_cast<AtomicRMWInst>(&AI)) {
2782 if (RMW->isVolatile())
2784 } else if (const AtomicCmpXchgInst *CmpX = dyn_cast<AtomicCmpXchgInst>(&AI)) {
2785 if (CmpX->isVolatile())
2787 } else
2788 llvm_unreachable("not an atomic instruction");
2789
2790 // FIXME: Not preserving dereferenceable
2791 Flags |= getTargetMMOFlags(AI);
2792 return Flags;
2793}
2794
2796 const VPIntrinsic &VPIntrin) const {
2798 Intrinsic::ID IntrinID = VPIntrin.getIntrinsicID();
2799
2800 switch (IntrinID) {
2801 default:
2802 llvm_unreachable("unexpected intrinsic. Existing code may be appropriate "
2803 "for it, but support must be explicitly enabled");
2804 case Intrinsic::vp_load:
2805 case Intrinsic::vp_gather:
2806 case Intrinsic::experimental_vp_strided_load:
2808 break;
2809 case Intrinsic::vp_store:
2810 case Intrinsic::vp_scatter:
2811 case Intrinsic::experimental_vp_strided_store:
2813 break;
2814 }
2815
2816 if (VPIntrin.hasMetadata(LLVMContext::MD_nontemporal))
2818
2819 Flags |= getTargetMMOFlags(VPIntrin);
2820 return Flags;
2821}
2822
2824 Instruction *Inst,
2825 AtomicOrdering Ord) const {
2826 if (isReleaseOrStronger(Ord) && Inst->hasAtomicStore())
2827 return Builder.CreateFence(Ord);
2828 else
2829 return nullptr;
2830}
2831
2833 Instruction *Inst,
2834 AtomicOrdering Ord) const {
2835 if (isAcquireOrStronger(Ord))
2836 return Builder.CreateFence(Ord);
2837 else
2838 return nullptr;
2839}
2840
2841//===----------------------------------------------------------------------===//
2842// GlobalISel Hooks
2843//===----------------------------------------------------------------------===//
2844
2846 const TargetTransformInfo *TTI) const {
2847 auto &MF = *MI.getMF();
2848 auto &MRI = MF.getRegInfo();
2849 // Assuming a spill and reload of a value has a cost of 1 instruction each,
2850 // this helper function computes the maximum number of uses we should consider
2851 // for remat. E.g. on arm64 global addresses take 2 insts to materialize. We
2852 // break even in terms of code size when the original MI has 2 users vs
2853 // choosing to potentially spill. Any more than 2 users we we have a net code
2854 // size increase. This doesn't take into account register pressure though.
2855 auto maxUses = [](unsigned RematCost) {
2856 // A cost of 1 means remats are basically free.
2857 if (RematCost == 1)
2858 return std::numeric_limits<unsigned>::max();
2859 if (RematCost == 2)
2860 return 2U;
2861
2862 // Remat is too expensive, only sink if there's one user.
2863 if (RematCost > 2)
2864 return 1U;
2865 llvm_unreachable("Unexpected remat cost");
2866 };
2867
2868 switch (MI.getOpcode()) {
2869 default:
2870 return false;
2871 // Constants-like instructions should be close to their users.
2872 // We don't want long live-ranges for them.
2873 case TargetOpcode::G_CONSTANT:
2874 case TargetOpcode::G_FCONSTANT:
2875 case TargetOpcode::G_FRAME_INDEX:
2876 case TargetOpcode::G_INTTOPTR:
2877 return true;
2878 case TargetOpcode::G_GLOBAL_VALUE: {
2879 unsigned RematCost = TTI->getGISelRematGlobalCost();
2880 Register Reg = MI.getOperand(0).getReg();
2881 unsigned MaxUses = maxUses(RematCost);
2882 if (MaxUses == UINT_MAX)
2883 return true; // Remats are "free" so always localize.
2884 return MRI.hasAtMostUserInstrs(Reg, MaxUses);
2885 }
2886 }
2887}
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
Rewrite undef for PHI
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
This file implements the BitVector class.
#define LLVM_ABI
Definition Compiler.h:213
This file defines the DenseMap class.
IRTranslator LLVM IR MI
Module.h This file contains the declarations for the Module class.
static LVOptions Options
Definition LVOptions.cpp:25
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
Register const TargetRegisterInfo * TRI
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains some templates that are useful if you are working with the STL at all.
This file defines the SmallVector class.
This file contains some functions that are useful when dealing with strings.
static cl::opt< unsigned > MinimumBitTestCmpsOverride("min-bit-test-cmps", cl::init(2), cl::Hidden, cl::desc("Set minimum of largest number of comparisons " "to use bit test for switch."))
static cl::opt< bool > JumpIsExpensiveOverride("jump-is-expensive", cl::init(false), cl::desc("Do not create extra branches to split comparison logic."), cl::Hidden)
#define OP_TO_LIBCALL(Name, Enum)
static cl::opt< unsigned > MinimumJumpTableEntries("min-jump-table-entries", cl::init(4), cl::Hidden, cl::desc("Set minimum number of entries to use a jump table."))
static cl::opt< bool > DisableStrictNodeMutation("disable-strictnode-mutation", cl::desc("Don't mutate strict-float node to a legalize node"), cl::init(false), cl::Hidden)
static bool parseRefinementStep(StringRef In, size_t &Position, uint8_t &Value)
Return the character position and value (a single numeric character) of a customized refinement opera...
static cl::opt< unsigned > MaximumJumpTableSize("max-jump-table-size", cl::init(UINT_MAX), cl::Hidden, cl::desc("Set maximum size of jump tables."))
static cl::opt< unsigned > JumpTableDensity("jump-table-density", cl::init(10), cl::Hidden, cl::desc("Minimum density for building a jump table in " "a normal function"))
Minimum jump table density for normal functions.
static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT, TargetLoweringBase *TLI)
static cl::opt< unsigned > MaxStoresPerMemmoveOverride("max-store-memmove", cl::init(0), cl::Hidden, cl::desc("Override target's MaxStoresPerMemmove and " "MaxStoresPerMemmoveOptSize. " "Set to 0 to use the target default."))
static std::string getReciprocalOpName(bool IsSqrt, EVT VT)
Construct a string for the given reciprocal operation of the given type.
#define LCALL5(A)
static cl::opt< unsigned > MaxStoresPerMemsetOverride("max-store-memset", cl::init(0), cl::Hidden, cl::desc("Override target's MaxStoresPerMemset and " "MaxStoresPerMemsetOptSize. " "Set to 0 to use the target default."))
static int getOpRefinementSteps(bool IsSqrt, EVT VT, StringRef Override)
For the input attribute string, return the customized refinement step count for this operation on the...
static int getOpEnabled(bool IsSqrt, EVT VT, StringRef Override)
For the input attribute string, return one of the ReciprocalEstimate enum status values (enabled,...
static StringRef getRecipEstimateForFunc(MachineFunction &MF)
Get the reciprocal estimate attribute string for a function that will override the target defaults.
static cl::opt< unsigned > MaxStoresPerMemcpyOverride("max-store-memcpy", cl::init(0), cl::Hidden, cl::desc("Override target's MaxStoresPerMemcpy and " "MaxStoresPerMemcpyOptSize. " "Set to 0 to use the target default."))
static cl::opt< unsigned > OptsizeJumpTableDensity("optsize-jump-table-density", cl::init(40), cl::Hidden, cl::desc("Minimum density for building a jump table in " "an optsize function"))
Minimum jump table density for -Os or -Oz functions.
This file describes how to lower LLVM code to machine code.
This pass exposes codegen information to IR-level passes.
Class for arbitrary precision integers.
Definition APInt.h:78
A cache of @llvm.assume calls within a function.
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
void setBitsInMask(const uint32_t *Mask, unsigned MaskWords=~0u)
setBitsInMask - Add '1' bits from Mask to this vector.
Definition BitVector.h:726
iterator_range< const_set_bits_iterator > set_bits() const
Definition BitVector.h:159
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
This class represents a range of values.
LLVM_ABI unsigned getActiveBits() const
Compute the maximal number of active bits needed to represent every value in this range.
LLVM_ABI ConstantRange umul_sat(const ConstantRange &Other) const
Perform an unsigned saturating multiplication of two constant ranges.
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
static constexpr ElementCount getScalable(ScalarTy MinVal)
Definition TypeSize.h:312
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition TypeSize.h:309
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
const Function & getFunction() const
Definition Function.h:166
Module * getParent()
Get the module that this global value is contained inside of...
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
BasicBlock * GetInsertBlock() const
Definition IRBuilder.h:201
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
Definition IRBuilder.h:2487
LLVM_ABI bool hasAtomicStore() const LLVM_READONLY
Return true if this atomic instruction stores to memory.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget.
An instruction for reading from memory.
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
Align getAlign() const
Return the alignment of the access that is being performed.
Machine Value Type.
SimpleValueType SimpleTy
uint64_t getScalarSizeInBits() const
bool isVector() const
Return true if this is a vector value type.
bool isScalableVector() const
Return true if this is a vector value type where the runtime length is machine dependent.
static auto all_valuetypes()
SimpleValueType Iteration.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
ElementCount getVectorElementCount() const
bool isScalarInteger() const
Return true if this is an integer, not including vectors.
static MVT getVectorVT(MVT VT, unsigned NumElements)
MVT getVectorElementType() const
bool isValid() const
Return true if this is a valid simple valuetype.
static MVT getIntegerVT(unsigned BitWidth)
static auto fp_valuetypes()
MVT getPow2VectorType() const
Widens the length of the given vector MVT up to the nearest power of 2 and returns that type.
MachineInstrBundleIterator< MachineInstr > iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool isStatepointSpillSlotObjectIndex(int ObjectIdx) const
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
int64_t getObjectOffset(int ObjectIdx) const
Return the assigned stack offset of the specified object from the incoming stack pointer.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & cloneMemRefs(const MachineInstr &OtherMI) const
Representation of each machine instruction.
unsigned getNumOperands() const
Retuns the total number of operands.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
LLVM_ABI void tieOperands(unsigned DefIdx, unsigned UseIdx)
Add a tie between the register operands at DefIdx and UseIdx.
LLVM_ABI void addMemOperand(MachineFunction &MF, MachineMemOperand *MO)
Add a MachineMemOperand to the machine instruction.
A description of a memory reference used in the backend.
unsigned getAddrSpace() const
Flags
Flags values. These may be or'd together.
@ MOVolatile
The memory access is volatile.
@ MODereferenceable
The memory access is dereferenceable (i.e., doesn't trap).
@ MOLoad
The memory access reads data.
@ MONonTemporal
The memory access is non-temporal.
@ MOInvariant
The memory access always returns the same value (or traps).
@ MOStore
The memory access writes data.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Align getAlign() const
Return the minimum known alignment in bytes of the actual memory reference.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
LLVM_ABI void freezeReservedRegs()
freezeReservedRegs - Called by the register allocator to freeze the set of reserved registers before ...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
Analysis providing profile information.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
const DataLayout & getDataLayout() const
LLVMContext * getContext() const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
Definition StringRef.h:730
static constexpr size_t npos
Definition StringRef.h:57
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
Definition StringRef.h:591
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:140
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:143
bool isValid() const
Returns true if this iterator is still pointing at a valid entry.
Multiway switch.
Provides information about what library functions are available for the current target.
This base class for TargetLowering contains the SelectionDAG-independent parts that can be used from ...
virtual Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const
Returns the desired alignment for ByVal or InAlloca aggregate function arguments in the caller parame...
int InstructionOpcodeToISD(unsigned Opcode) const
Get the ISD node that corresponds to the Instruction class opcode.
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action)
Indicate that the specified operation does not work with the specified type and indicate what to do a...
virtual void finalizeLowering(MachineFunction &MF) const
Execute target specific actions to finalize target lowering.
void initActions()
Initialize all of the actions to default values.
bool PredictableSelectIsExpensive
Tells the code generator that select is more expensive than a branch if the branch is usually predict...
Function * getSSPStackGuardCheck(const Module &M, const LibcallLoweringInfo &Libcalls) const
If the target has a standard stack protection check function that performs validation and error handl...
EVT getValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const
Return the EVT corresponding to this LLVM type.
void setMinimumBitTestCmps(unsigned Val)
Set the minimum of largest of number of comparisons to generate BitTest.
unsigned MaxStoresPerMemcpyOptSize
Likewise for functions with the OptSize attribute.
MachineBasicBlock * emitPatchPoint(MachineInstr &MI, MachineBasicBlock *MBB) const
Replace/modify any TargetFrameIndex operands with a targte-dependent sequence of memory operands that...
int getRecipEstimateSqrtEnabled(EVT VT, MachineFunction &MF) const
Return a ReciprocalEstimate enum value for a square root of the given type based on the function's at...
virtual bool canOpTrap(unsigned Op, EVT VT) const
Returns true if the operation can trap for the value type.
virtual Value * getIRStackGuard(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
If the target has a standard location for the stack protector guard, returns the address of that loca...
virtual bool shouldLocalize(const MachineInstr &MI, const TargetTransformInfo *TTI) const
Check whether or not MI needs to be moved close to its uses.
virtual unsigned getMaxPermittedBytesForAlignment(MachineBasicBlock *MBB) const
Return the maximum amount of bytes allowed to be emitted when padding for alignment.
void setMaximumJumpTableSize(unsigned)
Indicate the maximum number of entries in jump tables.
virtual unsigned getMinimumJumpTableEntries() const
Return lower limit for number of blocks in a jump table.
const TargetMachine & getTargetMachine() const
unsigned MaxLoadsPerMemcmp
Specify maximum number of load instructions per memcmp call.
virtual unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain targets require unusual breakdowns of certain types.
virtual MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const
This callback is used to inspect load/store instructions and add target-specific MachineMemOperand fl...
unsigned MaxGluedStoresPerMemcpy
Specify max number of store instructions to glue in inlined memcpy.
virtual MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
virtual void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const
Inserts necessary declarations for SSP (stack protection) purpose.
virtual bool isSuitableForJumpTable(const SwitchInst *SI, uint64_t NumCases, uint64_t Range, ProfileSummaryInfo *PSI, BlockFrequencyInfo *BFI) const
Return true if lowering to a jump table is suitable for a set of case clusters which may contain NumC...
void setIndexedMaskedLoadAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed masked load does or does not work with the specified type and ind...
unsigned getMaxStoresPerMemcpy(bool OptSize) const
Get maximum # of store operations permitted for llvm.memcpy.
unsigned getMinimumBitTestCmps() const
Retuen the minimum of largest number of comparisons in BitTest.
virtual bool useFPRegsForHalfType() const
virtual bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG, const MachineMemOperand &MMO) const
Return true if the following transform is beneficial: fold (conv (load x)) -> (load (conv*)x) On arch...
void setIndexedLoadAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed load does or does not work with the specified type and indicate w...
unsigned getMaximumJumpTableSize() const
Return upper limit for number of entries in a jump table.
virtual MVT::SimpleValueType getCmpLibcallReturnType() const
Return the ValueType for comparison libcalls.
unsigned getBitWidthForCttzElements(Type *RetTy, ElementCount EC, bool ZeroIsPoison, const ConstantRange *VScaleRange) const
Return the minimum number of bits required to hold the maximum possible number of trailing zero vecto...
bool isLegalRC(const TargetRegisterInfo &TRI, const TargetRegisterClass &RC) const
Return true if the value types that can be represented by the specified register class are all legal.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
void setAtomicLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Let target indicate that an extending atomic load of the specified type is legal.
Value * getDefaultSafeStackPointerLocation(IRBuilderBase &IRB, bool UseTLS) const
unsigned getMaxStoresPerMemset(bool OptSize) const
Get maximum # of store operations permitted for llvm.memset.
MachineMemOperand::Flags getAtomicMemOperandFlags(const Instruction &AI, const DataLayout &DL) const
virtual bool allowsMisalignedMemoryAccesses(EVT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *=nullptr) const
Determine if the target supports unaligned memory accesses.
unsigned MaxStoresPerMemsetOptSize
Likewise for functions with the OptSize attribute.
EVT getShiftAmountTy(EVT LHSTy, const DataLayout &DL) const
Returns the type for the shift amount of a shift opcode.
unsigned MaxStoresPerMemmove
Specify maximum number of store instructions per memmove call.
virtual Align getPrefLoopAlignment(MachineLoop *ML=nullptr) const
Return the preferred loop alignment.
void computeRegisterProperties(const TargetRegisterInfo *TRI)
Once all of the register classes are added, this allows us to compute derived properties we expose.
MachineMemOperand::Flags getVPIntrinsicMemOperandFlags(const VPIntrinsic &VPIntrin) const
int getDivRefinementSteps(EVT VT, MachineFunction &MF) const
Return the refinement step count for a division of the given type based on the function's attributes.
virtual EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const
Return the ValueType of the result of SETCC operations.
MachineMemOperand::Flags getLoadMemOperandFlags(const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC=nullptr, const TargetLibraryInfo *LibInfo=nullptr) const
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
unsigned MaxStoresPerMemmoveOptSize
Likewise for functions with the OptSize attribute.
virtual MVT getPreferredSwitchConditionType(LLVMContext &Context, EVT ConditionVT) const
Returns preferred type for switch condition.
bool isTypeLegal(EVT VT) const
Return true if the target has native support for the specified value type.
int getRecipEstimateDivEnabled(EVT VT, MachineFunction &MF) const
Return a ReciprocalEstimate enum value for a division of the given type based on the function's attri...
void setIndexedStoreAction(ArrayRef< unsigned > IdxModes, MVT VT, LegalizeAction Action)
Indicate that the specified indexed store does or does not work with the specified type and indicate ...
virtual bool isJumpTableRelative() const
virtual MVT getScalarShiftAmountTy(const DataLayout &, EVT) const
Return the type to use for a scalar shift opcode, given the shifted amount type.
virtual MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
virtual bool isFreeAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast from SrcAS to DestAS is "cheap", such that e.g.
ISD::CondCode getSoftFloatCmpLibcallPredicate(RTLIB::LibcallImpl Call) const
Get the comparison predicate that's to be used to test the result of the comparison libcall against z...
void setIndexedMaskedStoreAction(unsigned IdxMode, MVT VT, LegalizeAction Action)
Indicate that the specified indexed masked store does or does not work with the specified type and in...
TargetLoweringBase(const TargetMachine &TM, const TargetSubtargetInfo &STI)
NOTE: The TargetMachine owns TLOF.
unsigned MaxStoresPerMemset
Specify maximum number of store instructions per memset call.
void setMinimumJumpTableEntries(unsigned Val)
Indicate the minimum number of blocks to generate jump tables.
void setTruncStoreAction(MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified truncating store does not work with the specified type and indicate what ...
virtual bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const
Return true if the target supports a memory access of this type for the given address space and align...
unsigned MaxLoadsPerMemcmpOptSize
Likewise for functions with the OptSize attribute.
MachineMemOperand::Flags getStoreMemOperandFlags(const StoreInst &SI, const DataLayout &DL) const
void AddPromotedToType(unsigned Opc, MVT OrigVT, MVT DestVT)
If Opc/OrigVT is specified as being promoted, the promotion code defaults to trying a larger integer/...
unsigned getMinimumJumpTableDensity(bool OptForSize) const
Return lower limit of the density in a jump table.
virtual Value * getSDagStackGuard(const Module &M, const LibcallLoweringInfo &Libcalls) const
Return the variable that's previously inserted by insertSSPDeclarations, if any, otherwise return nul...
virtual std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const
Return the largest legal super-reg register class of the register class for the specified type and it...
static StringRef getLibcallImplName(RTLIB::LibcallImpl Call)
Get the libcall routine name for the specified libcall implementation.
virtual Value * getSafeStackPointerLocation(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const
Returns the target-specific address of the unsafe stack pointer.
LegalizeKind getTypeConversion(LLVMContext &Context, EVT VT) const
Return pair that represents the legalization kind (first) that needs to happen to EVT (second) in ord...
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT, LegalizeAction Action)
Indicate that the specified load with extension does not work with the specified type and indicate wh...
unsigned GatherAllAliasesMaxDepth
Depth that GatherAllAliases should continue looking for chain dependencies when trying to find a more...
int IntrinsicIDToISD(Intrinsic::ID ID) const
Get the ISD node that corresponds to the Intrinsic ID.
LegalizeTypeAction getTypeAction(LLVMContext &Context, EVT VT) const
Return how we should legalize values of this type, either it is already legal (return 'Legal') or we ...
int getSqrtRefinementSteps(EVT VT, MachineFunction &MF) const
Return the refinement step count for a square root of the given type based on the function's attribut...
bool allowsMemoryAccessForAlignment(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const
This function returns true if the memory access is aligned or if the target allows this specific unal...
virtual Instruction * emitTrailingFence(IRBuilderBase &Builder, Instruction *Inst, AtomicOrdering Ord) const
virtual Instruction * emitLeadingFence(IRBuilderBase &Builder, Instruction *Inst, AtomicOrdering Ord) const
Inserts in the IR a target-specific intrinsic specifying a fence.
unsigned MaxStoresPerMemcpy
Specify maximum number of store instructions per memcpy call.
unsigned getMaxStoresPerMemmove(bool OptSize) const
Get maximum # of store operations permitted for llvm.memmove.
MVT getRegisterType(MVT VT) const
Return the type of registers that this ValueType will eventually require.
void setJumpIsExpensive(bool isExpensive=true)
Tells the code generator not to expand logic operations on comparison predicates into separate sequen...
LegalizeAction getOperationAction(unsigned Op, EVT VT) const
Return how this operation should be treated: either it is legal, needs to be promoted to a larger siz...
MVT getTypeToPromoteTo(unsigned Op, MVT VT) const
If the action for this operation is to promote, this method returns the ValueType to promote to.
virtual bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AddrSpace, Instruction *I=nullptr) const
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
unsigned getVectorTypeBreakdown(LLVMContext &Context, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const
Vector types are broken down into some number of legal first class types.
std::pair< LegalizeTypeAction, EVT > LegalizeKind
LegalizeKind holds the legalization kind that needs to happen to EVT in order to type-legalize it.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual EVT getTypeForExtReturn(LLVMContext &Context, EVT VT, ISD::NodeType) const
Return the type that should be used to zero or sign extend a zeroext/signext integer return value.
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
This is the common base class for vector predication intrinsics.
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
constexpr LeafTy coefficientNextPowerOf2() const
Definition TypeSize.h:260
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
Definition TypeSize.h:252
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition ISDOpcodes.h:819
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
Definition ISDOpcodes.h:261
@ CTLZ_ZERO_UNDEF
Definition ISDOpcodes.h:788
@ DELETED_NODE
DELETED_NODE - This is an illegal value that is used to catch errors.
Definition ISDOpcodes.h:45
@ SET_FPENV
Sets the current floating-point environment.
@ LOOP_DEPENDENCE_RAW_MASK
@ VECREDUCE_SEQ_FADD
Generic reduction nodes.
@ FGETSIGN
INT = FGETSIGN(FP) - Return the sign bit of the specified floating point value as an integer 0/1 valu...
Definition ISDOpcodes.h:538
@ STACKADDRESS
STACKADDRESS - Represents the llvm.stackaddress intrinsic.
Definition ISDOpcodes.h:127
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
Definition ISDOpcodes.h:394
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:294
@ RESET_FPENV
Set floating-point environment to default state.
@ FMAD
FMAD - Perform a * b + c, while getting the same result as the separately rounded operations.
Definition ISDOpcodes.h:522
@ ADD
Simple integer binary arithmetic operators.
Definition ISDOpcodes.h:264
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:400
@ SET_FPMODE
Sets the current dynamic floating-point control modes.
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ FMA
FMA - Perform a * b + c with no intermediate rounding step.
Definition ISDOpcodes.h:518
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ FMODF
FMODF - Decomposes the operand into integral and fractional parts, each having the same type and sign...
@ FATAN2
FATAN2 - atan2, inspired by libm.
@ FSINCOSPI
FSINCOSPI - Compute both the sine and cosine times pi more accurately than FSINCOS(pi*x),...
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
Definition ISDOpcodes.h:880
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
Definition ISDOpcodes.h:584
@ VECREDUCE_FMAX
FMIN/FMAX nodes can have flags, for NaN/NoNaN variants.
@ FADD
Simple binary floating point operators.
Definition ISDOpcodes.h:417
@ VECREDUCE_FMAXIMUM
FMINIMUM/FMAXIMUM nodes propatate NaNs and signed zeroes using the llvm.minimum and llvm....
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
Definition ISDOpcodes.h:747
@ RESET_FPMODE
Sets default dynamic floating-point control modes.
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
Definition ISDOpcodes.h:910
@ FMULADD
FMULADD - Performs a * b + c, with, or without, intermediate rounding.
Definition ISDOpcodes.h:528
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
Definition ISDOpcodes.h:993
@ CLMUL
Carry-less multiplication operations.
Definition ISDOpcodes.h:774
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
Definition ISDOpcodes.h:407
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
@ SIGN_EXTEND
Conversion operators.
Definition ISDOpcodes.h:844
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
Definition ISDOpcodes.h:715
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ VECREDUCE_FADD
These reductions have relaxed evaluation order semantics, and have a single vector operand.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
Definition ISDOpcodes.h:787
@ PREFETCH
PREFETCH - This corresponds to a prefetch intrinsic.
@ TRUNCATE_SSAT_U
Definition ISDOpcodes.h:873
@ FSINCOS
FSINCOS - Compute both fsin and fcos as a single operation.
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
Definition ISDOpcodes.h:827
@ FNEG
Perform various unary floating-point operations inspired by libm.
@ SSUBO
Same for subtraction.
Definition ISDOpcodes.h:352
@ FCANONICALIZE
Returns platform specific canonical encoding of a floating point number.
Definition ISDOpcodes.h:541
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
Definition ISDOpcodes.h:548
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
Definition ISDOpcodes.h:374
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
Definition ISDOpcodes.h:796
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
Definition ISDOpcodes.h:672
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
Definition ISDOpcodes.h:348
@ CTLS
Count leading redundant sign bits.
Definition ISDOpcodes.h:792
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_FPMODE
Reads the current dynamic floating-point control modes.
@ GET_FPENV
Gets the current floating-point environment.
@ SHL
Shift and rotation operations.
Definition ISDOpcodes.h:765
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
Definition ISDOpcodes.h:649
@ FMINNUM_IEEE
FMINNUM_IEEE/FMAXNUM_IEEE - Perform floating-point minimumNumber or maximumNumber on two values,...
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
Definition ISDOpcodes.h:576
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
@ DEBUGTRAP
DEBUGTRAP - Trap intended to get the attention of a debugger.
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ FMINNUM
FMINNUM/FMAXNUM - Perform floating-point minimum maximum on two values, following IEEE-754 definition...
@ UBSANTRAP
UBSANTRAP - Trap with an immediate describing the kind of sanitizer failure.
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
Definition ISDOpcodes.h:386
@ SMULO
Same for multiplication.
Definition ISDOpcodes.h:356
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
Definition ISDOpcodes.h:653
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
Definition ISDOpcodes.h:899
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:888
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
Definition ISDOpcodes.h:727
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
Definition ISDOpcodes.h:413
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
Definition ISDOpcodes.h:978
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:328
@ FMINIMUM
FMINIMUM/FMAXIMUM - NaN-propagating minimum/maximum that also treat -0.0 as less than 0....
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
Definition ISDOpcodes.h:926
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:739
@ TRAP
TRAP - Trapping instruction.
@ GET_FPENV_MEM
Gets the current floating-point environment.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
Definition ISDOpcodes.h:735
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
Definition ISDOpcodes.h:710
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
Definition ISDOpcodes.h:657
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:304
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
Definition ISDOpcodes.h:241
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
Definition ISDOpcodes.h:565
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ FP_ROUND
X = FP_ROUND(Y, TRUNC) - Rounding 'Y' from a larger floating point type down to the precision of the ...
Definition ISDOpcodes.h:959
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
Definition ISDOpcodes.h:699
@ CLEAR_CACHE
llvm.clear_cache intrinsic Operands: Input Chain, Start Addres, End Address Outputs: Output Chain
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
Definition ISDOpcodes.h:921
@ ADDRSPACECAST
ADDRSPACECAST - This operator converts between pointers of different address spaces.
Definition ISDOpcodes.h:997
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
Definition ISDOpcodes.h:945
@ VECREDUCE_FMINIMUM
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
Definition ISDOpcodes.h:856
@ VECREDUCE_SEQ_FMUL
@ FCOPYSIGN
FCOPYSIGN(X, Y) - Return the value of X with the sign of Y.
Definition ISDOpcodes.h:534
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
Definition ISDOpcodes.h:365
@ GET_DYNAMIC_AREA_OFFSET
GET_DYNAMIC_AREA_OFFSET - get offset from native SP to the address of the most recent dynamic alloca.
@ SET_FPENV_MEM
Sets the current floating point environment.
@ FMINIMUMNUM
FMINIMUMNUM/FMAXIMUMNUM - minimumnum/maximumnum that is same with FMINNUM_IEEE and FMAXNUM_IEEE besid...
@ TRUNCATE_SSAT_S
TRUNCATE_[SU]SAT_[SU] - Truncate for saturated operand [SU] located in middle, prefix for SAT means i...
Definition ISDOpcodes.h:871
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
Definition ISDOpcodes.h:722
@ TRUNCATE_USAT_U
Definition ISDOpcodes.h:875
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
Definition ISDOpcodes.h:338
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
static const int LAST_INDEXED_MODE
LLVM_ABI Libcall getPOWI(EVT RetVT)
getPOWI - Return the POWI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSINTTOFP(EVT OpVT, EVT RetVT)
getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUREM(EVT VT)
LLVM_ABI Libcall getSHL(EVT VT)
LLVM_ABI Libcall getSYNC(unsigned Opc, MVT VT)
Return the SYNC_FETCH_AND_* value for the given opcode and type, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLDEXP(EVT RetVT)
getLDEXP - Return the LDEXP_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUINTTOFP(EVT OpVT, EVT RetVT)
getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getFREXP(EVT RetVT)
getFREXP - Return the FREXP_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getREM(EVT VT)
LLVM_ABI Libcall getSINCOSPI(EVT RetVT)
getSINCOSPI - Return the SINCOSPI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSDIV(EVT VT)
LLVM_ABI Libcall getSRL(EVT VT)
LLVM_ABI Libcall getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMCPY_ELEMENT_UNORDERED_ATOMIC - Return MEMCPY_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getSRA(EVT VT)
LLVM_ABI Libcall getUDIV(EVT VT)
LLVM_ABI Libcall getFPLibCall(EVT VT, Libcall Call_F32, Libcall Call_F64, Libcall Call_F80, Libcall Call_F128, Libcall Call_PPCF128)
GetFPLibCall - Helper to return the right libcall for the given floating point type,...
LLVM_ABI Libcall getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLLROUND(EVT VT)
LLVM_ABI Libcall getCOS(EVT RetVT)
Return the COS_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLROUND(EVT VT)
LLVM_ABI Libcall getMODF(EVT VT)
getMODF - Return the MODF_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getFPTOSINT(EVT OpVT, EVT RetVT)
getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLRINT(EVT RetVT)
LLVM_ABI Libcall getCBRT(EVT RetVT)
getCBRT - Return the CBRT_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order, MVT VT)
Return the outline atomics value for the given opcode, atomic ordering and type, or UNKNOWN_LIBCALL i...
LLVM_ABI Libcall getLLRINT(EVT RetVT)
LLVM_ABI Libcall getFPEXT(EVT OpVT, EVT RetVT)
getFPEXT - Return the FPEXT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getFPROUND(EVT OpVT, EVT RetVT)
getFPROUND - Return the FPROUND_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSREM(EVT VT)
LLVM_ABI Libcall getSIN(EVT RetVT)
Return the SIN_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMSET_ELEMENT_UNORDERED_ATOMIC - Return MEMSET_ELEMENT_UNORDERED_ATOMIC_* value for the given ele...
LLVM_ABI Libcall getSINCOS_STRET(EVT RetVT)
Return the SINCOS_STRET_ value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getPOW(EVT RetVT)
getPOW - Return the POW_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getOutlineAtomicHelper(const Libcall(&LC)[5][4], AtomicOrdering Order, uint64_t MemSize)
Return the outline atomics value for the given atomic ordering, access size and set of libcalls for a...
LLVM_ABI Libcall getMUL(EVT VT)
LLVM_ABI Libcall getCTPOP(EVT VT)
LLVM_ABI Libcall getSINCOS(EVT RetVT)
getSINCOS - Return the SINCOS_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getMULO(EVT VT)
LLVM_ABI Libcall getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize)
getMEMMOVE_ELEMENT_UNORDERED_ATOMIC - Return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_* value for the given e...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1759
LLVM_ABI void GetReturnInfo(CallingConv::ID CC, Type *ReturnType, AttributeList attr, SmallVectorImpl< ISD::OutputArg > &Outs, const TargetLowering &TLI, const DataLayout &DL)
Given an LLVM IR type and return type attributes, compute the return value EVTs and flags,...
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
InstructionCost Cost
auto enum_seq(EnumT Begin, EnumT End)
Iterate over an enum type from Begin up to - but not including - End.
Definition Sequence.h:337
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const DataLayout &DL, const Instruction *CtxI=nullptr, AssumptionCache *AC=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:229
LLVM_ABI bool shouldOptimizeForSize(const MachineFunction *MF, ProfileSummaryInfo *PSI, const MachineBlockFrequencyInfo *BFI, PGSOQueryType QueryType=PGSOQueryType::Other)
Returns true if machine function MF is suggested to be size-optimized based on the profile.
constexpr force_iteration_on_noniterable_enum_t force_iteration_on_noniterable_enum
Definition Sequence.h:109
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
Definition bit.h:345
void ComputeValueTypes(const DataLayout &DL, Type *Ty, SmallVectorImpl< Type * > &Types, SmallVectorImpl< TypeSize > *Offsets=nullptr, TypeSize StartingOffset=TypeSize::getZero())
Given an LLVM IR type, compute non-aggregate subtypes.
Definition Analysis.cpp:72
bool isReleaseOrStronger(AtomicOrdering AO)
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
constexpr bool has_single_bit(T Value) noexcept
Definition bit.h:147
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1753
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
bool isDigit(char C)
Checks if character C is one of the 10 decimal digits.
AtomicOrdering
Atomic ordering for LLVM's memory model.
LLVM_ABI EVT getApproximateEVTForLLT(LLT Ty, LLVMContext &Ctx)
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
Definition MathExtras.h:394
TargetTransformInfo TTI
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ FMul
Product of floats.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ FAdd
Sum of floats.
DWARFExpression::Operation Op
bool isAcquireOrStronger(AtomicOrdering AO)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
EVT getPow2VectorType(LLVMContext &Context) const
Widens the length of the given vector EVT up to the nearest power of 2 and returns that type.
Definition ValueTypes.h:477
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
Definition ValueTypes.h:137
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:74
ElementCount getVectorElementCount() const
Definition ValueTypes.h:350
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
bool isPow2VectorType() const
Returns true if the given vector is a power of 2.
Definition ValueTypes.h:470
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
Definition ValueTypes.h:316
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:65
bool isFixedLengthVector() const
Definition ValueTypes.h:181
EVT getRoundIntegerType(LLVMContext &Context) const
Rounds the bit-width of the given integer EVT up to the nearest power of two (and at least to eight),...
Definition ValueTypes.h:419
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:168
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:323
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:336
bool isZeroSized() const
Test if the given EVT has zero size, this will fail if called on a scalable type.
Definition ValueTypes.h:132
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
Definition ValueTypes.h:453
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:152
OutputArg - This struct carries flags and a value for a single outgoing (actual) argument or outgoing...
Matching combinators.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
static RTLIB::Libcall getLibcallFromImpl(RTLIB::LibcallImpl Impl)
Return the libcall provided by Impl.
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...