2590 lines · cpp
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-exception6//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"16#include "llvm/ADT/SmallVector.h"17#include "llvm/ADT/StringExtras.h"18#include "llvm/ADT/StringRef.h"19#include "llvm/ADT/Twine.h"20#include "llvm/Analysis/Loads.h"21#include "llvm/Analysis/TargetTransformInfo.h"22#include "llvm/CodeGen/Analysis.h"23#include "llvm/CodeGen/ISDOpcodes.h"24#include "llvm/CodeGen/MachineBasicBlock.h"25#include "llvm/CodeGen/MachineFrameInfo.h"26#include "llvm/CodeGen/MachineFunction.h"27#include "llvm/CodeGen/MachineInstr.h"28#include "llvm/CodeGen/MachineInstrBuilder.h"29#include "llvm/CodeGen/MachineMemOperand.h"30#include "llvm/CodeGen/MachineOperand.h"31#include "llvm/CodeGen/MachineRegisterInfo.h"32#include "llvm/CodeGen/RuntimeLibcallUtil.h"33#include "llvm/CodeGen/StackMaps.h"34#include "llvm/CodeGen/TargetLowering.h"35#include "llvm/CodeGen/TargetOpcodes.h"36#include "llvm/CodeGen/TargetRegisterInfo.h"37#include "llvm/CodeGen/ValueTypes.h"38#include "llvm/CodeGenTypes/MachineValueType.h"39#include "llvm/IR/Attributes.h"40#include "llvm/IR/CallingConv.h"41#include "llvm/IR/DataLayout.h"42#include "llvm/IR/DerivedTypes.h"43#include "llvm/IR/Function.h"44#include "llvm/IR/GlobalValue.h"45#include "llvm/IR/GlobalVariable.h"46#include "llvm/IR/IRBuilder.h"47#include "llvm/IR/Module.h"48#include "llvm/IR/Type.h"49#include "llvm/Support/Casting.h"50#include "llvm/Support/CommandLine.h"51#include "llvm/Support/Compiler.h"52#include "llvm/Support/ErrorHandling.h"53#include "llvm/Support/MathExtras.h"54#include "llvm/Target/TargetMachine.h"55#include "llvm/Target/TargetOptions.h"56#include "llvm/TargetParser/Triple.h"57#include "llvm/Transforms/Utils/SizeOpts.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 68static cl::opt<bool> JumpIsExpensiveOverride(69 "jump-is-expensive", cl::init(false),70 cl::desc("Do not create extra branches to split comparison logic."),71 cl::Hidden);72 73static cl::opt<unsigned> MinimumJumpTableEntries74 ("min-jump-table-entries", cl::init(4), cl::Hidden,75 cl::desc("Set minimum number of entries to use a jump table."));76 77static cl::opt<unsigned> MaximumJumpTableSize78 ("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.82static cl::opt<unsigned>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.88static cl::opt<unsigned> OptsizeJumpTableDensity(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 93static cl::opt<unsigned> MinimumBitTestCmpsOverride(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 98// FIXME: This option is only to test if the strict fp operation processed99// correctly by preventing mutating strict fp operation to normal fp operation100// during development. When the backend supports strict float operation, this101// option will be meaningless.102static cl::opt<bool> DisableStrictNodeMutation("disable-strictnode-mutation",103 cl::desc("Don't mutate strict-float node to a legalize node"),104 cl::init(false), cl::Hidden);105 106/// GetFPLibCall - Helper to return the right libcall for the given floating107/// point type, or UNKNOWN_LIBCALL if there is none.108RTLIB::Libcall RTLIB::getFPLibCall(EVT VT,109 RTLIB::Libcall Call_F32,110 RTLIB::Libcall Call_F64,111 RTLIB::Libcall Call_F80,112 RTLIB::Libcall Call_F128,113 RTLIB::Libcall Call_PPCF128) {114 return115 VT == MVT::f32 ? Call_F32 :116 VT == MVT::f64 ? Call_F64 :117 VT == MVT::f80 ? Call_F80 :118 VT == MVT::f128 ? Call_F128 :119 VT == MVT::ppcf128 ? Call_PPCF128 :120 RTLIB::UNKNOWN_LIBCALL;121}122 123/// getFPEXT - Return the FPEXT_*_* value for the given types, or124/// UNKNOWN_LIBCALL if there is none.125RTLIB::Libcall RTLIB::getFPEXT(EVT OpVT, EVT RetVT) {126 if (OpVT == MVT::f16) {127 if (RetVT == MVT::f32)128 return FPEXT_F16_F32;129 if (RetVT == MVT::f64)130 return FPEXT_F16_F64;131 if (RetVT == MVT::f80)132 return FPEXT_F16_F80;133 if (RetVT == MVT::f128)134 return FPEXT_F16_F128;135 } else if (OpVT == MVT::f32) {136 if (RetVT == MVT::f64)137 return FPEXT_F32_F64;138 if (RetVT == MVT::f128)139 return FPEXT_F32_F128;140 if (RetVT == MVT::ppcf128)141 return FPEXT_F32_PPCF128;142 } else if (OpVT == MVT::f64) {143 if (RetVT == MVT::f128)144 return FPEXT_F64_F128;145 else if (RetVT == MVT::ppcf128)146 return FPEXT_F64_PPCF128;147 } else if (OpVT == MVT::f80) {148 if (RetVT == MVT::f128)149 return FPEXT_F80_F128;150 } else if (OpVT == MVT::bf16) {151 if (RetVT == MVT::f32)152 return FPEXT_BF16_F32;153 }154 155 return UNKNOWN_LIBCALL;156}157 158/// getFPROUND - Return the FPROUND_*_* value for the given types, or159/// UNKNOWN_LIBCALL if there is none.160RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) {161 if (RetVT == MVT::f16) {162 if (OpVT == MVT::f32)163 return FPROUND_F32_F16;164 if (OpVT == MVT::f64)165 return FPROUND_F64_F16;166 if (OpVT == MVT::f80)167 return FPROUND_F80_F16;168 if (OpVT == MVT::f128)169 return FPROUND_F128_F16;170 if (OpVT == MVT::ppcf128)171 return FPROUND_PPCF128_F16;172 } else if (RetVT == MVT::bf16) {173 if (OpVT == MVT::f32)174 return FPROUND_F32_BF16;175 if (OpVT == MVT::f64)176 return FPROUND_F64_BF16;177 if (OpVT == MVT::f80)178 return FPROUND_F80_BF16;179 if (OpVT == MVT::f128)180 return FPROUND_F128_BF16;181 } else if (RetVT == MVT::f32) {182 if (OpVT == MVT::f64)183 return FPROUND_F64_F32;184 if (OpVT == MVT::f80)185 return FPROUND_F80_F32;186 if (OpVT == MVT::f128)187 return FPROUND_F128_F32;188 if (OpVT == MVT::ppcf128)189 return FPROUND_PPCF128_F32;190 } else if (RetVT == MVT::f64) {191 if (OpVT == MVT::f80)192 return FPROUND_F80_F64;193 if (OpVT == MVT::f128)194 return FPROUND_F128_F64;195 if (OpVT == MVT::ppcf128)196 return FPROUND_PPCF128_F64;197 } else if (RetVT == MVT::f80) {198 if (OpVT == MVT::f128)199 return FPROUND_F128_F80;200 }201 202 return UNKNOWN_LIBCALL;203}204 205/// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or206/// UNKNOWN_LIBCALL if there is none.207RTLIB::Libcall RTLIB::getFPTOSINT(EVT OpVT, EVT RetVT) {208 if (OpVT == MVT::f16) {209 if (RetVT == MVT::i32)210 return FPTOSINT_F16_I32;211 if (RetVT == MVT::i64)212 return FPTOSINT_F16_I64;213 if (RetVT == MVT::i128)214 return FPTOSINT_F16_I128;215 } else if (OpVT == MVT::f32) {216 if (RetVT == MVT::i32)217 return FPTOSINT_F32_I32;218 if (RetVT == MVT::i64)219 return FPTOSINT_F32_I64;220 if (RetVT == MVT::i128)221 return FPTOSINT_F32_I128;222 } else if (OpVT == MVT::f64) {223 if (RetVT == MVT::i32)224 return FPTOSINT_F64_I32;225 if (RetVT == MVT::i64)226 return FPTOSINT_F64_I64;227 if (RetVT == MVT::i128)228 return FPTOSINT_F64_I128;229 } else if (OpVT == MVT::f80) {230 if (RetVT == MVT::i32)231 return FPTOSINT_F80_I32;232 if (RetVT == MVT::i64)233 return FPTOSINT_F80_I64;234 if (RetVT == MVT::i128)235 return FPTOSINT_F80_I128;236 } else if (OpVT == MVT::f128) {237 if (RetVT == MVT::i32)238 return FPTOSINT_F128_I32;239 if (RetVT == MVT::i64)240 return FPTOSINT_F128_I64;241 if (RetVT == MVT::i128)242 return FPTOSINT_F128_I128;243 } else if (OpVT == MVT::ppcf128) {244 if (RetVT == MVT::i32)245 return FPTOSINT_PPCF128_I32;246 if (RetVT == MVT::i64)247 return FPTOSINT_PPCF128_I64;248 if (RetVT == MVT::i128)249 return FPTOSINT_PPCF128_I128;250 }251 return UNKNOWN_LIBCALL;252}253 254/// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or255/// UNKNOWN_LIBCALL if there is none.256RTLIB::Libcall RTLIB::getFPTOUINT(EVT OpVT, EVT RetVT) {257 if (OpVT == MVT::f16) {258 if (RetVT == MVT::i32)259 return FPTOUINT_F16_I32;260 if (RetVT == MVT::i64)261 return FPTOUINT_F16_I64;262 if (RetVT == MVT::i128)263 return FPTOUINT_F16_I128;264 } else if (OpVT == MVT::f32) {265 if (RetVT == MVT::i32)266 return FPTOUINT_F32_I32;267 if (RetVT == MVT::i64)268 return FPTOUINT_F32_I64;269 if (RetVT == MVT::i128)270 return FPTOUINT_F32_I128;271 } else if (OpVT == MVT::f64) {272 if (RetVT == MVT::i32)273 return FPTOUINT_F64_I32;274 if (RetVT == MVT::i64)275 return FPTOUINT_F64_I64;276 if (RetVT == MVT::i128)277 return FPTOUINT_F64_I128;278 } else if (OpVT == MVT::f80) {279 if (RetVT == MVT::i32)280 return FPTOUINT_F80_I32;281 if (RetVT == MVT::i64)282 return FPTOUINT_F80_I64;283 if (RetVT == MVT::i128)284 return FPTOUINT_F80_I128;285 } else if (OpVT == MVT::f128) {286 if (RetVT == MVT::i32)287 return FPTOUINT_F128_I32;288 if (RetVT == MVT::i64)289 return FPTOUINT_F128_I64;290 if (RetVT == MVT::i128)291 return FPTOUINT_F128_I128;292 } else if (OpVT == MVT::ppcf128) {293 if (RetVT == MVT::i32)294 return FPTOUINT_PPCF128_I32;295 if (RetVT == MVT::i64)296 return FPTOUINT_PPCF128_I64;297 if (RetVT == MVT::i128)298 return FPTOUINT_PPCF128_I128;299 }300 return UNKNOWN_LIBCALL;301}302 303/// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or304/// UNKNOWN_LIBCALL if there is none.305RTLIB::Libcall RTLIB::getSINTTOFP(EVT OpVT, EVT RetVT) {306 if (OpVT == MVT::i32) {307 if (RetVT == MVT::f16)308 return SINTTOFP_I32_F16;309 if (RetVT == MVT::f32)310 return SINTTOFP_I32_F32;311 if (RetVT == MVT::f64)312 return SINTTOFP_I32_F64;313 if (RetVT == MVT::f80)314 return SINTTOFP_I32_F80;315 if (RetVT == MVT::f128)316 return SINTTOFP_I32_F128;317 if (RetVT == MVT::ppcf128)318 return SINTTOFP_I32_PPCF128;319 } else if (OpVT == MVT::i64) {320 if (RetVT == MVT::bf16)321 return SINTTOFP_I64_BF16;322 if (RetVT == MVT::f16)323 return SINTTOFP_I64_F16;324 if (RetVT == MVT::f32)325 return SINTTOFP_I64_F32;326 if (RetVT == MVT::f64)327 return SINTTOFP_I64_F64;328 if (RetVT == MVT::f80)329 return SINTTOFP_I64_F80;330 if (RetVT == MVT::f128)331 return SINTTOFP_I64_F128;332 if (RetVT == MVT::ppcf128)333 return SINTTOFP_I64_PPCF128;334 } else if (OpVT == MVT::i128) {335 if (RetVT == MVT::f16)336 return SINTTOFP_I128_F16;337 if (RetVT == MVT::f32)338 return SINTTOFP_I128_F32;339 if (RetVT == MVT::f64)340 return SINTTOFP_I128_F64;341 if (RetVT == MVT::f80)342 return SINTTOFP_I128_F80;343 if (RetVT == MVT::f128)344 return SINTTOFP_I128_F128;345 if (RetVT == MVT::ppcf128)346 return SINTTOFP_I128_PPCF128;347 }348 return UNKNOWN_LIBCALL;349}350 351/// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or352/// UNKNOWN_LIBCALL if there is none.353RTLIB::Libcall RTLIB::getUINTTOFP(EVT OpVT, EVT RetVT) {354 if (OpVT == MVT::i32) {355 if (RetVT == MVT::f16)356 return UINTTOFP_I32_F16;357 if (RetVT == MVT::f32)358 return UINTTOFP_I32_F32;359 if (RetVT == MVT::f64)360 return UINTTOFP_I32_F64;361 if (RetVT == MVT::f80)362 return UINTTOFP_I32_F80;363 if (RetVT == MVT::f128)364 return UINTTOFP_I32_F128;365 if (RetVT == MVT::ppcf128)366 return UINTTOFP_I32_PPCF128;367 } else if (OpVT == MVT::i64) {368 if (RetVT == MVT::bf16)369 return UINTTOFP_I64_BF16;370 if (RetVT == MVT::f16)371 return UINTTOFP_I64_F16;372 if (RetVT == MVT::f32)373 return UINTTOFP_I64_F32;374 if (RetVT == MVT::f64)375 return UINTTOFP_I64_F64;376 if (RetVT == MVT::f80)377 return UINTTOFP_I64_F80;378 if (RetVT == MVT::f128)379 return UINTTOFP_I64_F128;380 if (RetVT == MVT::ppcf128)381 return UINTTOFP_I64_PPCF128;382 } else if (OpVT == MVT::i128) {383 if (RetVT == MVT::f16)384 return UINTTOFP_I128_F16;385 if (RetVT == MVT::f32)386 return UINTTOFP_I128_F32;387 if (RetVT == MVT::f64)388 return UINTTOFP_I128_F64;389 if (RetVT == MVT::f80)390 return UINTTOFP_I128_F80;391 if (RetVT == MVT::f128)392 return UINTTOFP_I128_F128;393 if (RetVT == MVT::ppcf128)394 return UINTTOFP_I128_PPCF128;395 }396 return UNKNOWN_LIBCALL;397}398 399RTLIB::Libcall RTLIB::getPOWI(EVT RetVT) {400 return getFPLibCall(RetVT, POWI_F32, POWI_F64, POWI_F80, POWI_F128,401 POWI_PPCF128);402}403 404RTLIB::Libcall RTLIB::getPOW(EVT RetVT) {405 return getFPLibCall(RetVT, POW_F32, POW_F64, POW_F80, POW_F128, POW_PPCF128);406}407 408RTLIB::Libcall RTLIB::getLDEXP(EVT RetVT) {409 return getFPLibCall(RetVT, LDEXP_F32, LDEXP_F64, LDEXP_F80, LDEXP_F128,410 LDEXP_PPCF128);411}412 413RTLIB::Libcall RTLIB::getFREXP(EVT RetVT) {414 return getFPLibCall(RetVT, FREXP_F32, FREXP_F64, FREXP_F80, FREXP_F128,415 FREXP_PPCF128);416}417 418RTLIB::Libcall RTLIB::getSIN(EVT RetVT) {419 return getFPLibCall(RetVT, SIN_F32, SIN_F64, SIN_F80, SIN_F128, SIN_PPCF128);420}421 422RTLIB::Libcall RTLIB::getCOS(EVT RetVT) {423 return getFPLibCall(RetVT, COS_F32, COS_F64, COS_F80, COS_F128, COS_PPCF128);424}425 426RTLIB::Libcall RTLIB::getSINCOS(EVT RetVT) {427 // TODO: Tablegen should generate this function428 if (RetVT.isVector()) {429 if (!RetVT.isSimple())430 return RTLIB::UNKNOWN_LIBCALL;431 switch (RetVT.getSimpleVT().SimpleTy) {432 case MVT::v4f32:433 return RTLIB::SINCOS_V4F32;434 case MVT::v2f64:435 return RTLIB::SINCOS_V2F64;436 case MVT::nxv4f32:437 return RTLIB::SINCOS_NXV4F32;438 case MVT::nxv2f64:439 return RTLIB::SINCOS_NXV2F64;440 default:441 return RTLIB::UNKNOWN_LIBCALL;442 }443 }444 445 return getFPLibCall(RetVT, SINCOS_F32, SINCOS_F64, SINCOS_F80, SINCOS_F128,446 SINCOS_PPCF128);447}448 449RTLIB::Libcall RTLIB::getSINCOSPI(EVT RetVT) {450 // TODO: Tablegen should generate this function451 if (RetVT.isVector()) {452 if (!RetVT.isSimple())453 return RTLIB::UNKNOWN_LIBCALL;454 switch (RetVT.getSimpleVT().SimpleTy) {455 case MVT::v4f32:456 return RTLIB::SINCOSPI_V4F32;457 case MVT::v2f64:458 return RTLIB::SINCOSPI_V2F64;459 case MVT::nxv4f32:460 return RTLIB::SINCOSPI_NXV4F32;461 case MVT::nxv2f64:462 return RTLIB::SINCOSPI_NXV2F64;463 default:464 return RTLIB::UNKNOWN_LIBCALL;465 }466 }467 468 return getFPLibCall(RetVT, SINCOSPI_F32, SINCOSPI_F64, SINCOSPI_F80,469 SINCOSPI_F128, SINCOSPI_PPCF128);470}471 472RTLIB::Libcall RTLIB::getSINCOS_STRET(EVT RetVT) {473 return getFPLibCall(RetVT, SINCOS_STRET_F32, SINCOS_STRET_F64,474 UNKNOWN_LIBCALL, UNKNOWN_LIBCALL, UNKNOWN_LIBCALL);475}476 477RTLIB::Libcall RTLIB::getMODF(EVT RetVT) {478 // TODO: Tablegen should generate this function479 if (RetVT.isVector()) {480 if (!RetVT.isSimple())481 return RTLIB::UNKNOWN_LIBCALL;482 switch (RetVT.getSimpleVT().SimpleTy) {483 case MVT::v4f32:484 return RTLIB::MODF_V4F32;485 case MVT::v2f64:486 return RTLIB::MODF_V2F64;487 case MVT::nxv4f32:488 return RTLIB::MODF_NXV4F32;489 case MVT::nxv2f64:490 return RTLIB::MODF_NXV2F64;491 default:492 return RTLIB::UNKNOWN_LIBCALL;493 }494 }495 496 return getFPLibCall(RetVT, MODF_F32, MODF_F64, MODF_F80, MODF_F128,497 MODF_PPCF128);498}499 500RTLIB::Libcall RTLIB::getOutlineAtomicHelper(const Libcall (&LC)[5][4],501 AtomicOrdering Order,502 uint64_t MemSize) {503 unsigned ModeN, ModelN;504 switch (MemSize) {505 case 1:506 ModeN = 0;507 break;508 case 2:509 ModeN = 1;510 break;511 case 4:512 ModeN = 2;513 break;514 case 8:515 ModeN = 3;516 break;517 case 16:518 ModeN = 4;519 break;520 default:521 return RTLIB::UNKNOWN_LIBCALL;522 }523 524 switch (Order) {525 case AtomicOrdering::Monotonic:526 ModelN = 0;527 break;528 case AtomicOrdering::Acquire:529 ModelN = 1;530 break;531 case AtomicOrdering::Release:532 ModelN = 2;533 break;534 case AtomicOrdering::AcquireRelease:535 case AtomicOrdering::SequentiallyConsistent:536 ModelN = 3;537 break;538 default:539 return UNKNOWN_LIBCALL;540 }541 542 return LC[ModeN][ModelN];543}544 545RTLIB::Libcall RTLIB::getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order,546 MVT VT) {547 if (!VT.isScalarInteger())548 return UNKNOWN_LIBCALL;549 uint64_t MemSize = VT.getScalarSizeInBits() / 8;550 551#define LCALLS(A, B) \552 { A##B##_RELAX, A##B##_ACQ, A##B##_REL, A##B##_ACQ_REL }553#define LCALL5(A) \554 LCALLS(A, 1), LCALLS(A, 2), LCALLS(A, 4), LCALLS(A, 8), LCALLS(A, 16)555 switch (Opc) {556 case ISD::ATOMIC_CMP_SWAP: {557 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_CAS)};558 return getOutlineAtomicHelper(LC, Order, MemSize);559 }560 case ISD::ATOMIC_SWAP: {561 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_SWP)};562 return getOutlineAtomicHelper(LC, Order, MemSize);563 }564 case ISD::ATOMIC_LOAD_ADD: {565 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDADD)};566 return getOutlineAtomicHelper(LC, Order, MemSize);567 }568 case ISD::ATOMIC_LOAD_OR: {569 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDSET)};570 return getOutlineAtomicHelper(LC, Order, MemSize);571 }572 case ISD::ATOMIC_LOAD_CLR: {573 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDCLR)};574 return getOutlineAtomicHelper(LC, Order, MemSize);575 }576 case ISD::ATOMIC_LOAD_XOR: {577 const Libcall LC[5][4] = {LCALL5(OUTLINE_ATOMIC_LDEOR)};578 return getOutlineAtomicHelper(LC, Order, MemSize);579 }580 default:581 return UNKNOWN_LIBCALL;582 }583#undef LCALLS584#undef LCALL5585}586 587RTLIB::Libcall RTLIB::getSYNC(unsigned Opc, MVT VT) {588#define OP_TO_LIBCALL(Name, Enum) \589 case Name: \590 switch (VT.SimpleTy) { \591 default: \592 return UNKNOWN_LIBCALL; \593 case MVT::i8: \594 return Enum##_1; \595 case MVT::i16: \596 return Enum##_2; \597 case MVT::i32: \598 return Enum##_4; \599 case MVT::i64: \600 return Enum##_8; \601 case MVT::i128: \602 return Enum##_16; \603 }604 605 switch (Opc) {606 OP_TO_LIBCALL(ISD::ATOMIC_SWAP, SYNC_LOCK_TEST_AND_SET)607 OP_TO_LIBCALL(ISD::ATOMIC_CMP_SWAP, SYNC_VAL_COMPARE_AND_SWAP)608 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_ADD, SYNC_FETCH_AND_ADD)609 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_SUB, SYNC_FETCH_AND_SUB)610 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_AND, SYNC_FETCH_AND_AND)611 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_OR, SYNC_FETCH_AND_OR)612 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_XOR, SYNC_FETCH_AND_XOR)613 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_NAND, SYNC_FETCH_AND_NAND)614 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MAX, SYNC_FETCH_AND_MAX)615 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMAX, SYNC_FETCH_AND_UMAX)616 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MIN, SYNC_FETCH_AND_MIN)617 OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMIN, SYNC_FETCH_AND_UMIN)618 }619 620#undef OP_TO_LIBCALL621 622 return UNKNOWN_LIBCALL;623}624 625RTLIB::Libcall RTLIB::getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {626 switch (ElementSize) {627 case 1:628 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_1;629 case 2:630 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_2;631 case 4:632 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_4;633 case 8:634 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_8;635 case 16:636 return MEMCPY_ELEMENT_UNORDERED_ATOMIC_16;637 default:638 return UNKNOWN_LIBCALL;639 }640}641 642RTLIB::Libcall RTLIB::getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {643 switch (ElementSize) {644 case 1:645 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1;646 case 2:647 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2;648 case 4:649 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4;650 case 8:651 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8;652 case 16:653 return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16;654 default:655 return UNKNOWN_LIBCALL;656 }657}658 659RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) {660 switch (ElementSize) {661 case 1:662 return MEMSET_ELEMENT_UNORDERED_ATOMIC_1;663 case 2:664 return MEMSET_ELEMENT_UNORDERED_ATOMIC_2;665 case 4:666 return MEMSET_ELEMENT_UNORDERED_ATOMIC_4;667 case 8:668 return MEMSET_ELEMENT_UNORDERED_ATOMIC_8;669 case 16:670 return MEMSET_ELEMENT_UNORDERED_ATOMIC_16;671 default:672 return UNKNOWN_LIBCALL;673 }674}675 676ISD::CondCode TargetLoweringBase::getSoftFloatCmpLibcallPredicate(677 RTLIB::LibcallImpl Impl) const {678 switch (Impl) {679 case RTLIB::impl___aeabi_dcmpeq__une:680 case RTLIB::impl___aeabi_fcmpeq__une:681 // Usage in the eq case, so we have to invert the comparison.682 return ISD::SETEQ;683 case RTLIB::impl___aeabi_dcmpeq__oeq:684 case RTLIB::impl___aeabi_fcmpeq__oeq:685 // Normal comparison to boolean value.686 return ISD::SETNE;687 case RTLIB::impl___aeabi_dcmplt:688 case RTLIB::impl___aeabi_dcmple:689 case RTLIB::impl___aeabi_dcmpge:690 case RTLIB::impl___aeabi_dcmpgt:691 case RTLIB::impl___aeabi_dcmpun:692 case RTLIB::impl___aeabi_fcmplt:693 case RTLIB::impl___aeabi_fcmple:694 case RTLIB::impl___aeabi_fcmpge:695 case RTLIB::impl___aeabi_fcmpgt:696 /// The AEABI versions return a typical boolean value, so we can compare697 /// against the integer result as simply != 0.698 return ISD::SETNE;699 default:700 break;701 }702 703 // Assume libgcc/compiler-rt behavior. Most of the cases are really aliases of704 // each other, and return a 3-way comparison style result of -1, 0, or 1705 // depending on lt/eq/gt.706 //707 // FIXME: It would be cleaner to directly express this as a 3-way comparison708 // soft FP libcall instead of individual compares.709 RTLIB::Libcall LC = RTLIB::RuntimeLibcallsInfo::getLibcallFromImpl(Impl);710 switch (LC) {711 case RTLIB::OEQ_F32:712 case RTLIB::OEQ_F64:713 case RTLIB::OEQ_F128:714 case RTLIB::OEQ_PPCF128:715 return ISD::SETEQ;716 case RTLIB::UNE_F32:717 case RTLIB::UNE_F64:718 case RTLIB::UNE_F128:719 case RTLIB::UNE_PPCF128:720 return ISD::SETNE;721 case RTLIB::OGE_F32:722 case RTLIB::OGE_F64:723 case RTLIB::OGE_F128:724 case RTLIB::OGE_PPCF128:725 return ISD::SETGE;726 case RTLIB::OLT_F32:727 case RTLIB::OLT_F64:728 case RTLIB::OLT_F128:729 case RTLIB::OLT_PPCF128:730 return ISD::SETLT;731 case RTLIB::OLE_F32:732 case RTLIB::OLE_F64:733 case RTLIB::OLE_F128:734 case RTLIB::OLE_PPCF128:735 return ISD::SETLE;736 case RTLIB::OGT_F32:737 case RTLIB::OGT_F64:738 case RTLIB::OGT_F128:739 case RTLIB::OGT_PPCF128:740 return ISD::SETGT;741 case RTLIB::UO_F32:742 case RTLIB::UO_F64:743 case RTLIB::UO_F128:744 case RTLIB::UO_PPCF128:745 return ISD::SETNE;746 default:747 llvm_unreachable("not a compare libcall");748 }749}750 751/// NOTE: The TargetMachine owns TLOF.752TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm,753 const TargetSubtargetInfo &STI)754 : TM(tm),755 RuntimeLibcallInfo(TM.getTargetTriple(), TM.Options.ExceptionModel,756 TM.Options.FloatABIType, TM.Options.EABIVersion,757 TM.Options.MCOptions.getABIName(), TM.Options.VecLib),758 Libcalls(RuntimeLibcallInfo, STI) {759 initActions();760 761 // Perform these initializations only once.762 MaxStoresPerMemset = MaxStoresPerMemcpy = MaxStoresPerMemmove =763 MaxLoadsPerMemcmp = 8;764 MaxGluedStoresPerMemcpy = 0;765 MaxStoresPerMemsetOptSize = MaxStoresPerMemcpyOptSize =766 MaxStoresPerMemmoveOptSize = MaxLoadsPerMemcmpOptSize = 4;767 HasExtractBitsInsn = false;768 JumpIsExpensive = JumpIsExpensiveOverride;769 PredictableSelectIsExpensive = false;770 EnableExtLdPromotion = false;771 StackPointerRegisterToSaveRestore = 0;772 BooleanContents = UndefinedBooleanContent;773 BooleanFloatContents = UndefinedBooleanContent;774 BooleanVectorContents = UndefinedBooleanContent;775 SchedPreferenceInfo = Sched::ILP;776 GatherAllAliasesMaxDepth = 18;777 IsStrictFPEnabled = DisableStrictNodeMutation;778 MaxBytesForAlignment = 0;779 MaxAtomicSizeInBitsSupported = 0;780 781 // Assume that even with libcalls, no target supports wider than 128 bit782 // division.783 MaxDivRemBitWidthSupported = 128;784 785 MaxLargeFPConvertBitWidthSupported = llvm::IntegerType::MAX_INT_BITS;786 787 MinCmpXchgSizeInBits = 0;788 SupportsUnalignedAtomics = false;789 790 MinimumBitTestCmps = MinimumBitTestCmpsOverride;791}792 793// Define the virtual destructor out-of-line to act as a key method to anchor794// debug info (see coding standards).795TargetLoweringBase::~TargetLoweringBase() = default;796 797void TargetLoweringBase::initActions() {798 // All operations default to being supported.799 memset(OpActions, 0, sizeof(OpActions));800 memset(LoadExtActions, 0, sizeof(LoadExtActions));801 memset(TruncStoreActions, 0, sizeof(TruncStoreActions));802 memset(IndexedModeActions, 0, sizeof(IndexedModeActions));803 memset(CondCodeActions, 0, sizeof(CondCodeActions));804 llvm::fill(RegClassForVT, nullptr);805 llvm::fill(TargetDAGCombineArray, 0);806 807 // Let extending atomic loads be unsupported by default.808 for (MVT ValVT : MVT::all_valuetypes())809 for (MVT MemVT : MVT::all_valuetypes())810 setAtomicLoadExtAction({ISD::SEXTLOAD, ISD::ZEXTLOAD}, ValVT, MemVT,811 Expand);812 813 // We're somewhat special casing MVT::i2 and MVT::i4. Ideally we want to814 // remove this and targets should individually set these types if not legal.815 for (ISD::NodeType NT : enum_seq(ISD::DELETED_NODE, ISD::BUILTIN_OP_END,816 force_iteration_on_noniterable_enum)) {817 for (MVT VT : {MVT::i2, MVT::i4})818 OpActions[(unsigned)VT.SimpleTy][NT] = Expand;819 }820 for (MVT AVT : MVT::all_valuetypes()) {821 for (MVT VT : {MVT::i2, MVT::i4, MVT::v128i2, MVT::v64i4}) {822 setTruncStoreAction(AVT, VT, Expand);823 setLoadExtAction(ISD::EXTLOAD, AVT, VT, Expand);824 setLoadExtAction(ISD::ZEXTLOAD, AVT, VT, Expand);825 }826 }827 for (unsigned IM = (unsigned)ISD::PRE_INC;828 IM != (unsigned)ISD::LAST_INDEXED_MODE; ++IM) {829 for (MVT VT : {MVT::i2, MVT::i4}) {830 setIndexedLoadAction(IM, VT, Expand);831 setIndexedStoreAction(IM, VT, Expand);832 setIndexedMaskedLoadAction(IM, VT, Expand);833 setIndexedMaskedStoreAction(IM, VT, Expand);834 }835 }836 837 for (MVT VT : MVT::fp_valuetypes()) {838 MVT IntVT = MVT::getIntegerVT(VT.getFixedSizeInBits());839 if (IntVT.isValid()) {840 setOperationAction(ISD::ATOMIC_SWAP, VT, Promote);841 AddPromotedToType(ISD::ATOMIC_SWAP, VT, IntVT);842 }843 }844 845 // Set default actions for various operations.846 for (MVT VT : MVT::all_valuetypes()) {847 // Default all indexed load / store to expand.848 for (unsigned IM = (unsigned)ISD::PRE_INC;849 IM != (unsigned)ISD::LAST_INDEXED_MODE; ++IM) {850 setIndexedLoadAction(IM, VT, Expand);851 setIndexedStoreAction(IM, VT, Expand);852 setIndexedMaskedLoadAction(IM, VT, Expand);853 setIndexedMaskedStoreAction(IM, VT, Expand);854 }855 856 // Most backends expect to see the node which just returns the value loaded.857 setOperationAction(ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, VT, Expand);858 859 // These operations default to expand.860 setOperationAction({ISD::FGETSIGN, ISD::CONCAT_VECTORS,861 ISD::FMINNUM, ISD::FMAXNUM,862 ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE,863 ISD::FMINIMUM, ISD::FMAXIMUM,864 ISD::FMINIMUMNUM, ISD::FMAXIMUMNUM,865 ISD::FMAD, ISD::SMIN,866 ISD::SMAX, ISD::UMIN,867 ISD::UMAX, ISD::ABS,868 ISD::FSHL, ISD::FSHR,869 ISD::SADDSAT, ISD::UADDSAT,870 ISD::SSUBSAT, ISD::USUBSAT,871 ISD::SSHLSAT, ISD::USHLSAT,872 ISD::SMULFIX, ISD::SMULFIXSAT,873 ISD::UMULFIX, ISD::UMULFIXSAT,874 ISD::SDIVFIX, ISD::SDIVFIXSAT,875 ISD::UDIVFIX, ISD::UDIVFIXSAT,876 ISD::FP_TO_SINT_SAT, ISD::FP_TO_UINT_SAT,877 ISD::IS_FPCLASS, ISD::FCBRT,878 ISD::FLOG, ISD::FLOG2,879 ISD::FLOG10, ISD::FEXP,880 ISD::FEXP2, ISD::FEXP10,881 ISD::FFLOOR, ISD::FNEARBYINT,882 ISD::FCEIL, ISD::FRINT,883 ISD::FTRUNC, ISD::FROUNDEVEN,884 ISD::FTAN, ISD::FACOS,885 ISD::FASIN, ISD::FATAN,886 ISD::FCOSH, ISD::FSINH,887 ISD::FTANH, ISD::FATAN2,888 ISD::FMULADD},889 VT, Expand);890 891 // Overflow operations default to expand892 setOperationAction({ISD::SADDO, ISD::SSUBO, ISD::UADDO, ISD::USUBO,893 ISD::SMULO, ISD::UMULO},894 VT, Expand);895 896 // Carry-using overflow operations default to expand.897 setOperationAction({ISD::UADDO_CARRY, ISD::USUBO_CARRY, ISD::SETCCCARRY,898 ISD::SADDO_CARRY, ISD::SSUBO_CARRY},899 VT, Expand);900 901 // ADDC/ADDE/SUBC/SUBE default to expand.902 setOperationAction({ISD::ADDC, ISD::ADDE, ISD::SUBC, ISD::SUBE}, VT,903 Expand);904 905 // [US]CMP default to expand906 setOperationAction({ISD::UCMP, ISD::SCMP}, VT, Expand);907 908 // Halving adds909 setOperationAction(910 {ISD::AVGFLOORS, ISD::AVGFLOORU, ISD::AVGCEILS, ISD::AVGCEILU}, VT,911 Expand);912 913 // Absolute difference914 setOperationAction({ISD::ABDS, ISD::ABDU}, VT, Expand);915 916 // Saturated trunc917 setOperationAction(ISD::TRUNCATE_SSAT_S, VT, Expand);918 setOperationAction(ISD::TRUNCATE_SSAT_U, VT, Expand);919 setOperationAction(ISD::TRUNCATE_USAT_U, VT, Expand);920 921 // These default to Expand so they will be expanded to CTLZ/CTTZ by default.922 setOperationAction({ISD::CTLZ_ZERO_UNDEF, ISD::CTTZ_ZERO_UNDEF}, VT,923 Expand);924 925 setOperationAction({ISD::BITREVERSE, ISD::PARITY}, VT, Expand);926 927 // These library functions default to expand.928 setOperationAction({ISD::FROUND, ISD::FPOWI, ISD::FLDEXP, ISD::FFREXP,929 ISD::FSINCOS, ISD::FSINCOSPI, ISD::FMODF},930 VT, Expand);931 932 // These operations default to expand for vector types.933 if (VT.isVector())934 setOperationAction({ISD::FCOPYSIGN, ISD::SIGN_EXTEND_INREG,935 ISD::ANY_EXTEND_VECTOR_INREG,936 ISD::SIGN_EXTEND_VECTOR_INREG,937 ISD::ZERO_EXTEND_VECTOR_INREG, ISD::SPLAT_VECTOR,938 ISD::LRINT, ISD::LLRINT, ISD::LROUND, ISD::LLROUND},939 VT, Expand);940 941 // Constrained floating-point operations default to expand.942#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \943 setOperationAction(ISD::STRICT_##DAGN, VT, Expand);944#include "llvm/IR/ConstrainedOps.def"945 946 // For most targets @llvm.get.dynamic.area.offset just returns 0.947 setOperationAction(ISD::GET_DYNAMIC_AREA_OFFSET, VT, Expand);948 949 // Vector reduction default to expand.950 setOperationAction(951 {ISD::VECREDUCE_FADD, ISD::VECREDUCE_FMUL, ISD::VECREDUCE_ADD,952 ISD::VECREDUCE_MUL, ISD::VECREDUCE_AND, ISD::VECREDUCE_OR,953 ISD::VECREDUCE_XOR, ISD::VECREDUCE_SMAX, ISD::VECREDUCE_SMIN,954 ISD::VECREDUCE_UMAX, ISD::VECREDUCE_UMIN, ISD::VECREDUCE_FMAX,955 ISD::VECREDUCE_FMIN, ISD::VECREDUCE_FMAXIMUM, ISD::VECREDUCE_FMINIMUM,956 ISD::VECREDUCE_SEQ_FADD, ISD::VECREDUCE_SEQ_FMUL},957 VT, Expand);958 959 // Named vector shuffles default to expand.960 setOperationAction(ISD::VECTOR_SPLICE, VT, Expand);961 962 // Only some target support this vector operation. Most need to expand it.963 setOperationAction(ISD::VECTOR_COMPRESS, VT, Expand);964 965 // VP operations default to expand.966#define BEGIN_REGISTER_VP_SDNODE(SDOPC, ...) \967 setOperationAction(ISD::SDOPC, VT, Expand);968#include "llvm/IR/VPIntrinsics.def"969 970 // Masked vector extracts default to expand.971 setOperationAction(ISD::VECTOR_FIND_LAST_ACTIVE, VT, Expand);972 973 setOperationAction(ISD::LOOP_DEPENDENCE_RAW_MASK, VT, Expand);974 setOperationAction(ISD::LOOP_DEPENDENCE_WAR_MASK, VT, Expand);975 976 // FP environment operations default to expand.977 setOperationAction(ISD::GET_FPENV, VT, Expand);978 setOperationAction(ISD::SET_FPENV, VT, Expand);979 setOperationAction(ISD::RESET_FPENV, VT, Expand);980 981 setOperationAction(ISD::MSTORE, VT, Expand);982 }983 984 // Most targets ignore the @llvm.prefetch intrinsic.985 setOperationAction(ISD::PREFETCH, MVT::Other, Expand);986 987 // Most targets also ignore the @llvm.readcyclecounter intrinsic.988 setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Expand);989 990 // Most targets also ignore the @llvm.readsteadycounter intrinsic.991 setOperationAction(ISD::READSTEADYCOUNTER, MVT::i64, Expand);992 993 // ConstantFP nodes default to expand. Targets can either change this to994 // Legal, in which case all fp constants are legal, or use isFPImmLegal()995 // to optimize expansions for certain constants.996 setOperationAction(ISD::ConstantFP,997 {MVT::bf16, MVT::f16, MVT::f32, MVT::f64, MVT::f80, MVT::f128},998 Expand);999 1000 // Insert custom handling default for llvm.canonicalize.*.1001 setOperationAction(ISD::FCANONICALIZE,1002 {MVT::f16, MVT::f32, MVT::f64, MVT::f128}, Expand);1003 1004 // FIXME: Query RuntimeLibCalls to make the decision.1005 setOperationAction({ISD::LRINT, ISD::LLRINT, ISD::LROUND, ISD::LLROUND},1006 {MVT::f32, MVT::f64, MVT::f128}, LibCall);1007 1008 setOperationAction({ISD::FTAN, ISD::FACOS, ISD::FASIN, ISD::FATAN, ISD::FCOSH,1009 ISD::FSINH, ISD::FTANH, ISD::FATAN2},1010 MVT::f16, Promote);1011 // Default ISD::TRAP to expand (which turns it into abort).1012 setOperationAction(ISD::TRAP, MVT::Other, Expand);1013 1014 // On most systems, DEBUGTRAP and TRAP have no difference. The "Expand"1015 // here is to inform DAG Legalizer to replace DEBUGTRAP with TRAP.1016 setOperationAction(ISD::DEBUGTRAP, MVT::Other, Expand);1017 1018 setOperationAction(ISD::UBSANTRAP, MVT::Other, Expand);1019 1020 setOperationAction(ISD::GET_FPENV_MEM, MVT::Other, Expand);1021 setOperationAction(ISD::SET_FPENV_MEM, MVT::Other, Expand);1022 1023 for (MVT VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {1024 setOperationAction(ISD::GET_FPMODE, VT, Expand);1025 setOperationAction(ISD::SET_FPMODE, VT, Expand);1026 }1027 setOperationAction(ISD::RESET_FPMODE, MVT::Other, Expand);1028 1029 // This one by default will call __clear_cache unless the target1030 // wants something different.1031 setOperationAction(ISD::CLEAR_CACHE, MVT::Other, LibCall);1032}1033 1034MVT TargetLoweringBase::getScalarShiftAmountTy(const DataLayout &DL,1035 EVT) const {1036 return MVT::getIntegerVT(DL.getPointerSizeInBits(0));1037}1038 1039EVT TargetLoweringBase::getShiftAmountTy(EVT LHSTy,1040 const DataLayout &DL) const {1041 assert(LHSTy.isInteger() && "Shift amount is not an integer type!");1042 if (LHSTy.isVector())1043 return LHSTy;1044 MVT ShiftVT = getScalarShiftAmountTy(DL, LHSTy);1045 // If any possible shift value won't fit in the prefered type, just use1046 // something safe. Assume it will be legalized when the shift is expanded.1047 if (ShiftVT.getSizeInBits() < Log2_32_Ceil(LHSTy.getSizeInBits()))1048 ShiftVT = MVT::i32;1049 assert(ShiftVT.getSizeInBits() >= Log2_32_Ceil(LHSTy.getSizeInBits()) &&1050 "ShiftVT is still too small!");1051 return ShiftVT;1052}1053 1054bool TargetLoweringBase::canOpTrap(unsigned Op, EVT VT) const {1055 assert(isTypeLegal(VT));1056 switch (Op) {1057 default:1058 return false;1059 case ISD::SDIV:1060 case ISD::UDIV:1061 case ISD::SREM:1062 case ISD::UREM:1063 return true;1064 }1065}1066 1067bool TargetLoweringBase::isFreeAddrSpaceCast(unsigned SrcAS,1068 unsigned DestAS) const {1069 return TM.isNoopAddrSpaceCast(SrcAS, DestAS);1070}1071 1072unsigned TargetLoweringBase::getBitWidthForCttzElements(1073 Type *RetTy, ElementCount EC, bool ZeroIsPoison,1074 const ConstantRange *VScaleRange) const {1075 // Find the smallest "sensible" element type to use for the expansion.1076 ConstantRange CR(APInt(64, EC.getKnownMinValue()));1077 if (EC.isScalable())1078 CR = CR.umul_sat(*VScaleRange);1079 1080 if (ZeroIsPoison)1081 CR = CR.subtract(APInt(64, 1));1082 1083 unsigned EltWidth = RetTy->getScalarSizeInBits();1084 EltWidth = std::min(EltWidth, CR.getActiveBits());1085 EltWidth = std::max(llvm::bit_ceil(EltWidth), (unsigned)8);1086 1087 return EltWidth;1088}1089 1090void TargetLoweringBase::setJumpIsExpensive(bool isExpensive) {1091 // If the command-line option was specified, ignore this request.1092 if (!JumpIsExpensiveOverride.getNumOccurrences())1093 JumpIsExpensive = isExpensive;1094}1095 1096TargetLoweringBase::LegalizeKind1097TargetLoweringBase::getTypeConversion(LLVMContext &Context, EVT VT) const {1098 // If this is a simple type, use the ComputeRegisterProp mechanism.1099 if (VT.isSimple()) {1100 MVT SVT = VT.getSimpleVT();1101 assert((unsigned)SVT.SimpleTy < std::size(TransformToType));1102 MVT NVT = TransformToType[SVT.SimpleTy];1103 LegalizeTypeAction LA = ValueTypeActions.getTypeAction(SVT);1104 1105 assert((LA == TypeLegal || LA == TypeSoftenFloat ||1106 LA == TypeSoftPromoteHalf ||1107 (NVT.isVector() ||1108 ValueTypeActions.getTypeAction(NVT) != TypePromoteInteger)) &&1109 "Promote may not follow Expand or Promote");1110 1111 if (LA == TypeSplitVector)1112 return LegalizeKind(LA, EVT(SVT).getHalfNumVectorElementsVT(Context));1113 if (LA == TypeScalarizeVector)1114 return LegalizeKind(LA, SVT.getVectorElementType());1115 return LegalizeKind(LA, NVT);1116 }1117 1118 // Handle Extended Scalar Types.1119 if (!VT.isVector()) {1120 assert(VT.isInteger() && "Float types must be simple");1121 unsigned BitSize = VT.getSizeInBits();1122 // First promote to a power-of-two size, then expand if necessary.1123 if (BitSize < 8 || !isPowerOf2_32(BitSize)) {1124 EVT NVT = VT.getRoundIntegerType(Context);1125 assert(NVT != VT && "Unable to round integer VT");1126 LegalizeKind NextStep = getTypeConversion(Context, NVT);1127 // Avoid multi-step promotion.1128 if (NextStep.first == TypePromoteInteger)1129 return NextStep;1130 // Return rounded integer type.1131 return LegalizeKind(TypePromoteInteger, NVT);1132 }1133 1134 return LegalizeKind(TypeExpandInteger,1135 EVT::getIntegerVT(Context, VT.getSizeInBits() / 2));1136 }1137 1138 // Handle vector types.1139 ElementCount NumElts = VT.getVectorElementCount();1140 EVT EltVT = VT.getVectorElementType();1141 1142 // Vectors with only one element are always scalarized.1143 if (NumElts.isScalar())1144 return LegalizeKind(TypeScalarizeVector, EltVT);1145 1146 // Try to widen vector elements until the element type is a power of two and1147 // promote it to a legal type later on, for example:1148 // <3 x i8> -> <4 x i8> -> <4 x i32>1149 if (EltVT.isInteger()) {1150 // Vectors with a number of elements that is not a power of two are always1151 // widened, for example <3 x i8> -> <4 x i8>.1152 if (!VT.isPow2VectorType()) {1153 NumElts = NumElts.coefficientNextPowerOf2();1154 EVT NVT = EVT::getVectorVT(Context, EltVT, NumElts);1155 return LegalizeKind(TypeWidenVector, NVT);1156 }1157 1158 // Examine the element type.1159 LegalizeKind LK = getTypeConversion(Context, EltVT);1160 1161 // If type is to be expanded, split the vector.1162 // <4 x i140> -> <2 x i140>1163 if (LK.first == TypeExpandInteger) {1164 if (NumElts.isScalable() && NumElts.getKnownMinValue() == 1)1165 return LegalizeKind(TypeScalarizeScalableVector, EltVT);1166 return LegalizeKind(TypeSplitVector,1167 VT.getHalfNumVectorElementsVT(Context));1168 }1169 1170 // Promote the integer element types until a legal vector type is found1171 // or until the element integer type is too big. If a legal type was not1172 // found, fallback to the usual mechanism of widening/splitting the1173 // vector.1174 EVT OldEltVT = EltVT;1175 while (true) {1176 // Increase the bitwidth of the element to the next pow-of-two1177 // (which is greater than 8 bits).1178 EltVT = EVT::getIntegerVT(Context, 1 + EltVT.getSizeInBits())1179 .getRoundIntegerType(Context);1180 1181 // Stop trying when getting a non-simple element type.1182 // Note that vector elements may be greater than legal vector element1183 // types. Example: X86 XMM registers hold 64bit element on 32bit1184 // systems.1185 if (!EltVT.isSimple())1186 break;1187 1188 // Build a new vector type and check if it is legal.1189 MVT NVT = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);1190 // Found a legal promoted vector type.1191 if (NVT != MVT() && ValueTypeActions.getTypeAction(NVT) == TypeLegal)1192 return LegalizeKind(TypePromoteInteger,1193 EVT::getVectorVT(Context, EltVT, NumElts));1194 }1195 1196 // Reset the type to the unexpanded type if we did not find a legal vector1197 // type with a promoted vector element type.1198 EltVT = OldEltVT;1199 }1200 1201 // Try to widen the vector until a legal type is found.1202 // If there is no wider legal type, split the vector.1203 while (true) {1204 // Round up to the next power of 2.1205 NumElts = NumElts.coefficientNextPowerOf2();1206 1207 // If there is no simple vector type with this many elements then there1208 // cannot be a larger legal vector type. Note that this assumes that1209 // there are no skipped intermediate vector types in the simple types.1210 if (!EltVT.isSimple())1211 break;1212 MVT LargerVector = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts);1213 if (LargerVector == MVT())1214 break;1215 1216 // If this type is legal then widen the vector.1217 if (ValueTypeActions.getTypeAction(LargerVector) == TypeLegal)1218 return LegalizeKind(TypeWidenVector, LargerVector);1219 }1220 1221 // Widen odd vectors to next power of two.1222 if (!VT.isPow2VectorType()) {1223 EVT NVT = VT.getPow2VectorType(Context);1224 return LegalizeKind(TypeWidenVector, NVT);1225 }1226 1227 if (VT.getVectorElementCount() == ElementCount::getScalable(1))1228 return LegalizeKind(TypeScalarizeScalableVector, EltVT);1229 1230 // Vectors with illegal element types are expanded.1231 EVT NVT = EVT::getVectorVT(Context, EltVT,1232 VT.getVectorElementCount().divideCoefficientBy(2));1233 return LegalizeKind(TypeSplitVector, NVT);1234}1235 1236static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT,1237 unsigned &NumIntermediates,1238 MVT &RegisterVT,1239 TargetLoweringBase *TLI) {1240 // Figure out the right, legal destination reg to copy into.1241 ElementCount EC = VT.getVectorElementCount();1242 MVT EltTy = VT.getVectorElementType();1243 1244 unsigned NumVectorRegs = 1;1245 1246 // Scalable vectors cannot be scalarized, so splitting or widening is1247 // required.1248 if (VT.isScalableVector() && !isPowerOf2_32(EC.getKnownMinValue()))1249 llvm_unreachable(1250 "Splitting or widening of non-power-of-2 MVTs is not implemented.");1251 1252 // FIXME: We don't support non-power-of-2-sized vectors for now.1253 // Ideally we could break down into LHS/RHS like LegalizeDAG does.1254 if (!isPowerOf2_32(EC.getKnownMinValue())) {1255 // Split EC to unit size (scalable property is preserved).1256 NumVectorRegs = EC.getKnownMinValue();1257 EC = ElementCount::getFixed(1);1258 }1259 1260 // Divide the input until we get to a supported size. This will1261 // always end up with an EC that represent a scalar or a scalable1262 // scalar.1263 while (EC.getKnownMinValue() > 1 &&1264 !TLI->isTypeLegal(MVT::getVectorVT(EltTy, EC))) {1265 EC = EC.divideCoefficientBy(2);1266 NumVectorRegs <<= 1;1267 }1268 1269 NumIntermediates = NumVectorRegs;1270 1271 MVT NewVT = MVT::getVectorVT(EltTy, EC);1272 if (!TLI->isTypeLegal(NewVT))1273 NewVT = EltTy;1274 IntermediateVT = NewVT;1275 1276 unsigned LaneSizeInBits = NewVT.getScalarSizeInBits();1277 1278 // Convert sizes such as i33 to i64.1279 LaneSizeInBits = llvm::bit_ceil(LaneSizeInBits);1280 1281 MVT DestVT = TLI->getRegisterType(NewVT);1282 RegisterVT = DestVT;1283 if (EVT(DestVT).bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16.1284 return NumVectorRegs * (LaneSizeInBits / DestVT.getScalarSizeInBits());1285 1286 // Otherwise, promotion or legal types use the same number of registers as1287 // the vector decimated to the appropriate level.1288 return NumVectorRegs;1289}1290 1291/// isLegalRC - Return true if the value types that can be represented by the1292/// specified register class are all legal.1293bool TargetLoweringBase::isLegalRC(const TargetRegisterInfo &TRI,1294 const TargetRegisterClass &RC) const {1295 for (const auto *I = TRI.legalclasstypes_begin(RC); *I != MVT::Other; ++I)1296 if (isTypeLegal(*I))1297 return true;1298 return false;1299}1300 1301/// Replace/modify any TargetFrameIndex operands with a targte-dependent1302/// sequence of memory operands that is recognized by PrologEpilogInserter.1303MachineBasicBlock *1304TargetLoweringBase::emitPatchPoint(MachineInstr &InitialMI,1305 MachineBasicBlock *MBB) const {1306 MachineInstr *MI = &InitialMI;1307 MachineFunction &MF = *MI->getMF();1308 MachineFrameInfo &MFI = MF.getFrameInfo();1309 1310 // We're handling multiple types of operands here:1311 // PATCHPOINT MetaArgs - live-in, read only, direct1312 // STATEPOINT Deopt Spill - live-through, read only, indirect1313 // STATEPOINT Deopt Alloca - live-through, read only, direct1314 // (We're currently conservative and mark the deopt slots read/write in1315 // practice.)1316 // STATEPOINT GC Spill - live-through, read/write, indirect1317 // STATEPOINT GC Alloca - live-through, read/write, direct1318 // The live-in vs live-through is handled already (the live through ones are1319 // all stack slots), but we need to handle the different type of stackmap1320 // operands and memory effects here.1321 1322 if (llvm::none_of(MI->operands(),1323 [](MachineOperand &Operand) { return Operand.isFI(); }))1324 return MBB;1325 1326 MachineInstrBuilder MIB = BuildMI(MF, MI->getDebugLoc(), MI->getDesc());1327 1328 // Inherit previous memory operands.1329 MIB.cloneMemRefs(*MI);1330 1331 for (unsigned i = 0; i < MI->getNumOperands(); ++i) {1332 MachineOperand &MO = MI->getOperand(i);1333 if (!MO.isFI()) {1334 // Index of Def operand this Use it tied to.1335 // Since Defs are coming before Uses, if Use is tied, then1336 // index of Def must be smaller that index of that Use.1337 // Also, Defs preserve their position in new MI.1338 unsigned TiedTo = i;1339 if (MO.isReg() && MO.isTied())1340 TiedTo = MI->findTiedOperandIdx(i);1341 MIB.add(MO);1342 if (TiedTo < i)1343 MIB->tieOperands(TiedTo, MIB->getNumOperands() - 1);1344 continue;1345 }1346 1347 // foldMemoryOperand builds a new MI after replacing a single FI operand1348 // with the canonical set of five x86 addressing-mode operands.1349 int FI = MO.getIndex();1350 1351 // Add frame index operands recognized by stackmaps.cpp1352 if (MFI.isStatepointSpillSlotObjectIndex(FI)) {1353 // indirect-mem-ref tag, size, #FI, offset.1354 // Used for spills inserted by StatepointLowering. This codepath is not1355 // used for patchpoints/stackmaps at all, for these spilling is done via1356 // foldMemoryOperand callback only.1357 assert(MI->getOpcode() == TargetOpcode::STATEPOINT && "sanity");1358 MIB.addImm(StackMaps::IndirectMemRefOp);1359 MIB.addImm(MFI.getObjectSize(FI));1360 MIB.add(MO);1361 MIB.addImm(0);1362 } else {1363 // direct-mem-ref tag, #FI, offset.1364 // Used by patchpoint, and direct alloca arguments to statepoints1365 MIB.addImm(StackMaps::DirectMemRefOp);1366 MIB.add(MO);1367 MIB.addImm(0);1368 }1369 1370 assert(MIB->mayLoad() && "Folded a stackmap use to a non-load!");1371 1372 // Add a new memory operand for this FI.1373 assert(MFI.getObjectOffset(FI) != -1);1374 1375 // Note: STATEPOINT MMOs are added during SelectionDAG. STACKMAP, and1376 // PATCHPOINT should be updated to do the same. (TODO)1377 if (MI->getOpcode() != TargetOpcode::STATEPOINT) {1378 auto Flags = MachineMemOperand::MOLoad;1379 MachineMemOperand *MMO = MF.getMachineMemOperand(1380 MachinePointerInfo::getFixedStack(MF, FI), Flags,1381 MF.getDataLayout().getPointerSize(), MFI.getObjectAlign(FI));1382 MIB->addMemOperand(MF, MMO);1383 }1384 }1385 MBB->insert(MachineBasicBlock::iterator(MI), MIB);1386 MI->eraseFromParent();1387 return MBB;1388}1389 1390/// findRepresentativeClass - Return the largest legal super-reg register class1391/// of the register class for the specified type and its associated "cost".1392// This function is in TargetLowering because it uses RegClassForVT which would1393// need to be moved to TargetRegisterInfo and would necessitate moving1394// isTypeLegal over as well - a massive change that would just require1395// TargetLowering having a TargetRegisterInfo class member that it would use.1396std::pair<const TargetRegisterClass *, uint8_t>1397TargetLoweringBase::findRepresentativeClass(const TargetRegisterInfo *TRI,1398 MVT VT) const {1399 const TargetRegisterClass *RC = RegClassForVT[VT.SimpleTy];1400 if (!RC)1401 return std::make_pair(RC, 0);1402 1403 // Compute the set of all super-register classes.1404 BitVector SuperRegRC(TRI->getNumRegClasses());1405 for (SuperRegClassIterator RCI(RC, TRI); RCI.isValid(); ++RCI)1406 SuperRegRC.setBitsInMask(RCI.getMask());1407 1408 // Find the first legal register class with the largest spill size.1409 const TargetRegisterClass *BestRC = RC;1410 for (unsigned i : SuperRegRC.set_bits()) {1411 const TargetRegisterClass *SuperRC = TRI->getRegClass(i);1412 // We want the largest possible spill size.1413 if (TRI->getSpillSize(*SuperRC) <= TRI->getSpillSize(*BestRC))1414 continue;1415 if (!isLegalRC(*TRI, *SuperRC))1416 continue;1417 BestRC = SuperRC;1418 }1419 return std::make_pair(BestRC, 1);1420}1421 1422/// computeRegisterProperties - Once all of the register classes are added,1423/// this allows us to compute derived properties we expose.1424void TargetLoweringBase::computeRegisterProperties(1425 const TargetRegisterInfo *TRI) {1426 // Everything defaults to needing one register.1427 for (unsigned i = 0; i != MVT::VALUETYPE_SIZE; ++i) {1428 NumRegistersForVT[i] = 1;1429 RegisterTypeForVT[i] = TransformToType[i] = (MVT::SimpleValueType)i;1430 }1431 // ...except isVoid, which doesn't need any registers.1432 NumRegistersForVT[MVT::isVoid] = 0;1433 1434 // Find the largest integer register class.1435 unsigned LargestIntReg = MVT::LAST_INTEGER_VALUETYPE;1436 for (; RegClassForVT[LargestIntReg] == nullptr; --LargestIntReg)1437 assert(LargestIntReg != MVT::i1 && "No integer registers defined!");1438 1439 // Every integer value type larger than this largest register takes twice as1440 // many registers to represent as the previous ValueType.1441 for (unsigned ExpandedReg = LargestIntReg + 1;1442 ExpandedReg <= MVT::LAST_INTEGER_VALUETYPE; ++ExpandedReg) {1443 NumRegistersForVT[ExpandedReg] = 2*NumRegistersForVT[ExpandedReg-1];1444 RegisterTypeForVT[ExpandedReg] = (MVT::SimpleValueType)LargestIntReg;1445 TransformToType[ExpandedReg] = (MVT::SimpleValueType)(ExpandedReg - 1);1446 ValueTypeActions.setTypeAction((MVT::SimpleValueType)ExpandedReg,1447 TypeExpandInteger);1448 }1449 1450 // Inspect all of the ValueType's smaller than the largest integer1451 // register to see which ones need promotion.1452 unsigned LegalIntReg = LargestIntReg;1453 for (unsigned IntReg = LargestIntReg - 1;1454 IntReg >= (unsigned)MVT::i1; --IntReg) {1455 MVT IVT = (MVT::SimpleValueType)IntReg;1456 if (isTypeLegal(IVT)) {1457 LegalIntReg = IntReg;1458 } else {1459 RegisterTypeForVT[IntReg] = TransformToType[IntReg] =1460 (MVT::SimpleValueType)LegalIntReg;1461 ValueTypeActions.setTypeAction(IVT, TypePromoteInteger);1462 }1463 }1464 1465 // ppcf128 type is really two f64's.1466 if (!isTypeLegal(MVT::ppcf128)) {1467 if (isTypeLegal(MVT::f64)) {1468 NumRegistersForVT[MVT::ppcf128] = 2*NumRegistersForVT[MVT::f64];1469 RegisterTypeForVT[MVT::ppcf128] = MVT::f64;1470 TransformToType[MVT::ppcf128] = MVT::f64;1471 ValueTypeActions.setTypeAction(MVT::ppcf128, TypeExpandFloat);1472 } else {1473 NumRegistersForVT[MVT::ppcf128] = NumRegistersForVT[MVT::i128];1474 RegisterTypeForVT[MVT::ppcf128] = RegisterTypeForVT[MVT::i128];1475 TransformToType[MVT::ppcf128] = MVT::i128;1476 ValueTypeActions.setTypeAction(MVT::ppcf128, TypeSoftenFloat);1477 }1478 }1479 1480 // Decide how to handle f128. If the target does not have native f128 support,1481 // expand it to i128 and we will be generating soft float library calls.1482 if (!isTypeLegal(MVT::f128)) {1483 NumRegistersForVT[MVT::f128] = NumRegistersForVT[MVT::i128];1484 RegisterTypeForVT[MVT::f128] = RegisterTypeForVT[MVT::i128];1485 TransformToType[MVT::f128] = MVT::i128;1486 ValueTypeActions.setTypeAction(MVT::f128, TypeSoftenFloat);1487 }1488 1489 // Decide how to handle f80. If the target does not have native f80 support,1490 // expand it to i96 and we will be generating soft float library calls.1491 if (!isTypeLegal(MVT::f80)) {1492 NumRegistersForVT[MVT::f80] = 3*NumRegistersForVT[MVT::i32];1493 RegisterTypeForVT[MVT::f80] = RegisterTypeForVT[MVT::i32];1494 TransformToType[MVT::f80] = MVT::i32;1495 ValueTypeActions.setTypeAction(MVT::f80, TypeSoftenFloat);1496 }1497 1498 // Decide how to handle f64. If the target does not have native f64 support,1499 // expand it to i64 and we will be generating soft float library calls.1500 if (!isTypeLegal(MVT::f64)) {1501 NumRegistersForVT[MVT::f64] = NumRegistersForVT[MVT::i64];1502 RegisterTypeForVT[MVT::f64] = RegisterTypeForVT[MVT::i64];1503 TransformToType[MVT::f64] = MVT::i64;1504 ValueTypeActions.setTypeAction(MVT::f64, TypeSoftenFloat);1505 }1506 1507 // Decide how to handle f32. If the target does not have native f32 support,1508 // expand it to i32 and we will be generating soft float library calls.1509 if (!isTypeLegal(MVT::f32)) {1510 NumRegistersForVT[MVT::f32] = NumRegistersForVT[MVT::i32];1511 RegisterTypeForVT[MVT::f32] = RegisterTypeForVT[MVT::i32];1512 TransformToType[MVT::f32] = MVT::i32;1513 ValueTypeActions.setTypeAction(MVT::f32, TypeSoftenFloat);1514 }1515 1516 // Decide how to handle f16. If the target does not have native f16 support,1517 // promote it to f32, because there are no f16 library calls (except for1518 // conversions).1519 if (!isTypeLegal(MVT::f16)) {1520 // Allow targets to control how we legalize half.1521 bool SoftPromoteHalfType = softPromoteHalfType();1522 bool UseFPRegsForHalfType = !SoftPromoteHalfType || useFPRegsForHalfType();1523 1524 if (!UseFPRegsForHalfType) {1525 NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::i16];1526 RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::i16];1527 } else {1528 NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::f32];1529 RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::f32];1530 }1531 TransformToType[MVT::f16] = MVT::f32;1532 if (SoftPromoteHalfType) {1533 ValueTypeActions.setTypeAction(MVT::f16, TypeSoftPromoteHalf);1534 } else {1535 ValueTypeActions.setTypeAction(MVT::f16, TypePromoteFloat);1536 }1537 }1538 1539 // Decide how to handle bf16. If the target does not have native bf16 support,1540 // promote it to f32, because there are no bf16 library calls (except for1541 // converting from f32 to bf16).1542 if (!isTypeLegal(MVT::bf16)) {1543 NumRegistersForVT[MVT::bf16] = NumRegistersForVT[MVT::f32];1544 RegisterTypeForVT[MVT::bf16] = RegisterTypeForVT[MVT::f32];1545 TransformToType[MVT::bf16] = MVT::f32;1546 ValueTypeActions.setTypeAction(MVT::bf16, TypeSoftPromoteHalf);1547 }1548 1549 // Loop over all of the vector value types to see which need transformations.1550 for (unsigned i = MVT::FIRST_VECTOR_VALUETYPE;1551 i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++i) {1552 MVT VT = (MVT::SimpleValueType) i;1553 if (isTypeLegal(VT))1554 continue;1555 1556 MVT EltVT = VT.getVectorElementType();1557 ElementCount EC = VT.getVectorElementCount();1558 bool IsLegalWiderType = false;1559 bool IsScalable = VT.isScalableVector();1560 LegalizeTypeAction PreferredAction = getPreferredVectorAction(VT);1561 switch (PreferredAction) {1562 case TypePromoteInteger: {1563 MVT::SimpleValueType EndVT = IsScalable ?1564 MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE :1565 MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE;1566 // Try to promote the elements of integer vectors. If no legal1567 // promotion was found, fall through to the widen-vector method.1568 for (unsigned nVT = i + 1;1569 (MVT::SimpleValueType)nVT <= EndVT; ++nVT) {1570 MVT SVT = (MVT::SimpleValueType) nVT;1571 // Promote vectors of integers to vectors with the same number1572 // of elements, with a wider element type.1573 if (SVT.getScalarSizeInBits() > EltVT.getFixedSizeInBits() &&1574 SVT.getVectorElementCount() == EC && isTypeLegal(SVT)) {1575 TransformToType[i] = SVT;1576 RegisterTypeForVT[i] = SVT;1577 NumRegistersForVT[i] = 1;1578 ValueTypeActions.setTypeAction(VT, TypePromoteInteger);1579 IsLegalWiderType = true;1580 break;1581 }1582 }1583 if (IsLegalWiderType)1584 break;1585 [[fallthrough]];1586 }1587 1588 case TypeWidenVector:1589 if (isPowerOf2_32(EC.getKnownMinValue())) {1590 // Try to widen the vector.1591 for (unsigned nVT = i + 1; nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) {1592 MVT SVT = (MVT::SimpleValueType) nVT;1593 if (SVT.getVectorElementType() == EltVT &&1594 SVT.isScalableVector() == IsScalable &&1595 SVT.getVectorElementCount().getKnownMinValue() >1596 EC.getKnownMinValue() &&1597 isTypeLegal(SVT)) {1598 TransformToType[i] = SVT;1599 RegisterTypeForVT[i] = SVT;1600 NumRegistersForVT[i] = 1;1601 ValueTypeActions.setTypeAction(VT, TypeWidenVector);1602 IsLegalWiderType = true;1603 break;1604 }1605 }1606 if (IsLegalWiderType)1607 break;1608 } else {1609 // Only widen to the next power of 2 to keep consistency with EVT.1610 MVT NVT = VT.getPow2VectorType();1611 if (isTypeLegal(NVT)) {1612 TransformToType[i] = NVT;1613 ValueTypeActions.setTypeAction(VT, TypeWidenVector);1614 RegisterTypeForVT[i] = NVT;1615 NumRegistersForVT[i] = 1;1616 break;1617 }1618 }1619 [[fallthrough]];1620 1621 case TypeSplitVector:1622 case TypeScalarizeVector: {1623 MVT IntermediateVT;1624 MVT RegisterVT;1625 unsigned NumIntermediates;1626 unsigned NumRegisters = getVectorTypeBreakdownMVT(VT, IntermediateVT,1627 NumIntermediates, RegisterVT, this);1628 NumRegistersForVT[i] = NumRegisters;1629 assert(NumRegistersForVT[i] == NumRegisters &&1630 "NumRegistersForVT size cannot represent NumRegisters!");1631 RegisterTypeForVT[i] = RegisterVT;1632 1633 MVT NVT = VT.getPow2VectorType();1634 if (NVT == VT) {1635 // Type is already a power of 2. The default action is to split.1636 TransformToType[i] = MVT::Other;1637 if (PreferredAction == TypeScalarizeVector)1638 ValueTypeActions.setTypeAction(VT, TypeScalarizeVector);1639 else if (PreferredAction == TypeSplitVector)1640 ValueTypeActions.setTypeAction(VT, TypeSplitVector);1641 else if (EC.getKnownMinValue() > 1)1642 ValueTypeActions.setTypeAction(VT, TypeSplitVector);1643 else1644 ValueTypeActions.setTypeAction(VT, EC.isScalable()1645 ? TypeScalarizeScalableVector1646 : TypeScalarizeVector);1647 } else {1648 TransformToType[i] = NVT;1649 ValueTypeActions.setTypeAction(VT, TypeWidenVector);1650 }1651 break;1652 }1653 default:1654 llvm_unreachable("Unknown vector legalization action!");1655 }1656 }1657 1658 // Determine the 'representative' register class for each value type.1659 // An representative register class is the largest (meaning one which is1660 // not a sub-register class / subreg register class) legal register class for1661 // a group of value types. For example, on i386, i8, i16, and i321662 // representative would be GR32; while on x86_64 it's GR64.1663 for (unsigned i = 0; i != MVT::VALUETYPE_SIZE; ++i) {1664 const TargetRegisterClass* RRC;1665 uint8_t Cost;1666 std::tie(RRC, Cost) = findRepresentativeClass(TRI, (MVT::SimpleValueType)i);1667 RepRegClassForVT[i] = RRC;1668 RepRegClassCostForVT[i] = Cost;1669 }1670}1671 1672EVT TargetLoweringBase::getSetCCResultType(const DataLayout &DL, LLVMContext &,1673 EVT VT) const {1674 assert(!VT.isVector() && "No default SetCC type for vectors!");1675 return getPointerTy(DL).SimpleTy;1676}1677 1678MVT::SimpleValueType TargetLoweringBase::getCmpLibcallReturnType() const {1679 return MVT::i32; // return the default value1680}1681 1682/// getVectorTypeBreakdown - Vector types are broken down into some number of1683/// legal first class types. For example, MVT::v8f32 maps to 2 MVT::v4f321684/// with Altivec or SSE1, or 8 promoted MVT::f64 values with the X86 FP stack.1685/// Similarly, MVT::v2i64 turns into 4 MVT::i32 values with both PPC and X86.1686///1687/// This method returns the number of registers needed, and the VT for each1688/// register. It also returns the VT and quantity of the intermediate values1689/// before they are promoted/expanded.1690unsigned TargetLoweringBase::getVectorTypeBreakdown(LLVMContext &Context,1691 EVT VT, EVT &IntermediateVT,1692 unsigned &NumIntermediates,1693 MVT &RegisterVT) const {1694 ElementCount EltCnt = VT.getVectorElementCount();1695 1696 // If there is a wider vector type with the same element type as this one,1697 // or a promoted vector type that has the same number of elements which1698 // are wider, then we should convert to that legal vector type.1699 // This handles things like <2 x float> -> <4 x float> and1700 // <4 x i1> -> <4 x i32>.1701 LegalizeTypeAction TA = getTypeAction(Context, VT);1702 if (!EltCnt.isScalar() &&1703 (TA == TypeWidenVector || TA == TypePromoteInteger)) {1704 EVT RegisterEVT = getTypeToTransformTo(Context, VT);1705 if (isTypeLegal(RegisterEVT)) {1706 IntermediateVT = RegisterEVT;1707 RegisterVT = RegisterEVT.getSimpleVT();1708 NumIntermediates = 1;1709 return 1;1710 }1711 }1712 1713 // Figure out the right, legal destination reg to copy into.1714 EVT EltTy = VT.getVectorElementType();1715 1716 unsigned NumVectorRegs = 1;1717 1718 // Scalable vectors cannot be scalarized, so handle the legalisation of the1719 // types like done elsewhere in SelectionDAG.1720 if (EltCnt.isScalable()) {1721 LegalizeKind LK;1722 EVT PartVT = VT;1723 do {1724 // Iterate until we've found a legal (part) type to hold VT.1725 LK = getTypeConversion(Context, PartVT);1726 PartVT = LK.second;1727 } while (LK.first != TypeLegal);1728 1729 if (!PartVT.isVector()) {1730 report_fatal_error(1731 "Don't know how to legalize this scalable vector type");1732 }1733 1734 NumIntermediates =1735 divideCeil(VT.getVectorElementCount().getKnownMinValue(),1736 PartVT.getVectorElementCount().getKnownMinValue());1737 IntermediateVT = PartVT;1738 RegisterVT = getRegisterType(Context, IntermediateVT);1739 return NumIntermediates;1740 }1741 1742 // FIXME: We don't support non-power-of-2-sized vectors for now. Ideally1743 // we could break down into LHS/RHS like LegalizeDAG does.1744 if (!isPowerOf2_32(EltCnt.getKnownMinValue())) {1745 NumVectorRegs = EltCnt.getKnownMinValue();1746 EltCnt = ElementCount::getFixed(1);1747 }1748 1749 // Divide the input until we get to a supported size. This will always1750 // end with a scalar if the target doesn't support vectors.1751 while (EltCnt.getKnownMinValue() > 1 &&1752 !isTypeLegal(EVT::getVectorVT(Context, EltTy, EltCnt))) {1753 EltCnt = EltCnt.divideCoefficientBy(2);1754 NumVectorRegs <<= 1;1755 }1756 1757 NumIntermediates = NumVectorRegs;1758 1759 EVT NewVT = EVT::getVectorVT(Context, EltTy, EltCnt);1760 if (!isTypeLegal(NewVT))1761 NewVT = EltTy;1762 IntermediateVT = NewVT;1763 1764 MVT DestVT = getRegisterType(Context, NewVT);1765 RegisterVT = DestVT;1766 1767 if (EVT(DestVT).bitsLT(NewVT)) { // Value is expanded, e.g. i64 -> i16.1768 TypeSize NewVTSize = NewVT.getSizeInBits();1769 // Convert sizes such as i33 to i64.1770 if (!llvm::has_single_bit<uint32_t>(NewVTSize.getKnownMinValue()))1771 NewVTSize = NewVTSize.coefficientNextPowerOf2();1772 return NumVectorRegs*(NewVTSize/DestVT.getSizeInBits());1773 }1774 1775 // Otherwise, promotion or legal types use the same number of registers as1776 // the vector decimated to the appropriate level.1777 return NumVectorRegs;1778}1779 1780bool TargetLoweringBase::isSuitableForJumpTable(const SwitchInst *SI,1781 uint64_t NumCases,1782 uint64_t Range,1783 ProfileSummaryInfo *PSI,1784 BlockFrequencyInfo *BFI) const {1785 // FIXME: This function check the maximum table size and density, but the1786 // minimum size is not checked. It would be nice if the minimum size is1787 // also combined within this function. Currently, the minimum size check is1788 // performed in findJumpTable() in SelectionDAGBuiler and1789 // getEstimatedNumberOfCaseClusters() in BasicTTIImpl.1790 const bool OptForSize =1791 llvm::shouldOptimizeForSize(SI->getParent(), PSI, BFI);1792 const unsigned MinDensity = getMinimumJumpTableDensity(OptForSize);1793 const unsigned MaxJumpTableSize = getMaximumJumpTableSize();1794 1795 // Check whether the number of cases is small enough and1796 // the range is dense enough for a jump table.1797 return (OptForSize || Range <= MaxJumpTableSize) &&1798 (NumCases * 100 >= Range * MinDensity);1799}1800 1801MVT TargetLoweringBase::getPreferredSwitchConditionType(LLVMContext &Context,1802 EVT ConditionVT) const {1803 return getRegisterType(Context, ConditionVT);1804}1805 1806/// Get the EVTs and ArgFlags collections that represent the legalized return1807/// type of the given function. This does not require a DAG or a return value,1808/// and is suitable for use before any DAGs for the function are constructed.1809/// TODO: Move this out of TargetLowering.cpp.1810void llvm::GetReturnInfo(CallingConv::ID CC, Type *ReturnType,1811 AttributeList attr,1812 SmallVectorImpl<ISD::OutputArg> &Outs,1813 const TargetLowering &TLI, const DataLayout &DL) {1814 SmallVector<Type *, 4> Types;1815 ComputeValueTypes(DL, ReturnType, Types);1816 unsigned NumValues = Types.size();1817 if (NumValues == 0) return;1818 1819 for (Type *Ty : Types) {1820 EVT VT = TLI.getValueType(DL, Ty);1821 ISD::NodeType ExtendKind = ISD::ANY_EXTEND;1822 1823 if (attr.hasRetAttr(Attribute::SExt))1824 ExtendKind = ISD::SIGN_EXTEND;1825 else if (attr.hasRetAttr(Attribute::ZExt))1826 ExtendKind = ISD::ZERO_EXTEND;1827 1828 if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger())1829 VT = TLI.getTypeForExtReturn(ReturnType->getContext(), VT, ExtendKind);1830 1831 unsigned NumParts =1832 TLI.getNumRegistersForCallingConv(ReturnType->getContext(), CC, VT);1833 MVT PartVT =1834 TLI.getRegisterTypeForCallingConv(ReturnType->getContext(), CC, VT);1835 1836 // 'inreg' on function refers to return value1837 ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy();1838 if (attr.hasRetAttr(Attribute::InReg))1839 Flags.setInReg();1840 1841 // Propagate extension type if any1842 if (attr.hasRetAttr(Attribute::SExt))1843 Flags.setSExt();1844 else if (attr.hasRetAttr(Attribute::ZExt))1845 Flags.setZExt();1846 1847 for (unsigned i = 0; i < NumParts; ++i)1848 Outs.push_back(ISD::OutputArg(Flags, PartVT, VT, Ty, 0, 0));1849 }1850}1851 1852Align TargetLoweringBase::getByValTypeAlignment(Type *Ty,1853 const DataLayout &DL) const {1854 return DL.getABITypeAlign(Ty);1855}1856 1857bool TargetLoweringBase::allowsMemoryAccessForAlignment(1858 LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace,1859 Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const {1860 // Check if the specified alignment is sufficient based on the data layout.1861 // TODO: While using the data layout works in practice, a better solution1862 // would be to implement this check directly (make this a virtual function).1863 // For example, the ABI alignment may change based on software platform while1864 // this function should only be affected by hardware implementation.1865 Type *Ty = VT.getTypeForEVT(Context);1866 if (VT.isZeroSized() || Alignment >= DL.getABITypeAlign(Ty)) {1867 // Assume that an access that meets the ABI-specified alignment is fast.1868 if (Fast != nullptr)1869 *Fast = 1;1870 return true;1871 }1872 1873 // This is a misaligned access.1874 return allowsMisalignedMemoryAccesses(VT, AddrSpace, Alignment, Flags, Fast);1875}1876 1877bool TargetLoweringBase::allowsMemoryAccessForAlignment(1878 LLVMContext &Context, const DataLayout &DL, EVT VT,1879 const MachineMemOperand &MMO, unsigned *Fast) const {1880 return allowsMemoryAccessForAlignment(Context, DL, VT, MMO.getAddrSpace(),1881 MMO.getAlign(), MMO.getFlags(), Fast);1882}1883 1884bool TargetLoweringBase::allowsMemoryAccess(LLVMContext &Context,1885 const DataLayout &DL, EVT VT,1886 unsigned AddrSpace, Align Alignment,1887 MachineMemOperand::Flags Flags,1888 unsigned *Fast) const {1889 return allowsMemoryAccessForAlignment(Context, DL, VT, AddrSpace, Alignment,1890 Flags, Fast);1891}1892 1893bool TargetLoweringBase::allowsMemoryAccess(LLVMContext &Context,1894 const DataLayout &DL, EVT VT,1895 const MachineMemOperand &MMO,1896 unsigned *Fast) const {1897 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(), MMO.getAlign(),1898 MMO.getFlags(), Fast);1899}1900 1901bool TargetLoweringBase::allowsMemoryAccess(LLVMContext &Context,1902 const DataLayout &DL, LLT Ty,1903 const MachineMemOperand &MMO,1904 unsigned *Fast) const {1905 EVT VT = getApproximateEVTForLLT(Ty, Context);1906 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(), MMO.getAlign(),1907 MMO.getFlags(), Fast);1908}1909 1910//===----------------------------------------------------------------------===//1911// TargetTransformInfo Helpers1912//===----------------------------------------------------------------------===//1913 1914int TargetLoweringBase::InstructionOpcodeToISD(unsigned Opcode) const {1915 enum InstructionOpcodes {1916#define HANDLE_INST(NUM, OPCODE, CLASS) OPCODE = NUM,1917#define LAST_OTHER_INST(NUM) InstructionOpcodesCount = NUM1918#include "llvm/IR/Instruction.def"1919 };1920 switch (static_cast<InstructionOpcodes>(Opcode)) {1921 case Ret: return 0;1922 case Br: return 0;1923 case Switch: return 0;1924 case IndirectBr: return 0;1925 case Invoke: return 0;1926 case CallBr: return 0;1927 case Resume: return 0;1928 case Unreachable: return 0;1929 case CleanupRet: return 0;1930 case CatchRet: return 0;1931 case CatchPad: return 0;1932 case CatchSwitch: return 0;1933 case CleanupPad: return 0;1934 case FNeg: return ISD::FNEG;1935 case Add: return ISD::ADD;1936 case FAdd: return ISD::FADD;1937 case Sub: return ISD::SUB;1938 case FSub: return ISD::FSUB;1939 case Mul: return ISD::MUL;1940 case FMul: return ISD::FMUL;1941 case UDiv: return ISD::UDIV;1942 case SDiv: return ISD::SDIV;1943 case FDiv: return ISD::FDIV;1944 case URem: return ISD::UREM;1945 case SRem: return ISD::SREM;1946 case FRem: return ISD::FREM;1947 case Shl: return ISD::SHL;1948 case LShr: return ISD::SRL;1949 case AShr: return ISD::SRA;1950 case And: return ISD::AND;1951 case Or: return ISD::OR;1952 case Xor: return ISD::XOR;1953 case Alloca: return 0;1954 case Load: return ISD::LOAD;1955 case Store: return ISD::STORE;1956 case GetElementPtr: return 0;1957 case Fence: return 0;1958 case AtomicCmpXchg: return 0;1959 case AtomicRMW: return 0;1960 case Trunc: return ISD::TRUNCATE;1961 case ZExt: return ISD::ZERO_EXTEND;1962 case SExt: return ISD::SIGN_EXTEND;1963 case FPToUI: return ISD::FP_TO_UINT;1964 case FPToSI: return ISD::FP_TO_SINT;1965 case UIToFP: return ISD::UINT_TO_FP;1966 case SIToFP: return ISD::SINT_TO_FP;1967 case FPTrunc: return ISD::FP_ROUND;1968 case FPExt: return ISD::FP_EXTEND;1969 case PtrToAddr: return ISD::BITCAST;1970 case PtrToInt: return ISD::BITCAST;1971 case IntToPtr: return ISD::BITCAST;1972 case BitCast: return ISD::BITCAST;1973 case AddrSpaceCast: return ISD::ADDRSPACECAST;1974 case ICmp: return ISD::SETCC;1975 case FCmp: return ISD::SETCC;1976 case PHI: return 0;1977 case Call: return 0;1978 case Select: return ISD::SELECT;1979 case UserOp1: return 0;1980 case UserOp2: return 0;1981 case VAArg: return 0;1982 case ExtractElement: return ISD::EXTRACT_VECTOR_ELT;1983 case InsertElement: return ISD::INSERT_VECTOR_ELT;1984 case ShuffleVector: return ISD::VECTOR_SHUFFLE;1985 case ExtractValue: return ISD::MERGE_VALUES;1986 case InsertValue: return ISD::MERGE_VALUES;1987 case LandingPad: return 0;1988 case Freeze: return ISD::FREEZE;1989 }1990 1991 llvm_unreachable("Unknown instruction type encountered!");1992}1993 1994int TargetLoweringBase::IntrinsicIDToISD(Intrinsic::ID ID) const {1995 switch (ID) {1996 case Intrinsic::exp:1997 return ISD::FEXP;1998 case Intrinsic::exp2:1999 return ISD::FEXP2;2000 case Intrinsic::log:2001 return ISD::FLOG;2002 default:2003 return ISD::DELETED_NODE;2004 }2005}2006 2007Value *2008TargetLoweringBase::getDefaultSafeStackPointerLocation(IRBuilderBase &IRB,2009 bool UseTLS) const {2010 // compiler-rt provides a variable with a magic name. Targets that do not2011 // link with compiler-rt may also provide such a variable.2012 Module *M = IRB.GetInsertBlock()->getParent()->getParent();2013 const char *UnsafeStackPtrVar = "__safestack_unsafe_stack_ptr";2014 auto UnsafeStackPtr =2015 dyn_cast_or_null<GlobalVariable>(M->getNamedValue(UnsafeStackPtrVar));2016 2017 const DataLayout &DL = M->getDataLayout();2018 PointerType *StackPtrTy = DL.getAllocaPtrType(M->getContext());2019 2020 if (!UnsafeStackPtr) {2021 auto TLSModel = UseTLS ?2022 GlobalValue::InitialExecTLSModel :2023 GlobalValue::NotThreadLocal;2024 // The global variable is not defined yet, define it ourselves.2025 // We use the initial-exec TLS model because we do not support the2026 // variable living anywhere other than in the main executable.2027 UnsafeStackPtr = new GlobalVariable(2028 *M, StackPtrTy, false, GlobalValue::ExternalLinkage, nullptr,2029 UnsafeStackPtrVar, nullptr, TLSModel);2030 } else {2031 // The variable exists, check its type and attributes.2032 //2033 // FIXME: Move to IR verifier.2034 if (UnsafeStackPtr->getValueType() != StackPtrTy)2035 report_fatal_error(Twine(UnsafeStackPtrVar) + " must have void* type");2036 if (UseTLS != UnsafeStackPtr->isThreadLocal())2037 report_fatal_error(Twine(UnsafeStackPtrVar) + " must " +2038 (UseTLS ? "" : "not ") + "be thread-local");2039 }2040 return UnsafeStackPtr;2041}2042 2043Value *2044TargetLoweringBase::getSafeStackPointerLocation(IRBuilderBase &IRB) const {2045 // FIXME: Can this triple check be replaced with SAFESTACK_POINTER_ADDRESS2046 // being available?2047 if (!TM.getTargetTriple().isAndroid())2048 return getDefaultSafeStackPointerLocation(IRB, true);2049 2050 Module *M = IRB.GetInsertBlock()->getParent()->getParent();2051 auto *PtrTy = PointerType::getUnqual(M->getContext());2052 2053 const char *SafestackPointerAddressName =2054 getLibcallName(RTLIB::SAFESTACK_POINTER_ADDRESS);2055 if (!SafestackPointerAddressName) {2056 M->getContext().emitError(2057 "no libcall available for safestack pointer address");2058 return PoisonValue::get(PtrTy);2059 }2060 2061 // Android provides a libc function to retrieve the address of the current2062 // thread's unsafe stack pointer.2063 FunctionCallee Fn =2064 M->getOrInsertFunction(SafestackPointerAddressName, PtrTy);2065 return IRB.CreateCall(Fn);2066}2067 2068//===----------------------------------------------------------------------===//2069// Loop Strength Reduction hooks2070//===----------------------------------------------------------------------===//2071 2072/// isLegalAddressingMode - Return true if the addressing mode represented2073/// by AM is legal for this target, for a load/store of the specified type.2074bool TargetLoweringBase::isLegalAddressingMode(const DataLayout &DL,2075 const AddrMode &AM, Type *Ty,2076 unsigned AS, Instruction *I) const {2077 // The default implementation of this implements a conservative RISCy, r+r and2078 // r+i addr mode.2079 2080 // Scalable offsets not supported2081 if (AM.ScalableOffset)2082 return false;2083 2084 // Allows a sign-extended 16-bit immediate field.2085 if (AM.BaseOffs <= -(1LL << 16) || AM.BaseOffs >= (1LL << 16)-1)2086 return false;2087 2088 // No global is ever allowed as a base.2089 if (AM.BaseGV)2090 return false;2091 2092 // Only support r+r,2093 switch (AM.Scale) {2094 case 0: // "r+i" or just "i", depending on HasBaseReg.2095 break;2096 case 1:2097 if (AM.HasBaseReg && AM.BaseOffs) // "r+r+i" is not allowed.2098 return false;2099 // Otherwise we have r+r or r+i.2100 break;2101 case 2:2102 if (AM.HasBaseReg || AM.BaseOffs) // 2*r+r or 2*r+i is not allowed.2103 return false;2104 // Allow 2*r as r+r.2105 break;2106 default: // Don't allow n * r2107 return false;2108 }2109 2110 return true;2111}2112 2113//===----------------------------------------------------------------------===//2114// Stack Protector2115//===----------------------------------------------------------------------===//2116 2117// For OpenBSD return its special guard variable. Otherwise return nullptr,2118// so that SelectionDAG handle SSP.2119Value *TargetLoweringBase::getIRStackGuard(IRBuilderBase &IRB) const {2120 RTLIB::LibcallImpl GuardLocalImpl = getLibcallImpl(RTLIB::STACK_CHECK_GUARD);2121 if (GuardLocalImpl != RTLIB::impl___guard_local)2122 return nullptr;2123 2124 Module &M = *IRB.GetInsertBlock()->getParent()->getParent();2125 const DataLayout &DL = M.getDataLayout();2126 PointerType *PtrTy =2127 PointerType::get(M.getContext(), DL.getDefaultGlobalsAddressSpace());2128 GlobalVariable *G =2129 M.getOrInsertGlobal(getLibcallImplName(GuardLocalImpl), PtrTy);2130 G->setVisibility(GlobalValue::HiddenVisibility);2131 return G;2132}2133 2134// Currently only support "standard" __stack_chk_guard.2135// TODO: add LOAD_STACK_GUARD support.2136void TargetLoweringBase::insertSSPDeclarations(Module &M) const {2137 RTLIB::LibcallImpl StackGuardImpl = getLibcallImpl(RTLIB::STACK_CHECK_GUARD);2138 if (StackGuardImpl == RTLIB::Unsupported)2139 return;2140 2141 StringRef StackGuardVarName = getLibcallImplName(StackGuardImpl);2142 M.getOrInsertGlobal(2143 StackGuardVarName, PointerType::getUnqual(M.getContext()), [=, &M]() {2144 auto *GV = new GlobalVariable(M, PointerType::getUnqual(M.getContext()),2145 false, GlobalVariable::ExternalLinkage,2146 nullptr, StackGuardVarName);2147 2148 // FreeBSD has "__stack_chk_guard" defined externally on libc.so2149 if (M.getDirectAccessExternalData() &&2150 !TM.getTargetTriple().isOSCygMing() &&2151 !(TM.getTargetTriple().isPPC64() &&2152 TM.getTargetTriple().isOSFreeBSD()) &&2153 (!TM.getTargetTriple().isOSDarwin() ||2154 TM.getRelocationModel() == Reloc::Static))2155 GV->setDSOLocal(true);2156 2157 return GV;2158 });2159}2160 2161// Currently only support "standard" __stack_chk_guard.2162// TODO: add LOAD_STACK_GUARD support.2163Value *TargetLoweringBase::getSDagStackGuard(const Module &M) const {2164 RTLIB::LibcallImpl GuardVarImpl = getLibcallImpl(RTLIB::STACK_CHECK_GUARD);2165 if (GuardVarImpl == RTLIB::Unsupported)2166 return nullptr;2167 return M.getNamedValue(getLibcallImplName(GuardVarImpl));2168}2169 2170Function *TargetLoweringBase::getSSPStackGuardCheck(const Module &M) const {2171 // MSVC CRT has a function to validate security cookie.2172 RTLIB::LibcallImpl SecurityCheckCookieLibcall =2173 getLibcallImpl(RTLIB::SECURITY_CHECK_COOKIE);2174 if (SecurityCheckCookieLibcall != RTLIB::Unsupported)2175 return M.getFunction(getLibcallImplName(SecurityCheckCookieLibcall));2176 return nullptr;2177}2178 2179unsigned TargetLoweringBase::getMinimumJumpTableEntries() const {2180 return MinimumJumpTableEntries;2181}2182 2183void TargetLoweringBase::setMinimumJumpTableEntries(unsigned Val) {2184 MinimumJumpTableEntries = Val;2185}2186 2187unsigned TargetLoweringBase::getMinimumJumpTableDensity(bool OptForSize) const {2188 return OptForSize ? OptsizeJumpTableDensity : JumpTableDensity;2189}2190 2191unsigned TargetLoweringBase::getMaximumJumpTableSize() const {2192 return MaximumJumpTableSize;2193}2194 2195void TargetLoweringBase::setMaximumJumpTableSize(unsigned Val) {2196 MaximumJumpTableSize = Val;2197}2198 2199bool TargetLoweringBase::isJumpTableRelative() const {2200 return getTargetMachine().isPositionIndependent();2201}2202 2203unsigned TargetLoweringBase::getMinimumBitTestCmps() const {2204 return MinimumBitTestCmps;2205}2206 2207void TargetLoweringBase::setMinimumBitTestCmps(unsigned Val) {2208 MinimumBitTestCmps = Val;2209}2210 2211Align TargetLoweringBase::getPrefLoopAlignment(MachineLoop *ML) const {2212 if (TM.Options.LoopAlignment)2213 return Align(TM.Options.LoopAlignment);2214 return PrefLoopAlignment;2215}2216 2217unsigned TargetLoweringBase::getMaxPermittedBytesForAlignment(2218 MachineBasicBlock *MBB) const {2219 return MaxBytesForAlignment;2220}2221 2222//===----------------------------------------------------------------------===//2223// Reciprocal Estimates2224//===----------------------------------------------------------------------===//2225 2226/// Get the reciprocal estimate attribute string for a function that will2227/// override the target defaults.2228static StringRef getRecipEstimateForFunc(MachineFunction &MF) {2229 const Function &F = MF.getFunction();2230 return F.getFnAttribute("reciprocal-estimates").getValueAsString();2231}2232 2233/// Construct a string for the given reciprocal operation of the given type.2234/// This string should match the corresponding option to the front-end's2235/// "-mrecip" flag assuming those strings have been passed through in an2236/// attribute string. For example, "vec-divf" for a division of a vXf32.2237static std::string getReciprocalOpName(bool IsSqrt, EVT VT) {2238 std::string Name = VT.isVector() ? "vec-" : "";2239 2240 Name += IsSqrt ? "sqrt" : "div";2241 2242 // TODO: Handle other float types?2243 if (VT.getScalarType() == MVT::f64) {2244 Name += "d";2245 } else if (VT.getScalarType() == MVT::f16) {2246 Name += "h";2247 } else {2248 assert(VT.getScalarType() == MVT::f32 &&2249 "Unexpected FP type for reciprocal estimate");2250 Name += "f";2251 }2252 2253 return Name;2254}2255 2256/// Return the character position and value (a single numeric character) of a2257/// customized refinement operation in the input string if it exists. Return2258/// false if there is no customized refinement step count.2259static bool parseRefinementStep(StringRef In, size_t &Position,2260 uint8_t &Value) {2261 const char RefStepToken = ':';2262 Position = In.find(RefStepToken);2263 if (Position == StringRef::npos)2264 return false;2265 2266 StringRef RefStepString = In.substr(Position + 1);2267 // Allow exactly one numeric character for the additional refinement2268 // step parameter.2269 if (RefStepString.size() == 1) {2270 char RefStepChar = RefStepString[0];2271 if (isDigit(RefStepChar)) {2272 Value = RefStepChar - '0';2273 return true;2274 }2275 }2276 report_fatal_error("Invalid refinement step for -recip.");2277}2278 2279/// For the input attribute string, return one of the ReciprocalEstimate enum2280/// status values (enabled, disabled, or not specified) for this operation on2281/// the specified data type.2282static int getOpEnabled(bool IsSqrt, EVT VT, StringRef Override) {2283 if (Override.empty())2284 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2285 2286 SmallVector<StringRef, 4> OverrideVector;2287 Override.split(OverrideVector, ',');2288 unsigned NumArgs = OverrideVector.size();2289 2290 // Check if "all", "none", or "default" was specified.2291 if (NumArgs == 1) {2292 // Look for an optional setting of the number of refinement steps needed2293 // for this type of reciprocal operation.2294 size_t RefPos;2295 uint8_t RefSteps;2296 if (parseRefinementStep(Override, RefPos, RefSteps)) {2297 // Split the string for further processing.2298 Override = Override.substr(0, RefPos);2299 }2300 2301 // All reciprocal types are enabled.2302 if (Override == "all")2303 return TargetLoweringBase::ReciprocalEstimate::Enabled;2304 2305 // All reciprocal types are disabled.2306 if (Override == "none")2307 return TargetLoweringBase::ReciprocalEstimate::Disabled;2308 2309 // Target defaults for enablement are used.2310 if (Override == "default")2311 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2312 }2313 2314 // The attribute string may omit the size suffix ('f'/'d').2315 std::string VTName = getReciprocalOpName(IsSqrt, VT);2316 std::string VTNameNoSize = VTName;2317 VTNameNoSize.pop_back();2318 static const char DisabledPrefix = '!';2319 2320 for (StringRef RecipType : OverrideVector) {2321 size_t RefPos;2322 uint8_t RefSteps;2323 if (parseRefinementStep(RecipType, RefPos, RefSteps))2324 RecipType = RecipType.substr(0, RefPos);2325 2326 // Ignore the disablement token for string matching.2327 bool IsDisabled = RecipType[0] == DisabledPrefix;2328 if (IsDisabled)2329 RecipType = RecipType.substr(1);2330 2331 if (RecipType == VTName || RecipType == VTNameNoSize)2332 return IsDisabled ? TargetLoweringBase::ReciprocalEstimate::Disabled2333 : TargetLoweringBase::ReciprocalEstimate::Enabled;2334 }2335 2336 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2337}2338 2339/// For the input attribute string, return the customized refinement step count2340/// for this operation on the specified data type. If the step count does not2341/// exist, return the ReciprocalEstimate enum value for unspecified.2342static int getOpRefinementSteps(bool IsSqrt, EVT VT, StringRef Override) {2343 if (Override.empty())2344 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2345 2346 SmallVector<StringRef, 4> OverrideVector;2347 Override.split(OverrideVector, ',');2348 unsigned NumArgs = OverrideVector.size();2349 2350 // Check if "all", "default", or "none" was specified.2351 if (NumArgs == 1) {2352 // Look for an optional setting of the number of refinement steps needed2353 // for this type of reciprocal operation.2354 size_t RefPos;2355 uint8_t RefSteps;2356 if (!parseRefinementStep(Override, RefPos, RefSteps))2357 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2358 2359 // Split the string for further processing.2360 Override = Override.substr(0, RefPos);2361 assert(Override != "none" &&2362 "Disabled reciprocals, but specifed refinement steps?");2363 2364 // If this is a general override, return the specified number of steps.2365 if (Override == "all" || Override == "default")2366 return RefSteps;2367 }2368 2369 // The attribute string may omit the size suffix ('f'/'d').2370 std::string VTName = getReciprocalOpName(IsSqrt, VT);2371 std::string VTNameNoSize = VTName;2372 VTNameNoSize.pop_back();2373 2374 for (StringRef RecipType : OverrideVector) {2375 size_t RefPos;2376 uint8_t RefSteps;2377 if (!parseRefinementStep(RecipType, RefPos, RefSteps))2378 continue;2379 2380 RecipType = RecipType.substr(0, RefPos);2381 if (RecipType == VTName || RecipType == VTNameNoSize)2382 return RefSteps;2383 }2384 2385 return TargetLoweringBase::ReciprocalEstimate::Unspecified;2386}2387 2388int TargetLoweringBase::getRecipEstimateSqrtEnabled(EVT VT,2389 MachineFunction &MF) const {2390 return getOpEnabled(true, VT, getRecipEstimateForFunc(MF));2391}2392 2393int TargetLoweringBase::getRecipEstimateDivEnabled(EVT VT,2394 MachineFunction &MF) const {2395 return getOpEnabled(false, VT, getRecipEstimateForFunc(MF));2396}2397 2398int TargetLoweringBase::getSqrtRefinementSteps(EVT VT,2399 MachineFunction &MF) const {2400 return getOpRefinementSteps(true, VT, getRecipEstimateForFunc(MF));2401}2402 2403int TargetLoweringBase::getDivRefinementSteps(EVT VT,2404 MachineFunction &MF) const {2405 return getOpRefinementSteps(false, VT, getRecipEstimateForFunc(MF));2406}2407 2408bool TargetLoweringBase::isLoadBitCastBeneficial(2409 EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG,2410 const MachineMemOperand &MMO) const {2411 // Single-element vectors are scalarized, so we should generally avoid having2412 // any memory operations on such types, as they would get scalarized too.2413 if (LoadVT.isFixedLengthVector() && BitcastVT.isFixedLengthVector() &&2414 BitcastVT.getVectorNumElements() == 1)2415 return false;2416 2417 // Don't do if we could do an indexed load on the original type, but not on2418 // the new one.2419 if (!LoadVT.isSimple() || !BitcastVT.isSimple())2420 return true;2421 2422 MVT LoadMVT = LoadVT.getSimpleVT();2423 2424 // Don't bother doing this if it's just going to be promoted again later, as2425 // doing so might interfere with other combines.2426 if (getOperationAction(ISD::LOAD, LoadMVT) == Promote &&2427 getTypeToPromoteTo(ISD::LOAD, LoadMVT) == BitcastVT.getSimpleVT())2428 return false;2429 2430 unsigned Fast = 0;2431 return allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), BitcastVT,2432 MMO, &Fast) &&2433 Fast;2434}2435 2436void TargetLoweringBase::finalizeLowering(MachineFunction &MF) const {2437 MF.getRegInfo().freezeReservedRegs();2438}2439 2440MachineMemOperand::Flags TargetLoweringBase::getLoadMemOperandFlags(2441 const LoadInst &LI, const DataLayout &DL, AssumptionCache *AC,2442 const TargetLibraryInfo *LibInfo) const {2443 MachineMemOperand::Flags Flags = MachineMemOperand::MOLoad;2444 if (LI.isVolatile())2445 Flags |= MachineMemOperand::MOVolatile;2446 2447 if (LI.hasMetadata(LLVMContext::MD_nontemporal))2448 Flags |= MachineMemOperand::MONonTemporal;2449 2450 if (LI.hasMetadata(LLVMContext::MD_invariant_load))2451 Flags |= MachineMemOperand::MOInvariant;2452 2453 if (isDereferenceableAndAlignedPointer(LI.getPointerOperand(), LI.getType(),2454 LI.getAlign(), DL, &LI, AC,2455 /*DT=*/nullptr, LibInfo))2456 Flags |= MachineMemOperand::MODereferenceable;2457 2458 Flags |= getTargetMMOFlags(LI);2459 return Flags;2460}2461 2462MachineMemOperand::Flags2463TargetLoweringBase::getStoreMemOperandFlags(const StoreInst &SI,2464 const DataLayout &DL) const {2465 MachineMemOperand::Flags Flags = MachineMemOperand::MOStore;2466 2467 if (SI.isVolatile())2468 Flags |= MachineMemOperand::MOVolatile;2469 2470 if (SI.hasMetadata(LLVMContext::MD_nontemporal))2471 Flags |= MachineMemOperand::MONonTemporal;2472 2473 // FIXME: Not preserving dereferenceable2474 Flags |= getTargetMMOFlags(SI);2475 return Flags;2476}2477 2478MachineMemOperand::Flags2479TargetLoweringBase::getAtomicMemOperandFlags(const Instruction &AI,2480 const DataLayout &DL) const {2481 auto Flags = MachineMemOperand::MOLoad | MachineMemOperand::MOStore;2482 2483 if (const AtomicRMWInst *RMW = dyn_cast<AtomicRMWInst>(&AI)) {2484 if (RMW->isVolatile())2485 Flags |= MachineMemOperand::MOVolatile;2486 } else if (const AtomicCmpXchgInst *CmpX = dyn_cast<AtomicCmpXchgInst>(&AI)) {2487 if (CmpX->isVolatile())2488 Flags |= MachineMemOperand::MOVolatile;2489 } else2490 llvm_unreachable("not an atomic instruction");2491 2492 // FIXME: Not preserving dereferenceable2493 Flags |= getTargetMMOFlags(AI);2494 return Flags;2495}2496 2497MachineMemOperand::Flags TargetLoweringBase::getVPIntrinsicMemOperandFlags(2498 const VPIntrinsic &VPIntrin) const {2499 MachineMemOperand::Flags Flags = MachineMemOperand::MONone;2500 Intrinsic::ID IntrinID = VPIntrin.getIntrinsicID();2501 2502 switch (IntrinID) {2503 default:2504 llvm_unreachable("unexpected intrinsic. Existing code may be appropriate "2505 "for it, but support must be explicitly enabled");2506 case Intrinsic::vp_load:2507 case Intrinsic::vp_gather:2508 case Intrinsic::experimental_vp_strided_load:2509 Flags = MachineMemOperand::MOLoad;2510 break;2511 case Intrinsic::vp_store:2512 case Intrinsic::vp_scatter:2513 case Intrinsic::experimental_vp_strided_store:2514 Flags = MachineMemOperand::MOStore;2515 break;2516 }2517 2518 if (VPIntrin.hasMetadata(LLVMContext::MD_nontemporal))2519 Flags |= MachineMemOperand::MONonTemporal;2520 2521 Flags |= getTargetMMOFlags(VPIntrin);2522 return Flags;2523}2524 2525Instruction *TargetLoweringBase::emitLeadingFence(IRBuilderBase &Builder,2526 Instruction *Inst,2527 AtomicOrdering Ord) const {2528 if (isReleaseOrStronger(Ord) && Inst->hasAtomicStore())2529 return Builder.CreateFence(Ord);2530 else2531 return nullptr;2532}2533 2534Instruction *TargetLoweringBase::emitTrailingFence(IRBuilderBase &Builder,2535 Instruction *Inst,2536 AtomicOrdering Ord) const {2537 if (isAcquireOrStronger(Ord))2538 return Builder.CreateFence(Ord);2539 else2540 return nullptr;2541}2542 2543//===----------------------------------------------------------------------===//2544// GlobalISel Hooks2545//===----------------------------------------------------------------------===//2546 2547bool TargetLoweringBase::shouldLocalize(const MachineInstr &MI,2548 const TargetTransformInfo *TTI) const {2549 auto &MF = *MI.getMF();2550 auto &MRI = MF.getRegInfo();2551 // Assuming a spill and reload of a value has a cost of 1 instruction each,2552 // this helper function computes the maximum number of uses we should consider2553 // for remat. E.g. on arm64 global addresses take 2 insts to materialize. We2554 // break even in terms of code size when the original MI has 2 users vs2555 // choosing to potentially spill. Any more than 2 users we we have a net code2556 // size increase. This doesn't take into account register pressure though.2557 auto maxUses = [](unsigned RematCost) {2558 // A cost of 1 means remats are basically free.2559 if (RematCost == 1)2560 return std::numeric_limits<unsigned>::max();2561 if (RematCost == 2)2562 return 2U;2563 2564 // Remat is too expensive, only sink if there's one user.2565 if (RematCost > 2)2566 return 1U;2567 llvm_unreachable("Unexpected remat cost");2568 };2569 2570 switch (MI.getOpcode()) {2571 default:2572 return false;2573 // Constants-like instructions should be close to their users.2574 // We don't want long live-ranges for them.2575 case TargetOpcode::G_CONSTANT:2576 case TargetOpcode::G_FCONSTANT:2577 case TargetOpcode::G_FRAME_INDEX:2578 case TargetOpcode::G_INTTOPTR:2579 return true;2580 case TargetOpcode::G_GLOBAL_VALUE: {2581 unsigned RematCost = TTI->getGISelRematGlobalCost();2582 Register Reg = MI.getOperand(0).getReg();2583 unsigned MaxUses = maxUses(RematCost);2584 if (MaxUses == UINT_MAX)2585 return true; // Remats are "free" so always localize.2586 return MRI.hasAtMostUserInstrs(Reg, MaxUses);2587 }2588 }2589}2590