10b57cec5SDimitry Andric //===- TargetLoweringBase.cpp - Implement the TargetLoweringBase class ----===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This implements the TargetLoweringBase class. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "llvm/ADT/BitVector.h" 140b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 150b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 160b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h" 170b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 180b57cec5SDimitry Andric #include "llvm/ADT/Triple.h" 190b57cec5SDimitry Andric #include "llvm/ADT/Twine.h" 205ffd83dbSDimitry Andric #include "llvm/Analysis/Loads.h" 215ffd83dbSDimitry Andric #include "llvm/Analysis/TargetTransformInfo.h" 220b57cec5SDimitry Andric #include "llvm/CodeGen/Analysis.h" 230b57cec5SDimitry Andric #include "llvm/CodeGen/ISDOpcodes.h" 240b57cec5SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h" 250b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFrameInfo.h" 260b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 270b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstr.h" 280b57cec5SDimitry Andric #include "llvm/CodeGen/MachineInstrBuilder.h" 290b57cec5SDimitry Andric #include "llvm/CodeGen/MachineMemOperand.h" 300b57cec5SDimitry Andric #include "llvm/CodeGen/MachineOperand.h" 310b57cec5SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 320b57cec5SDimitry Andric #include "llvm/CodeGen/RuntimeLibcalls.h" 330b57cec5SDimitry Andric #include "llvm/CodeGen/StackMaps.h" 340b57cec5SDimitry Andric #include "llvm/CodeGen/TargetLowering.h" 350b57cec5SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h" 360b57cec5SDimitry Andric #include "llvm/CodeGen/TargetRegisterInfo.h" 370b57cec5SDimitry Andric #include "llvm/CodeGen/ValueTypes.h" 380b57cec5SDimitry Andric #include "llvm/IR/Attributes.h" 390b57cec5SDimitry Andric #include "llvm/IR/CallingConv.h" 400b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h" 410b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 420b57cec5SDimitry Andric #include "llvm/IR/Function.h" 430b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 440b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 450b57cec5SDimitry Andric #include "llvm/IR/IRBuilder.h" 460b57cec5SDimitry Andric #include "llvm/IR/Module.h" 470b57cec5SDimitry Andric #include "llvm/IR/Type.h" 480b57cec5SDimitry Andric #include "llvm/Support/BranchProbability.h" 490b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 500b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h" 510b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 520b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 530b57cec5SDimitry Andric #include "llvm/Support/MachineValueType.h" 540b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h" 550b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h" 565ffd83dbSDimitry Andric #include "llvm/Transforms/Utils/SizeOpts.h" 570b57cec5SDimitry Andric #include <algorithm> 580b57cec5SDimitry Andric #include <cassert> 590b57cec5SDimitry Andric #include <cstddef> 600b57cec5SDimitry Andric #include <cstdint> 610b57cec5SDimitry Andric #include <cstring> 620b57cec5SDimitry Andric #include <iterator> 630b57cec5SDimitry Andric #include <string> 640b57cec5SDimitry Andric #include <tuple> 650b57cec5SDimitry Andric #include <utility> 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric using namespace llvm; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric static cl::opt<bool> JumpIsExpensiveOverride( 700b57cec5SDimitry Andric "jump-is-expensive", cl::init(false), 710b57cec5SDimitry Andric cl::desc("Do not create extra branches to split comparison logic."), 720b57cec5SDimitry Andric cl::Hidden); 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric static cl::opt<unsigned> MinimumJumpTableEntries 750b57cec5SDimitry Andric ("min-jump-table-entries", cl::init(4), cl::Hidden, 760b57cec5SDimitry Andric cl::desc("Set minimum number of entries to use a jump table.")); 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric static cl::opt<unsigned> MaximumJumpTableSize 790b57cec5SDimitry Andric ("max-jump-table-size", cl::init(UINT_MAX), cl::Hidden, 800b57cec5SDimitry Andric cl::desc("Set maximum size of jump tables.")); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric /// Minimum jump table density for normal functions. 830b57cec5SDimitry Andric static cl::opt<unsigned> 840b57cec5SDimitry Andric JumpTableDensity("jump-table-density", cl::init(10), cl::Hidden, 850b57cec5SDimitry Andric cl::desc("Minimum density for building a jump table in " 860b57cec5SDimitry Andric "a normal function")); 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric /// Minimum jump table density for -Os or -Oz functions. 890b57cec5SDimitry Andric static cl::opt<unsigned> OptsizeJumpTableDensity( 900b57cec5SDimitry Andric "optsize-jump-table-density", cl::init(40), cl::Hidden, 910b57cec5SDimitry Andric cl::desc("Minimum density for building a jump table in " 920b57cec5SDimitry Andric "an optsize function")); 930b57cec5SDimitry Andric 94480093f4SDimitry Andric // FIXME: This option is only to test if the strict fp operation processed 95480093f4SDimitry Andric // correctly by preventing mutating strict fp operation to normal fp operation 96480093f4SDimitry Andric // during development. When the backend supports strict float operation, this 97480093f4SDimitry Andric // option will be meaningless. 98480093f4SDimitry Andric static cl::opt<bool> DisableStrictNodeMutation("disable-strictnode-mutation", 99480093f4SDimitry Andric cl::desc("Don't mutate strict-float node to a legalize node"), 100480093f4SDimitry Andric cl::init(false), cl::Hidden); 101480093f4SDimitry Andric 1020b57cec5SDimitry Andric static bool darwinHasSinCos(const Triple &TT) { 1030b57cec5SDimitry Andric assert(TT.isOSDarwin() && "should be called with darwin triple"); 1040b57cec5SDimitry Andric // Don't bother with 32 bit x86. 1050b57cec5SDimitry Andric if (TT.getArch() == Triple::x86) 1060b57cec5SDimitry Andric return false; 1070b57cec5SDimitry Andric // Macos < 10.9 has no sincos_stret. 1080b57cec5SDimitry Andric if (TT.isMacOSX()) 1090b57cec5SDimitry Andric return !TT.isMacOSXVersionLT(10, 9) && TT.isArch64Bit(); 1100b57cec5SDimitry Andric // iOS < 7.0 has no sincos_stret. 1110b57cec5SDimitry Andric if (TT.isiOS()) 1120b57cec5SDimitry Andric return !TT.isOSVersionLT(7, 0); 1130b57cec5SDimitry Andric // Any other darwin such as WatchOS/TvOS is new enough. 1140b57cec5SDimitry Andric return true; 1150b57cec5SDimitry Andric } 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric // Although this default value is arbitrary, it is not random. It is assumed 1180b57cec5SDimitry Andric // that a condition that evaluates the same way by a higher percentage than this 1190b57cec5SDimitry Andric // is best represented as control flow. Therefore, the default value N should be 1200b57cec5SDimitry Andric // set such that the win from N% correct executions is greater than the loss 1210b57cec5SDimitry Andric // from (100 - N)% mispredicted executions for the majority of intended targets. 1220b57cec5SDimitry Andric static cl::opt<int> MinPercentageForPredictableBranch( 1230b57cec5SDimitry Andric "min-predictable-branch", cl::init(99), 1240b57cec5SDimitry Andric cl::desc("Minimum percentage (0-100) that a condition must be either true " 1250b57cec5SDimitry Andric "or false to assume that the condition is predictable"), 1260b57cec5SDimitry Andric cl::Hidden); 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric void TargetLoweringBase::InitLibcalls(const Triple &TT) { 1290b57cec5SDimitry Andric #define HANDLE_LIBCALL(code, name) \ 1300b57cec5SDimitry Andric setLibcallName(RTLIB::code, name); 1310b57cec5SDimitry Andric #include "llvm/IR/RuntimeLibcalls.def" 1320b57cec5SDimitry Andric #undef HANDLE_LIBCALL 1330b57cec5SDimitry Andric // Initialize calling conventions to their default. 1340b57cec5SDimitry Andric for (int LC = 0; LC < RTLIB::UNKNOWN_LIBCALL; ++LC) 1350b57cec5SDimitry Andric setLibcallCallingConv((RTLIB::Libcall)LC, CallingConv::C); 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric // For IEEE quad-precision libcall names, PPC uses "kf" instead of "tf". 1380b57cec5SDimitry Andric if (TT.getArch() == Triple::ppc || TT.isPPC64()) { 1390b57cec5SDimitry Andric setLibcallName(RTLIB::ADD_F128, "__addkf3"); 1400b57cec5SDimitry Andric setLibcallName(RTLIB::SUB_F128, "__subkf3"); 1410b57cec5SDimitry Andric setLibcallName(RTLIB::MUL_F128, "__mulkf3"); 1420b57cec5SDimitry Andric setLibcallName(RTLIB::DIV_F128, "__divkf3"); 1430b57cec5SDimitry Andric setLibcallName(RTLIB::FPEXT_F32_F128, "__extendsfkf2"); 1440b57cec5SDimitry Andric setLibcallName(RTLIB::FPEXT_F64_F128, "__extenddfkf2"); 1450b57cec5SDimitry Andric setLibcallName(RTLIB::FPROUND_F128_F32, "__trunckfsf2"); 1460b57cec5SDimitry Andric setLibcallName(RTLIB::FPROUND_F128_F64, "__trunckfdf2"); 1470b57cec5SDimitry Andric setLibcallName(RTLIB::FPTOSINT_F128_I32, "__fixkfsi"); 1480b57cec5SDimitry Andric setLibcallName(RTLIB::FPTOSINT_F128_I64, "__fixkfdi"); 1490b57cec5SDimitry Andric setLibcallName(RTLIB::FPTOUINT_F128_I32, "__fixunskfsi"); 1500b57cec5SDimitry Andric setLibcallName(RTLIB::FPTOUINT_F128_I64, "__fixunskfdi"); 1510b57cec5SDimitry Andric setLibcallName(RTLIB::SINTTOFP_I32_F128, "__floatsikf"); 1520b57cec5SDimitry Andric setLibcallName(RTLIB::SINTTOFP_I64_F128, "__floatdikf"); 1530b57cec5SDimitry Andric setLibcallName(RTLIB::UINTTOFP_I32_F128, "__floatunsikf"); 1540b57cec5SDimitry Andric setLibcallName(RTLIB::UINTTOFP_I64_F128, "__floatundikf"); 1550b57cec5SDimitry Andric setLibcallName(RTLIB::OEQ_F128, "__eqkf2"); 1560b57cec5SDimitry Andric setLibcallName(RTLIB::UNE_F128, "__nekf2"); 1570b57cec5SDimitry Andric setLibcallName(RTLIB::OGE_F128, "__gekf2"); 1580b57cec5SDimitry Andric setLibcallName(RTLIB::OLT_F128, "__ltkf2"); 1590b57cec5SDimitry Andric setLibcallName(RTLIB::OLE_F128, "__lekf2"); 1600b57cec5SDimitry Andric setLibcallName(RTLIB::OGT_F128, "__gtkf2"); 1610b57cec5SDimitry Andric setLibcallName(RTLIB::UO_F128, "__unordkf2"); 1620b57cec5SDimitry Andric } 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric // A few names are different on particular architectures or environments. 1650b57cec5SDimitry Andric if (TT.isOSDarwin()) { 1660b57cec5SDimitry Andric // For f16/f32 conversions, Darwin uses the standard naming scheme, instead 1670b57cec5SDimitry Andric // of the gnueabi-style __gnu_*_ieee. 1680b57cec5SDimitry Andric // FIXME: What about other targets? 1690b57cec5SDimitry Andric setLibcallName(RTLIB::FPEXT_F16_F32, "__extendhfsf2"); 1700b57cec5SDimitry Andric setLibcallName(RTLIB::FPROUND_F32_F16, "__truncsfhf2"); 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric // Some darwins have an optimized __bzero/bzero function. 1730b57cec5SDimitry Andric switch (TT.getArch()) { 1740b57cec5SDimitry Andric case Triple::x86: 1750b57cec5SDimitry Andric case Triple::x86_64: 1760b57cec5SDimitry Andric if (TT.isMacOSX() && !TT.isMacOSXVersionLT(10, 6)) 1770b57cec5SDimitry Andric setLibcallName(RTLIB::BZERO, "__bzero"); 1780b57cec5SDimitry Andric break; 1790b57cec5SDimitry Andric case Triple::aarch64: 1808bcb0991SDimitry Andric case Triple::aarch64_32: 1810b57cec5SDimitry Andric setLibcallName(RTLIB::BZERO, "bzero"); 1820b57cec5SDimitry Andric break; 1830b57cec5SDimitry Andric default: 1840b57cec5SDimitry Andric break; 1850b57cec5SDimitry Andric } 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric if (darwinHasSinCos(TT)) { 1880b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_STRET_F32, "__sincosf_stret"); 1890b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_STRET_F64, "__sincos_stret"); 1900b57cec5SDimitry Andric if (TT.isWatchABI()) { 1910b57cec5SDimitry Andric setLibcallCallingConv(RTLIB::SINCOS_STRET_F32, 1920b57cec5SDimitry Andric CallingConv::ARM_AAPCS_VFP); 1930b57cec5SDimitry Andric setLibcallCallingConv(RTLIB::SINCOS_STRET_F64, 1940b57cec5SDimitry Andric CallingConv::ARM_AAPCS_VFP); 1950b57cec5SDimitry Andric } 1960b57cec5SDimitry Andric } 1970b57cec5SDimitry Andric } else { 1980b57cec5SDimitry Andric setLibcallName(RTLIB::FPEXT_F16_F32, "__gnu_h2f_ieee"); 1990b57cec5SDimitry Andric setLibcallName(RTLIB::FPROUND_F32_F16, "__gnu_f2h_ieee"); 2000b57cec5SDimitry Andric } 2010b57cec5SDimitry Andric 2020b57cec5SDimitry Andric if (TT.isGNUEnvironment() || TT.isOSFuchsia() || 2030b57cec5SDimitry Andric (TT.isAndroid() && !TT.isAndroidVersionLT(9))) { 2040b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_F32, "sincosf"); 2050b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_F64, "sincos"); 2060b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_F80, "sincosl"); 2070b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_F128, "sincosl"); 2080b57cec5SDimitry Andric setLibcallName(RTLIB::SINCOS_PPCF128, "sincosl"); 2090b57cec5SDimitry Andric } 2100b57cec5SDimitry Andric 2118bcb0991SDimitry Andric if (TT.isPS4CPU()) { 2128bcb0991SDimitry Andric setLibcallName(RTLIB::SINCOS_F32, "sincosf"); 2138bcb0991SDimitry Andric setLibcallName(RTLIB::SINCOS_F64, "sincos"); 2148bcb0991SDimitry Andric } 2158bcb0991SDimitry Andric 2160b57cec5SDimitry Andric if (TT.isOSOpenBSD()) { 2170b57cec5SDimitry Andric setLibcallName(RTLIB::STACKPROTECTOR_CHECK_FAIL, nullptr); 2180b57cec5SDimitry Andric } 2190b57cec5SDimitry Andric } 2200b57cec5SDimitry Andric 2210b57cec5SDimitry Andric /// getFPEXT - Return the FPEXT_*_* value for the given types, or 2220b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 2230b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getFPEXT(EVT OpVT, EVT RetVT) { 2240b57cec5SDimitry Andric if (OpVT == MVT::f16) { 2250b57cec5SDimitry Andric if (RetVT == MVT::f32) 2260b57cec5SDimitry Andric return FPEXT_F16_F32; 2270b57cec5SDimitry Andric } else if (OpVT == MVT::f32) { 2280b57cec5SDimitry Andric if (RetVT == MVT::f64) 2290b57cec5SDimitry Andric return FPEXT_F32_F64; 2300b57cec5SDimitry Andric if (RetVT == MVT::f128) 2310b57cec5SDimitry Andric return FPEXT_F32_F128; 2320b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 2330b57cec5SDimitry Andric return FPEXT_F32_PPCF128; 2340b57cec5SDimitry Andric } else if (OpVT == MVT::f64) { 2350b57cec5SDimitry Andric if (RetVT == MVT::f128) 2360b57cec5SDimitry Andric return FPEXT_F64_F128; 2370b57cec5SDimitry Andric else if (RetVT == MVT::ppcf128) 2380b57cec5SDimitry Andric return FPEXT_F64_PPCF128; 2390b57cec5SDimitry Andric } else if (OpVT == MVT::f80) { 2400b57cec5SDimitry Andric if (RetVT == MVT::f128) 2410b57cec5SDimitry Andric return FPEXT_F80_F128; 2420b57cec5SDimitry Andric } 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 2450b57cec5SDimitry Andric } 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric /// getFPROUND - Return the FPROUND_*_* value for the given types, or 2480b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 2490b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getFPROUND(EVT OpVT, EVT RetVT) { 2500b57cec5SDimitry Andric if (RetVT == MVT::f16) { 2510b57cec5SDimitry Andric if (OpVT == MVT::f32) 2520b57cec5SDimitry Andric return FPROUND_F32_F16; 2530b57cec5SDimitry Andric if (OpVT == MVT::f64) 2540b57cec5SDimitry Andric return FPROUND_F64_F16; 2550b57cec5SDimitry Andric if (OpVT == MVT::f80) 2560b57cec5SDimitry Andric return FPROUND_F80_F16; 2570b57cec5SDimitry Andric if (OpVT == MVT::f128) 2580b57cec5SDimitry Andric return FPROUND_F128_F16; 2590b57cec5SDimitry Andric if (OpVT == MVT::ppcf128) 2600b57cec5SDimitry Andric return FPROUND_PPCF128_F16; 2610b57cec5SDimitry Andric } else if (RetVT == MVT::f32) { 2620b57cec5SDimitry Andric if (OpVT == MVT::f64) 2630b57cec5SDimitry Andric return FPROUND_F64_F32; 2640b57cec5SDimitry Andric if (OpVT == MVT::f80) 2650b57cec5SDimitry Andric return FPROUND_F80_F32; 2660b57cec5SDimitry Andric if (OpVT == MVT::f128) 2670b57cec5SDimitry Andric return FPROUND_F128_F32; 2680b57cec5SDimitry Andric if (OpVT == MVT::ppcf128) 2690b57cec5SDimitry Andric return FPROUND_PPCF128_F32; 2700b57cec5SDimitry Andric } else if (RetVT == MVT::f64) { 2710b57cec5SDimitry Andric if (OpVT == MVT::f80) 2720b57cec5SDimitry Andric return FPROUND_F80_F64; 2730b57cec5SDimitry Andric if (OpVT == MVT::f128) 2740b57cec5SDimitry Andric return FPROUND_F128_F64; 2750b57cec5SDimitry Andric if (OpVT == MVT::ppcf128) 2760b57cec5SDimitry Andric return FPROUND_PPCF128_F64; 2770b57cec5SDimitry Andric } else if (RetVT == MVT::f80) { 2780b57cec5SDimitry Andric if (OpVT == MVT::f128) 2790b57cec5SDimitry Andric return FPROUND_F128_F80; 2800b57cec5SDimitry Andric } 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 2830b57cec5SDimitry Andric } 2840b57cec5SDimitry Andric 2850b57cec5SDimitry Andric /// getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or 2860b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 2870b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getFPTOSINT(EVT OpVT, EVT RetVT) { 2880b57cec5SDimitry Andric if (OpVT == MVT::f32) { 2890b57cec5SDimitry Andric if (RetVT == MVT::i32) 2900b57cec5SDimitry Andric return FPTOSINT_F32_I32; 2910b57cec5SDimitry Andric if (RetVT == MVT::i64) 2920b57cec5SDimitry Andric return FPTOSINT_F32_I64; 2930b57cec5SDimitry Andric if (RetVT == MVT::i128) 2940b57cec5SDimitry Andric return FPTOSINT_F32_I128; 2950b57cec5SDimitry Andric } else if (OpVT == MVT::f64) { 2960b57cec5SDimitry Andric if (RetVT == MVT::i32) 2970b57cec5SDimitry Andric return FPTOSINT_F64_I32; 2980b57cec5SDimitry Andric if (RetVT == MVT::i64) 2990b57cec5SDimitry Andric return FPTOSINT_F64_I64; 3000b57cec5SDimitry Andric if (RetVT == MVT::i128) 3010b57cec5SDimitry Andric return FPTOSINT_F64_I128; 3020b57cec5SDimitry Andric } else if (OpVT == MVT::f80) { 3030b57cec5SDimitry Andric if (RetVT == MVT::i32) 3040b57cec5SDimitry Andric return FPTOSINT_F80_I32; 3050b57cec5SDimitry Andric if (RetVT == MVT::i64) 3060b57cec5SDimitry Andric return FPTOSINT_F80_I64; 3070b57cec5SDimitry Andric if (RetVT == MVT::i128) 3080b57cec5SDimitry Andric return FPTOSINT_F80_I128; 3090b57cec5SDimitry Andric } else if (OpVT == MVT::f128) { 3100b57cec5SDimitry Andric if (RetVT == MVT::i32) 3110b57cec5SDimitry Andric return FPTOSINT_F128_I32; 3120b57cec5SDimitry Andric if (RetVT == MVT::i64) 3130b57cec5SDimitry Andric return FPTOSINT_F128_I64; 3140b57cec5SDimitry Andric if (RetVT == MVT::i128) 3150b57cec5SDimitry Andric return FPTOSINT_F128_I128; 3160b57cec5SDimitry Andric } else if (OpVT == MVT::ppcf128) { 3170b57cec5SDimitry Andric if (RetVT == MVT::i32) 3180b57cec5SDimitry Andric return FPTOSINT_PPCF128_I32; 3190b57cec5SDimitry Andric if (RetVT == MVT::i64) 3200b57cec5SDimitry Andric return FPTOSINT_PPCF128_I64; 3210b57cec5SDimitry Andric if (RetVT == MVT::i128) 3220b57cec5SDimitry Andric return FPTOSINT_PPCF128_I128; 3230b57cec5SDimitry Andric } 3240b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 3250b57cec5SDimitry Andric } 3260b57cec5SDimitry Andric 3270b57cec5SDimitry Andric /// getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or 3280b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 3290b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getFPTOUINT(EVT OpVT, EVT RetVT) { 3300b57cec5SDimitry Andric if (OpVT == MVT::f32) { 3310b57cec5SDimitry Andric if (RetVT == MVT::i32) 3320b57cec5SDimitry Andric return FPTOUINT_F32_I32; 3330b57cec5SDimitry Andric if (RetVT == MVT::i64) 3340b57cec5SDimitry Andric return FPTOUINT_F32_I64; 3350b57cec5SDimitry Andric if (RetVT == MVT::i128) 3360b57cec5SDimitry Andric return FPTOUINT_F32_I128; 3370b57cec5SDimitry Andric } else if (OpVT == MVT::f64) { 3380b57cec5SDimitry Andric if (RetVT == MVT::i32) 3390b57cec5SDimitry Andric return FPTOUINT_F64_I32; 3400b57cec5SDimitry Andric if (RetVT == MVT::i64) 3410b57cec5SDimitry Andric return FPTOUINT_F64_I64; 3420b57cec5SDimitry Andric if (RetVT == MVT::i128) 3430b57cec5SDimitry Andric return FPTOUINT_F64_I128; 3440b57cec5SDimitry Andric } else if (OpVT == MVT::f80) { 3450b57cec5SDimitry Andric if (RetVT == MVT::i32) 3460b57cec5SDimitry Andric return FPTOUINT_F80_I32; 3470b57cec5SDimitry Andric if (RetVT == MVT::i64) 3480b57cec5SDimitry Andric return FPTOUINT_F80_I64; 3490b57cec5SDimitry Andric if (RetVT == MVT::i128) 3500b57cec5SDimitry Andric return FPTOUINT_F80_I128; 3510b57cec5SDimitry Andric } else if (OpVT == MVT::f128) { 3520b57cec5SDimitry Andric if (RetVT == MVT::i32) 3530b57cec5SDimitry Andric return FPTOUINT_F128_I32; 3540b57cec5SDimitry Andric if (RetVT == MVT::i64) 3550b57cec5SDimitry Andric return FPTOUINT_F128_I64; 3560b57cec5SDimitry Andric if (RetVT == MVT::i128) 3570b57cec5SDimitry Andric return FPTOUINT_F128_I128; 3580b57cec5SDimitry Andric } else if (OpVT == MVT::ppcf128) { 3590b57cec5SDimitry Andric if (RetVT == MVT::i32) 3600b57cec5SDimitry Andric return FPTOUINT_PPCF128_I32; 3610b57cec5SDimitry Andric if (RetVT == MVT::i64) 3620b57cec5SDimitry Andric return FPTOUINT_PPCF128_I64; 3630b57cec5SDimitry Andric if (RetVT == MVT::i128) 3640b57cec5SDimitry Andric return FPTOUINT_PPCF128_I128; 3650b57cec5SDimitry Andric } 3660b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 3670b57cec5SDimitry Andric } 3680b57cec5SDimitry Andric 3690b57cec5SDimitry Andric /// getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or 3700b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 3710b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getSINTTOFP(EVT OpVT, EVT RetVT) { 3720b57cec5SDimitry Andric if (OpVT == MVT::i32) { 3730b57cec5SDimitry Andric if (RetVT == MVT::f32) 3740b57cec5SDimitry Andric return SINTTOFP_I32_F32; 3750b57cec5SDimitry Andric if (RetVT == MVT::f64) 3760b57cec5SDimitry Andric return SINTTOFP_I32_F64; 3770b57cec5SDimitry Andric if (RetVT == MVT::f80) 3780b57cec5SDimitry Andric return SINTTOFP_I32_F80; 3790b57cec5SDimitry Andric if (RetVT == MVT::f128) 3800b57cec5SDimitry Andric return SINTTOFP_I32_F128; 3810b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 3820b57cec5SDimitry Andric return SINTTOFP_I32_PPCF128; 3830b57cec5SDimitry Andric } else if (OpVT == MVT::i64) { 3840b57cec5SDimitry Andric if (RetVT == MVT::f32) 3850b57cec5SDimitry Andric return SINTTOFP_I64_F32; 3860b57cec5SDimitry Andric if (RetVT == MVT::f64) 3870b57cec5SDimitry Andric return SINTTOFP_I64_F64; 3880b57cec5SDimitry Andric if (RetVT == MVT::f80) 3890b57cec5SDimitry Andric return SINTTOFP_I64_F80; 3900b57cec5SDimitry Andric if (RetVT == MVT::f128) 3910b57cec5SDimitry Andric return SINTTOFP_I64_F128; 3920b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 3930b57cec5SDimitry Andric return SINTTOFP_I64_PPCF128; 3940b57cec5SDimitry Andric } else if (OpVT == MVT::i128) { 3950b57cec5SDimitry Andric if (RetVT == MVT::f32) 3960b57cec5SDimitry Andric return SINTTOFP_I128_F32; 3970b57cec5SDimitry Andric if (RetVT == MVT::f64) 3980b57cec5SDimitry Andric return SINTTOFP_I128_F64; 3990b57cec5SDimitry Andric if (RetVT == MVT::f80) 4000b57cec5SDimitry Andric return SINTTOFP_I128_F80; 4010b57cec5SDimitry Andric if (RetVT == MVT::f128) 4020b57cec5SDimitry Andric return SINTTOFP_I128_F128; 4030b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 4040b57cec5SDimitry Andric return SINTTOFP_I128_PPCF128; 4050b57cec5SDimitry Andric } 4060b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 4070b57cec5SDimitry Andric } 4080b57cec5SDimitry Andric 4090b57cec5SDimitry Andric /// getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or 4100b57cec5SDimitry Andric /// UNKNOWN_LIBCALL if there is none. 4110b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getUINTTOFP(EVT OpVT, EVT RetVT) { 4120b57cec5SDimitry Andric if (OpVT == MVT::i32) { 4130b57cec5SDimitry Andric if (RetVT == MVT::f32) 4140b57cec5SDimitry Andric return UINTTOFP_I32_F32; 4150b57cec5SDimitry Andric if (RetVT == MVT::f64) 4160b57cec5SDimitry Andric return UINTTOFP_I32_F64; 4170b57cec5SDimitry Andric if (RetVT == MVT::f80) 4180b57cec5SDimitry Andric return UINTTOFP_I32_F80; 4190b57cec5SDimitry Andric if (RetVT == MVT::f128) 4200b57cec5SDimitry Andric return UINTTOFP_I32_F128; 4210b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 4220b57cec5SDimitry Andric return UINTTOFP_I32_PPCF128; 4230b57cec5SDimitry Andric } else if (OpVT == MVT::i64) { 4240b57cec5SDimitry Andric if (RetVT == MVT::f32) 4250b57cec5SDimitry Andric return UINTTOFP_I64_F32; 4260b57cec5SDimitry Andric if (RetVT == MVT::f64) 4270b57cec5SDimitry Andric return UINTTOFP_I64_F64; 4280b57cec5SDimitry Andric if (RetVT == MVT::f80) 4290b57cec5SDimitry Andric return UINTTOFP_I64_F80; 4300b57cec5SDimitry Andric if (RetVT == MVT::f128) 4310b57cec5SDimitry Andric return UINTTOFP_I64_F128; 4320b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 4330b57cec5SDimitry Andric return UINTTOFP_I64_PPCF128; 4340b57cec5SDimitry Andric } else if (OpVT == MVT::i128) { 4350b57cec5SDimitry Andric if (RetVT == MVT::f32) 4360b57cec5SDimitry Andric return UINTTOFP_I128_F32; 4370b57cec5SDimitry Andric if (RetVT == MVT::f64) 4380b57cec5SDimitry Andric return UINTTOFP_I128_F64; 4390b57cec5SDimitry Andric if (RetVT == MVT::f80) 4400b57cec5SDimitry Andric return UINTTOFP_I128_F80; 4410b57cec5SDimitry Andric if (RetVT == MVT::f128) 4420b57cec5SDimitry Andric return UINTTOFP_I128_F128; 4430b57cec5SDimitry Andric if (RetVT == MVT::ppcf128) 4440b57cec5SDimitry Andric return UINTTOFP_I128_PPCF128; 4450b57cec5SDimitry Andric } 4460b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 4470b57cec5SDimitry Andric } 4480b57cec5SDimitry Andric 4490b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getSYNC(unsigned Opc, MVT VT) { 4500b57cec5SDimitry Andric #define OP_TO_LIBCALL(Name, Enum) \ 4510b57cec5SDimitry Andric case Name: \ 4520b57cec5SDimitry Andric switch (VT.SimpleTy) { \ 4530b57cec5SDimitry Andric default: \ 4540b57cec5SDimitry Andric return UNKNOWN_LIBCALL; \ 4550b57cec5SDimitry Andric case MVT::i8: \ 4560b57cec5SDimitry Andric return Enum##_1; \ 4570b57cec5SDimitry Andric case MVT::i16: \ 4580b57cec5SDimitry Andric return Enum##_2; \ 4590b57cec5SDimitry Andric case MVT::i32: \ 4600b57cec5SDimitry Andric return Enum##_4; \ 4610b57cec5SDimitry Andric case MVT::i64: \ 4620b57cec5SDimitry Andric return Enum##_8; \ 4630b57cec5SDimitry Andric case MVT::i128: \ 4640b57cec5SDimitry Andric return Enum##_16; \ 4650b57cec5SDimitry Andric } 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric switch (Opc) { 4680b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_SWAP, SYNC_LOCK_TEST_AND_SET) 4690b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_CMP_SWAP, SYNC_VAL_COMPARE_AND_SWAP) 4700b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_ADD, SYNC_FETCH_AND_ADD) 4710b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_SUB, SYNC_FETCH_AND_SUB) 4720b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_AND, SYNC_FETCH_AND_AND) 4730b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_OR, SYNC_FETCH_AND_OR) 4740b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_XOR, SYNC_FETCH_AND_XOR) 4750b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_NAND, SYNC_FETCH_AND_NAND) 4760b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MAX, SYNC_FETCH_AND_MAX) 4770b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMAX, SYNC_FETCH_AND_UMAX) 4780b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_MIN, SYNC_FETCH_AND_MIN) 4790b57cec5SDimitry Andric OP_TO_LIBCALL(ISD::ATOMIC_LOAD_UMIN, SYNC_FETCH_AND_UMIN) 4800b57cec5SDimitry Andric } 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric #undef OP_TO_LIBCALL 4830b57cec5SDimitry Andric 4840b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 4850b57cec5SDimitry Andric } 4860b57cec5SDimitry Andric 4870b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getMEMCPY_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) { 4880b57cec5SDimitry Andric switch (ElementSize) { 4890b57cec5SDimitry Andric case 1: 4900b57cec5SDimitry Andric return MEMCPY_ELEMENT_UNORDERED_ATOMIC_1; 4910b57cec5SDimitry Andric case 2: 4920b57cec5SDimitry Andric return MEMCPY_ELEMENT_UNORDERED_ATOMIC_2; 4930b57cec5SDimitry Andric case 4: 4940b57cec5SDimitry Andric return MEMCPY_ELEMENT_UNORDERED_ATOMIC_4; 4950b57cec5SDimitry Andric case 8: 4960b57cec5SDimitry Andric return MEMCPY_ELEMENT_UNORDERED_ATOMIC_8; 4970b57cec5SDimitry Andric case 16: 4980b57cec5SDimitry Andric return MEMCPY_ELEMENT_UNORDERED_ATOMIC_16; 4990b57cec5SDimitry Andric default: 5000b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 5010b57cec5SDimitry Andric } 5020b57cec5SDimitry Andric } 5030b57cec5SDimitry Andric 5040b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) { 5050b57cec5SDimitry Andric switch (ElementSize) { 5060b57cec5SDimitry Andric case 1: 5070b57cec5SDimitry Andric return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_1; 5080b57cec5SDimitry Andric case 2: 5090b57cec5SDimitry Andric return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_2; 5100b57cec5SDimitry Andric case 4: 5110b57cec5SDimitry Andric return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_4; 5120b57cec5SDimitry Andric case 8: 5130b57cec5SDimitry Andric return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_8; 5140b57cec5SDimitry Andric case 16: 5150b57cec5SDimitry Andric return MEMMOVE_ELEMENT_UNORDERED_ATOMIC_16; 5160b57cec5SDimitry Andric default: 5170b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 5180b57cec5SDimitry Andric } 5190b57cec5SDimitry Andric } 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric RTLIB::Libcall RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(uint64_t ElementSize) { 5220b57cec5SDimitry Andric switch (ElementSize) { 5230b57cec5SDimitry Andric case 1: 5240b57cec5SDimitry Andric return MEMSET_ELEMENT_UNORDERED_ATOMIC_1; 5250b57cec5SDimitry Andric case 2: 5260b57cec5SDimitry Andric return MEMSET_ELEMENT_UNORDERED_ATOMIC_2; 5270b57cec5SDimitry Andric case 4: 5280b57cec5SDimitry Andric return MEMSET_ELEMENT_UNORDERED_ATOMIC_4; 5290b57cec5SDimitry Andric case 8: 5300b57cec5SDimitry Andric return MEMSET_ELEMENT_UNORDERED_ATOMIC_8; 5310b57cec5SDimitry Andric case 16: 5320b57cec5SDimitry Andric return MEMSET_ELEMENT_UNORDERED_ATOMIC_16; 5330b57cec5SDimitry Andric default: 5340b57cec5SDimitry Andric return UNKNOWN_LIBCALL; 5350b57cec5SDimitry Andric } 5360b57cec5SDimitry Andric } 5370b57cec5SDimitry Andric 5380b57cec5SDimitry Andric /// InitCmpLibcallCCs - Set default comparison libcall CC. 5390b57cec5SDimitry Andric static void InitCmpLibcallCCs(ISD::CondCode *CCs) { 5400b57cec5SDimitry Andric memset(CCs, ISD::SETCC_INVALID, sizeof(ISD::CondCode)*RTLIB::UNKNOWN_LIBCALL); 5410b57cec5SDimitry Andric CCs[RTLIB::OEQ_F32] = ISD::SETEQ; 5420b57cec5SDimitry Andric CCs[RTLIB::OEQ_F64] = ISD::SETEQ; 5430b57cec5SDimitry Andric CCs[RTLIB::OEQ_F128] = ISD::SETEQ; 5440b57cec5SDimitry Andric CCs[RTLIB::OEQ_PPCF128] = ISD::SETEQ; 5450b57cec5SDimitry Andric CCs[RTLIB::UNE_F32] = ISD::SETNE; 5460b57cec5SDimitry Andric CCs[RTLIB::UNE_F64] = ISD::SETNE; 5470b57cec5SDimitry Andric CCs[RTLIB::UNE_F128] = ISD::SETNE; 5480b57cec5SDimitry Andric CCs[RTLIB::UNE_PPCF128] = ISD::SETNE; 5490b57cec5SDimitry Andric CCs[RTLIB::OGE_F32] = ISD::SETGE; 5500b57cec5SDimitry Andric CCs[RTLIB::OGE_F64] = ISD::SETGE; 5510b57cec5SDimitry Andric CCs[RTLIB::OGE_F128] = ISD::SETGE; 5520b57cec5SDimitry Andric CCs[RTLIB::OGE_PPCF128] = ISD::SETGE; 5530b57cec5SDimitry Andric CCs[RTLIB::OLT_F32] = ISD::SETLT; 5540b57cec5SDimitry Andric CCs[RTLIB::OLT_F64] = ISD::SETLT; 5550b57cec5SDimitry Andric CCs[RTLIB::OLT_F128] = ISD::SETLT; 5560b57cec5SDimitry Andric CCs[RTLIB::OLT_PPCF128] = ISD::SETLT; 5570b57cec5SDimitry Andric CCs[RTLIB::OLE_F32] = ISD::SETLE; 5580b57cec5SDimitry Andric CCs[RTLIB::OLE_F64] = ISD::SETLE; 5590b57cec5SDimitry Andric CCs[RTLIB::OLE_F128] = ISD::SETLE; 5600b57cec5SDimitry Andric CCs[RTLIB::OLE_PPCF128] = ISD::SETLE; 5610b57cec5SDimitry Andric CCs[RTLIB::OGT_F32] = ISD::SETGT; 5620b57cec5SDimitry Andric CCs[RTLIB::OGT_F64] = ISD::SETGT; 5630b57cec5SDimitry Andric CCs[RTLIB::OGT_F128] = ISD::SETGT; 5640b57cec5SDimitry Andric CCs[RTLIB::OGT_PPCF128] = ISD::SETGT; 5650b57cec5SDimitry Andric CCs[RTLIB::UO_F32] = ISD::SETNE; 5660b57cec5SDimitry Andric CCs[RTLIB::UO_F64] = ISD::SETNE; 5670b57cec5SDimitry Andric CCs[RTLIB::UO_F128] = ISD::SETNE; 5680b57cec5SDimitry Andric CCs[RTLIB::UO_PPCF128] = ISD::SETNE; 5690b57cec5SDimitry Andric } 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andric /// NOTE: The TargetMachine owns TLOF. 5720b57cec5SDimitry Andric TargetLoweringBase::TargetLoweringBase(const TargetMachine &tm) : TM(tm) { 5730b57cec5SDimitry Andric initActions(); 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric // Perform these initializations only once. 5760b57cec5SDimitry Andric MaxStoresPerMemset = MaxStoresPerMemcpy = MaxStoresPerMemmove = 5770b57cec5SDimitry Andric MaxLoadsPerMemcmp = 8; 5780b57cec5SDimitry Andric MaxGluedStoresPerMemcpy = 0; 5790b57cec5SDimitry Andric MaxStoresPerMemsetOptSize = MaxStoresPerMemcpyOptSize = 5800b57cec5SDimitry Andric MaxStoresPerMemmoveOptSize = MaxLoadsPerMemcmpOptSize = 4; 5810b57cec5SDimitry Andric HasMultipleConditionRegisters = false; 5820b57cec5SDimitry Andric HasExtractBitsInsn = false; 5830b57cec5SDimitry Andric JumpIsExpensive = JumpIsExpensiveOverride; 5840b57cec5SDimitry Andric PredictableSelectIsExpensive = false; 5850b57cec5SDimitry Andric EnableExtLdPromotion = false; 5860b57cec5SDimitry Andric StackPointerRegisterToSaveRestore = 0; 5870b57cec5SDimitry Andric BooleanContents = UndefinedBooleanContent; 5880b57cec5SDimitry Andric BooleanFloatContents = UndefinedBooleanContent; 5890b57cec5SDimitry Andric BooleanVectorContents = UndefinedBooleanContent; 5900b57cec5SDimitry Andric SchedPreferenceInfo = Sched::ILP; 5910b57cec5SDimitry Andric GatherAllAliasesMaxDepth = 18; 592480093f4SDimitry Andric IsStrictFPEnabled = DisableStrictNodeMutation; 5930b57cec5SDimitry Andric // TODO: the default will be switched to 0 in the next commit, along 5940b57cec5SDimitry Andric // with the Target-specific changes necessary. 5950b57cec5SDimitry Andric MaxAtomicSizeInBitsSupported = 1024; 5960b57cec5SDimitry Andric 5970b57cec5SDimitry Andric MinCmpXchgSizeInBits = 0; 5980b57cec5SDimitry Andric SupportsUnalignedAtomics = false; 5990b57cec5SDimitry Andric 6000b57cec5SDimitry Andric std::fill(std::begin(LibcallRoutineNames), std::end(LibcallRoutineNames), nullptr); 6010b57cec5SDimitry Andric 6020b57cec5SDimitry Andric InitLibcalls(TM.getTargetTriple()); 6030b57cec5SDimitry Andric InitCmpLibcallCCs(CmpLibcallCCs); 6040b57cec5SDimitry Andric } 6050b57cec5SDimitry Andric 6060b57cec5SDimitry Andric void TargetLoweringBase::initActions() { 6070b57cec5SDimitry Andric // All operations default to being supported. 6080b57cec5SDimitry Andric memset(OpActions, 0, sizeof(OpActions)); 6090b57cec5SDimitry Andric memset(LoadExtActions, 0, sizeof(LoadExtActions)); 6100b57cec5SDimitry Andric memset(TruncStoreActions, 0, sizeof(TruncStoreActions)); 6110b57cec5SDimitry Andric memset(IndexedModeActions, 0, sizeof(IndexedModeActions)); 6120b57cec5SDimitry Andric memset(CondCodeActions, 0, sizeof(CondCodeActions)); 6130b57cec5SDimitry Andric std::fill(std::begin(RegClassForVT), std::end(RegClassForVT), nullptr); 6140b57cec5SDimitry Andric std::fill(std::begin(TargetDAGCombineArray), 6150b57cec5SDimitry Andric std::end(TargetDAGCombineArray), 0); 6160b57cec5SDimitry Andric 6170b57cec5SDimitry Andric for (MVT VT : MVT::fp_valuetypes()) { 6185ffd83dbSDimitry Andric MVT IntVT = MVT::getIntegerVT(VT.getSizeInBits().getFixedSize()); 6190b57cec5SDimitry Andric if (IntVT.isValid()) { 6200b57cec5SDimitry Andric setOperationAction(ISD::ATOMIC_SWAP, VT, Promote); 6210b57cec5SDimitry Andric AddPromotedToType(ISD::ATOMIC_SWAP, VT, IntVT); 6220b57cec5SDimitry Andric } 6230b57cec5SDimitry Andric } 6240b57cec5SDimitry Andric 6250b57cec5SDimitry Andric // Set default actions for various operations. 6260b57cec5SDimitry Andric for (MVT VT : MVT::all_valuetypes()) { 6270b57cec5SDimitry Andric // Default all indexed load / store to expand. 6280b57cec5SDimitry Andric for (unsigned IM = (unsigned)ISD::PRE_INC; 6290b57cec5SDimitry Andric IM != (unsigned)ISD::LAST_INDEXED_MODE; ++IM) { 6300b57cec5SDimitry Andric setIndexedLoadAction(IM, VT, Expand); 6310b57cec5SDimitry Andric setIndexedStoreAction(IM, VT, Expand); 632480093f4SDimitry Andric setIndexedMaskedLoadAction(IM, VT, Expand); 633480093f4SDimitry Andric setIndexedMaskedStoreAction(IM, VT, Expand); 6340b57cec5SDimitry Andric } 6350b57cec5SDimitry Andric 6360b57cec5SDimitry Andric // Most backends expect to see the node which just returns the value loaded. 6370b57cec5SDimitry Andric setOperationAction(ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, VT, Expand); 6380b57cec5SDimitry Andric 6390b57cec5SDimitry Andric // These operations default to expand. 6400b57cec5SDimitry Andric setOperationAction(ISD::FGETSIGN, VT, Expand); 6410b57cec5SDimitry Andric setOperationAction(ISD::CONCAT_VECTORS, VT, Expand); 6420b57cec5SDimitry Andric setOperationAction(ISD::FMINNUM, VT, Expand); 6430b57cec5SDimitry Andric setOperationAction(ISD::FMAXNUM, VT, Expand); 6440b57cec5SDimitry Andric setOperationAction(ISD::FMINNUM_IEEE, VT, Expand); 6450b57cec5SDimitry Andric setOperationAction(ISD::FMAXNUM_IEEE, VT, Expand); 6460b57cec5SDimitry Andric setOperationAction(ISD::FMINIMUM, VT, Expand); 6470b57cec5SDimitry Andric setOperationAction(ISD::FMAXIMUM, VT, Expand); 6480b57cec5SDimitry Andric setOperationAction(ISD::FMAD, VT, Expand); 6490b57cec5SDimitry Andric setOperationAction(ISD::SMIN, VT, Expand); 6500b57cec5SDimitry Andric setOperationAction(ISD::SMAX, VT, Expand); 6510b57cec5SDimitry Andric setOperationAction(ISD::UMIN, VT, Expand); 6520b57cec5SDimitry Andric setOperationAction(ISD::UMAX, VT, Expand); 6530b57cec5SDimitry Andric setOperationAction(ISD::ABS, VT, Expand); 6540b57cec5SDimitry Andric setOperationAction(ISD::FSHL, VT, Expand); 6550b57cec5SDimitry Andric setOperationAction(ISD::FSHR, VT, Expand); 6560b57cec5SDimitry Andric setOperationAction(ISD::SADDSAT, VT, Expand); 6570b57cec5SDimitry Andric setOperationAction(ISD::UADDSAT, VT, Expand); 6580b57cec5SDimitry Andric setOperationAction(ISD::SSUBSAT, VT, Expand); 6590b57cec5SDimitry Andric setOperationAction(ISD::USUBSAT, VT, Expand); 6600b57cec5SDimitry Andric setOperationAction(ISD::SMULFIX, VT, Expand); 6610b57cec5SDimitry Andric setOperationAction(ISD::SMULFIXSAT, VT, Expand); 6620b57cec5SDimitry Andric setOperationAction(ISD::UMULFIX, VT, Expand); 6638bcb0991SDimitry Andric setOperationAction(ISD::UMULFIXSAT, VT, Expand); 664480093f4SDimitry Andric setOperationAction(ISD::SDIVFIX, VT, Expand); 6655ffd83dbSDimitry Andric setOperationAction(ISD::SDIVFIXSAT, VT, Expand); 666480093f4SDimitry Andric setOperationAction(ISD::UDIVFIX, VT, Expand); 6675ffd83dbSDimitry Andric setOperationAction(ISD::UDIVFIXSAT, VT, Expand); 6680b57cec5SDimitry Andric 6690b57cec5SDimitry Andric // Overflow operations default to expand 6700b57cec5SDimitry Andric setOperationAction(ISD::SADDO, VT, Expand); 6710b57cec5SDimitry Andric setOperationAction(ISD::SSUBO, VT, Expand); 6720b57cec5SDimitry Andric setOperationAction(ISD::UADDO, VT, Expand); 6730b57cec5SDimitry Andric setOperationAction(ISD::USUBO, VT, Expand); 6740b57cec5SDimitry Andric setOperationAction(ISD::SMULO, VT, Expand); 6750b57cec5SDimitry Andric setOperationAction(ISD::UMULO, VT, Expand); 6760b57cec5SDimitry Andric 6770b57cec5SDimitry Andric // ADDCARRY operations default to expand 6780b57cec5SDimitry Andric setOperationAction(ISD::ADDCARRY, VT, Expand); 6790b57cec5SDimitry Andric setOperationAction(ISD::SUBCARRY, VT, Expand); 6800b57cec5SDimitry Andric setOperationAction(ISD::SETCCCARRY, VT, Expand); 6810b57cec5SDimitry Andric 6820b57cec5SDimitry Andric // ADDC/ADDE/SUBC/SUBE default to expand. 6830b57cec5SDimitry Andric setOperationAction(ISD::ADDC, VT, Expand); 6840b57cec5SDimitry Andric setOperationAction(ISD::ADDE, VT, Expand); 6850b57cec5SDimitry Andric setOperationAction(ISD::SUBC, VT, Expand); 6860b57cec5SDimitry Andric setOperationAction(ISD::SUBE, VT, Expand); 6870b57cec5SDimitry Andric 6880b57cec5SDimitry Andric // These default to Expand so they will be expanded to CTLZ/CTTZ by default. 6890b57cec5SDimitry Andric setOperationAction(ISD::CTLZ_ZERO_UNDEF, VT, Expand); 6900b57cec5SDimitry Andric setOperationAction(ISD::CTTZ_ZERO_UNDEF, VT, Expand); 6910b57cec5SDimitry Andric 6920b57cec5SDimitry Andric setOperationAction(ISD::BITREVERSE, VT, Expand); 6930b57cec5SDimitry Andric 6940b57cec5SDimitry Andric // These library functions default to expand. 6950b57cec5SDimitry Andric setOperationAction(ISD::FROUND, VT, Expand); 6965ffd83dbSDimitry Andric setOperationAction(ISD::FROUNDEVEN, VT, Expand); 6970b57cec5SDimitry Andric setOperationAction(ISD::FPOWI, VT, Expand); 6980b57cec5SDimitry Andric 6990b57cec5SDimitry Andric // These operations default to expand for vector types. 7000b57cec5SDimitry Andric if (VT.isVector()) { 7010b57cec5SDimitry Andric setOperationAction(ISD::FCOPYSIGN, VT, Expand); 702480093f4SDimitry Andric setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Expand); 7030b57cec5SDimitry Andric setOperationAction(ISD::ANY_EXTEND_VECTOR_INREG, VT, Expand); 7040b57cec5SDimitry Andric setOperationAction(ISD::SIGN_EXTEND_VECTOR_INREG, VT, Expand); 7050b57cec5SDimitry Andric setOperationAction(ISD::ZERO_EXTEND_VECTOR_INREG, VT, Expand); 7068bcb0991SDimitry Andric setOperationAction(ISD::SPLAT_VECTOR, VT, Expand); 7070b57cec5SDimitry Andric } 7080b57cec5SDimitry Andric 7090b57cec5SDimitry Andric // Constrained floating-point operations default to expand. 7105ffd83dbSDimitry Andric #define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \ 711480093f4SDimitry Andric setOperationAction(ISD::STRICT_##DAGN, VT, Expand); 712480093f4SDimitry Andric #include "llvm/IR/ConstrainedOps.def" 7130b57cec5SDimitry Andric 7140b57cec5SDimitry Andric // For most targets @llvm.get.dynamic.area.offset just returns 0. 7150b57cec5SDimitry Andric setOperationAction(ISD::GET_DYNAMIC_AREA_OFFSET, VT, Expand); 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric // Vector reduction default to expand. 7180b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_FADD, VT, Expand); 7190b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_FMUL, VT, Expand); 7200b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_ADD, VT, Expand); 7210b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_MUL, VT, Expand); 7220b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_AND, VT, Expand); 7230b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_OR, VT, Expand); 7240b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_XOR, VT, Expand); 7250b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_SMAX, VT, Expand); 7260b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_SMIN, VT, Expand); 7270b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_UMAX, VT, Expand); 7280b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_UMIN, VT, Expand); 7290b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_FMAX, VT, Expand); 7300b57cec5SDimitry Andric setOperationAction(ISD::VECREDUCE_FMIN, VT, Expand); 7310b57cec5SDimitry Andric } 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andric // Most targets ignore the @llvm.prefetch intrinsic. 7340b57cec5SDimitry Andric setOperationAction(ISD::PREFETCH, MVT::Other, Expand); 7350b57cec5SDimitry Andric 7360b57cec5SDimitry Andric // Most targets also ignore the @llvm.readcyclecounter intrinsic. 7370b57cec5SDimitry Andric setOperationAction(ISD::READCYCLECOUNTER, MVT::i64, Expand); 7380b57cec5SDimitry Andric 7390b57cec5SDimitry Andric // ConstantFP nodes default to expand. Targets can either change this to 7400b57cec5SDimitry Andric // Legal, in which case all fp constants are legal, or use isFPImmLegal() 7410b57cec5SDimitry Andric // to optimize expansions for certain constants. 7420b57cec5SDimitry Andric setOperationAction(ISD::ConstantFP, MVT::f16, Expand); 7430b57cec5SDimitry Andric setOperationAction(ISD::ConstantFP, MVT::f32, Expand); 7440b57cec5SDimitry Andric setOperationAction(ISD::ConstantFP, MVT::f64, Expand); 7450b57cec5SDimitry Andric setOperationAction(ISD::ConstantFP, MVT::f80, Expand); 7460b57cec5SDimitry Andric setOperationAction(ISD::ConstantFP, MVT::f128, Expand); 7470b57cec5SDimitry Andric 7480b57cec5SDimitry Andric // These library functions default to expand. 7490b57cec5SDimitry Andric for (MVT VT : {MVT::f32, MVT::f64, MVT::f128}) { 7500b57cec5SDimitry Andric setOperationAction(ISD::FCBRT, VT, Expand); 7510b57cec5SDimitry Andric setOperationAction(ISD::FLOG , VT, Expand); 7520b57cec5SDimitry Andric setOperationAction(ISD::FLOG2, VT, Expand); 7530b57cec5SDimitry Andric setOperationAction(ISD::FLOG10, VT, Expand); 7540b57cec5SDimitry Andric setOperationAction(ISD::FEXP , VT, Expand); 7550b57cec5SDimitry Andric setOperationAction(ISD::FEXP2, VT, Expand); 7560b57cec5SDimitry Andric setOperationAction(ISD::FFLOOR, VT, Expand); 7570b57cec5SDimitry Andric setOperationAction(ISD::FNEARBYINT, VT, Expand); 7580b57cec5SDimitry Andric setOperationAction(ISD::FCEIL, VT, Expand); 7590b57cec5SDimitry Andric setOperationAction(ISD::FRINT, VT, Expand); 7600b57cec5SDimitry Andric setOperationAction(ISD::FTRUNC, VT, Expand); 7610b57cec5SDimitry Andric setOperationAction(ISD::FROUND, VT, Expand); 7625ffd83dbSDimitry Andric setOperationAction(ISD::FROUNDEVEN, VT, Expand); 7630b57cec5SDimitry Andric setOperationAction(ISD::LROUND, VT, Expand); 7640b57cec5SDimitry Andric setOperationAction(ISD::LLROUND, VT, Expand); 7650b57cec5SDimitry Andric setOperationAction(ISD::LRINT, VT, Expand); 7660b57cec5SDimitry Andric setOperationAction(ISD::LLRINT, VT, Expand); 7670b57cec5SDimitry Andric } 7680b57cec5SDimitry Andric 7690b57cec5SDimitry Andric // Default ISD::TRAP to expand (which turns it into abort). 7700b57cec5SDimitry Andric setOperationAction(ISD::TRAP, MVT::Other, Expand); 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andric // On most systems, DEBUGTRAP and TRAP have no difference. The "Expand" 7730b57cec5SDimitry Andric // here is to inform DAG Legalizer to replace DEBUGTRAP with TRAP. 7740b57cec5SDimitry Andric setOperationAction(ISD::DEBUGTRAP, MVT::Other, Expand); 7750b57cec5SDimitry Andric } 7760b57cec5SDimitry Andric 7770b57cec5SDimitry Andric MVT TargetLoweringBase::getScalarShiftAmountTy(const DataLayout &DL, 7780b57cec5SDimitry Andric EVT) const { 7790b57cec5SDimitry Andric return MVT::getIntegerVT(DL.getPointerSizeInBits(0)); 7800b57cec5SDimitry Andric } 7810b57cec5SDimitry Andric 7820b57cec5SDimitry Andric EVT TargetLoweringBase::getShiftAmountTy(EVT LHSTy, const DataLayout &DL, 7830b57cec5SDimitry Andric bool LegalTypes) const { 7840b57cec5SDimitry Andric assert(LHSTy.isInteger() && "Shift amount is not an integer type!"); 7850b57cec5SDimitry Andric if (LHSTy.isVector()) 7860b57cec5SDimitry Andric return LHSTy; 7870b57cec5SDimitry Andric return LegalTypes ? getScalarShiftAmountTy(DL, LHSTy) 7880b57cec5SDimitry Andric : getPointerTy(DL); 7890b57cec5SDimitry Andric } 7900b57cec5SDimitry Andric 7910b57cec5SDimitry Andric bool TargetLoweringBase::canOpTrap(unsigned Op, EVT VT) const { 7920b57cec5SDimitry Andric assert(isTypeLegal(VT)); 7930b57cec5SDimitry Andric switch (Op) { 7940b57cec5SDimitry Andric default: 7950b57cec5SDimitry Andric return false; 7960b57cec5SDimitry Andric case ISD::SDIV: 7970b57cec5SDimitry Andric case ISD::UDIV: 7980b57cec5SDimitry Andric case ISD::SREM: 7990b57cec5SDimitry Andric case ISD::UREM: 8000b57cec5SDimitry Andric return true; 8010b57cec5SDimitry Andric } 8020b57cec5SDimitry Andric } 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric void TargetLoweringBase::setJumpIsExpensive(bool isExpensive) { 8050b57cec5SDimitry Andric // If the command-line option was specified, ignore this request. 8060b57cec5SDimitry Andric if (!JumpIsExpensiveOverride.getNumOccurrences()) 8070b57cec5SDimitry Andric JumpIsExpensive = isExpensive; 8080b57cec5SDimitry Andric } 8090b57cec5SDimitry Andric 8100b57cec5SDimitry Andric TargetLoweringBase::LegalizeKind 8110b57cec5SDimitry Andric TargetLoweringBase::getTypeConversion(LLVMContext &Context, EVT VT) const { 8120b57cec5SDimitry Andric // If this is a simple type, use the ComputeRegisterProp mechanism. 8130b57cec5SDimitry Andric if (VT.isSimple()) { 8140b57cec5SDimitry Andric MVT SVT = VT.getSimpleVT(); 8150b57cec5SDimitry Andric assert((unsigned)SVT.SimpleTy < array_lengthof(TransformToType)); 8160b57cec5SDimitry Andric MVT NVT = TransformToType[SVT.SimpleTy]; 8170b57cec5SDimitry Andric LegalizeTypeAction LA = ValueTypeActions.getTypeAction(SVT); 8180b57cec5SDimitry Andric 8190b57cec5SDimitry Andric assert((LA == TypeLegal || LA == TypeSoftenFloat || 8205ffd83dbSDimitry Andric LA == TypeSoftPromoteHalf || 8218bcb0991SDimitry Andric (NVT.isVector() || 8228bcb0991SDimitry Andric ValueTypeActions.getTypeAction(NVT) != TypePromoteInteger)) && 8230b57cec5SDimitry Andric "Promote may not follow Expand or Promote"); 8240b57cec5SDimitry Andric 8250b57cec5SDimitry Andric if (LA == TypeSplitVector) 8260b57cec5SDimitry Andric return LegalizeKind(LA, 8270b57cec5SDimitry Andric EVT::getVectorVT(Context, SVT.getVectorElementType(), 8285ffd83dbSDimitry Andric SVT.getVectorElementCount() / 2)); 8290b57cec5SDimitry Andric if (LA == TypeScalarizeVector) 8300b57cec5SDimitry Andric return LegalizeKind(LA, SVT.getVectorElementType()); 8310b57cec5SDimitry Andric return LegalizeKind(LA, NVT); 8320b57cec5SDimitry Andric } 8330b57cec5SDimitry Andric 8340b57cec5SDimitry Andric // Handle Extended Scalar Types. 8350b57cec5SDimitry Andric if (!VT.isVector()) { 8360b57cec5SDimitry Andric assert(VT.isInteger() && "Float types must be simple"); 8370b57cec5SDimitry Andric unsigned BitSize = VT.getSizeInBits(); 8380b57cec5SDimitry Andric // First promote to a power-of-two size, then expand if necessary. 8390b57cec5SDimitry Andric if (BitSize < 8 || !isPowerOf2_32(BitSize)) { 8400b57cec5SDimitry Andric EVT NVT = VT.getRoundIntegerType(Context); 8410b57cec5SDimitry Andric assert(NVT != VT && "Unable to round integer VT"); 8420b57cec5SDimitry Andric LegalizeKind NextStep = getTypeConversion(Context, NVT); 8430b57cec5SDimitry Andric // Avoid multi-step promotion. 8440b57cec5SDimitry Andric if (NextStep.first == TypePromoteInteger) 8450b57cec5SDimitry Andric return NextStep; 8460b57cec5SDimitry Andric // Return rounded integer type. 8470b57cec5SDimitry Andric return LegalizeKind(TypePromoteInteger, NVT); 8480b57cec5SDimitry Andric } 8490b57cec5SDimitry Andric 8500b57cec5SDimitry Andric return LegalizeKind(TypeExpandInteger, 8510b57cec5SDimitry Andric EVT::getIntegerVT(Context, VT.getSizeInBits() / 2)); 8520b57cec5SDimitry Andric } 8530b57cec5SDimitry Andric 8540b57cec5SDimitry Andric // Handle vector types. 8555ffd83dbSDimitry Andric ElementCount NumElts = VT.getVectorElementCount(); 8560b57cec5SDimitry Andric EVT EltVT = VT.getVectorElementType(); 8570b57cec5SDimitry Andric 8580b57cec5SDimitry Andric // Vectors with only one element are always scalarized. 8590b57cec5SDimitry Andric if (NumElts == 1) 8600b57cec5SDimitry Andric return LegalizeKind(TypeScalarizeVector, EltVT); 8610b57cec5SDimitry Andric 8625ffd83dbSDimitry Andric if (VT.getVectorElementCount() == ElementCount(1, true)) 8635ffd83dbSDimitry Andric report_fatal_error("Cannot legalize this vector"); 8645ffd83dbSDimitry Andric 8650b57cec5SDimitry Andric // Try to widen vector elements until the element type is a power of two and 8660b57cec5SDimitry Andric // promote it to a legal type later on, for example: 8670b57cec5SDimitry Andric // <3 x i8> -> <4 x i8> -> <4 x i32> 8680b57cec5SDimitry Andric if (EltVT.isInteger()) { 8690b57cec5SDimitry Andric // Vectors with a number of elements that is not a power of two are always 8700b57cec5SDimitry Andric // widened, for example <3 x i8> -> <4 x i8>. 8710b57cec5SDimitry Andric if (!VT.isPow2VectorType()) { 8725ffd83dbSDimitry Andric NumElts = NumElts.NextPowerOf2(); 8730b57cec5SDimitry Andric EVT NVT = EVT::getVectorVT(Context, EltVT, NumElts); 8740b57cec5SDimitry Andric return LegalizeKind(TypeWidenVector, NVT); 8750b57cec5SDimitry Andric } 8760b57cec5SDimitry Andric 8770b57cec5SDimitry Andric // Examine the element type. 8780b57cec5SDimitry Andric LegalizeKind LK = getTypeConversion(Context, EltVT); 8790b57cec5SDimitry Andric 8800b57cec5SDimitry Andric // If type is to be expanded, split the vector. 8810b57cec5SDimitry Andric // <4 x i140> -> <2 x i140> 8820b57cec5SDimitry Andric if (LK.first == TypeExpandInteger) 8830b57cec5SDimitry Andric return LegalizeKind(TypeSplitVector, 8840b57cec5SDimitry Andric EVT::getVectorVT(Context, EltVT, NumElts / 2)); 8850b57cec5SDimitry Andric 8860b57cec5SDimitry Andric // Promote the integer element types until a legal vector type is found 8870b57cec5SDimitry Andric // or until the element integer type is too big. If a legal type was not 8880b57cec5SDimitry Andric // found, fallback to the usual mechanism of widening/splitting the 8890b57cec5SDimitry Andric // vector. 8900b57cec5SDimitry Andric EVT OldEltVT = EltVT; 8910b57cec5SDimitry Andric while (true) { 8920b57cec5SDimitry Andric // Increase the bitwidth of the element to the next pow-of-two 8930b57cec5SDimitry Andric // (which is greater than 8 bits). 8940b57cec5SDimitry Andric EltVT = EVT::getIntegerVT(Context, 1 + EltVT.getSizeInBits()) 8950b57cec5SDimitry Andric .getRoundIntegerType(Context); 8960b57cec5SDimitry Andric 8970b57cec5SDimitry Andric // Stop trying when getting a non-simple element type. 8980b57cec5SDimitry Andric // Note that vector elements may be greater than legal vector element 8990b57cec5SDimitry Andric // types. Example: X86 XMM registers hold 64bit element on 32bit 9000b57cec5SDimitry Andric // systems. 9010b57cec5SDimitry Andric if (!EltVT.isSimple()) 9020b57cec5SDimitry Andric break; 9030b57cec5SDimitry Andric 9040b57cec5SDimitry Andric // Build a new vector type and check if it is legal. 9050b57cec5SDimitry Andric MVT NVT = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts); 9060b57cec5SDimitry Andric // Found a legal promoted vector type. 9070b57cec5SDimitry Andric if (NVT != MVT() && ValueTypeActions.getTypeAction(NVT) == TypeLegal) 9080b57cec5SDimitry Andric return LegalizeKind(TypePromoteInteger, 9090b57cec5SDimitry Andric EVT::getVectorVT(Context, EltVT, NumElts)); 9100b57cec5SDimitry Andric } 9110b57cec5SDimitry Andric 9120b57cec5SDimitry Andric // Reset the type to the unexpanded type if we did not find a legal vector 9130b57cec5SDimitry Andric // type with a promoted vector element type. 9140b57cec5SDimitry Andric EltVT = OldEltVT; 9150b57cec5SDimitry Andric } 9160b57cec5SDimitry Andric 9170b57cec5SDimitry Andric // Try to widen the vector until a legal type is found. 9180b57cec5SDimitry Andric // If there is no wider legal type, split the vector. 9190b57cec5SDimitry Andric while (true) { 9200b57cec5SDimitry Andric // Round up to the next power of 2. 9215ffd83dbSDimitry Andric NumElts = NumElts.NextPowerOf2(); 9220b57cec5SDimitry Andric 9230b57cec5SDimitry Andric // If there is no simple vector type with this many elements then there 9240b57cec5SDimitry Andric // cannot be a larger legal vector type. Note that this assumes that 9250b57cec5SDimitry Andric // there are no skipped intermediate vector types in the simple types. 9260b57cec5SDimitry Andric if (!EltVT.isSimple()) 9270b57cec5SDimitry Andric break; 9280b57cec5SDimitry Andric MVT LargerVector = MVT::getVectorVT(EltVT.getSimpleVT(), NumElts); 9290b57cec5SDimitry Andric if (LargerVector == MVT()) 9300b57cec5SDimitry Andric break; 9310b57cec5SDimitry Andric 9320b57cec5SDimitry Andric // If this type is legal then widen the vector. 9330b57cec5SDimitry Andric if (ValueTypeActions.getTypeAction(LargerVector) == TypeLegal) 9340b57cec5SDimitry Andric return LegalizeKind(TypeWidenVector, LargerVector); 9350b57cec5SDimitry Andric } 9360b57cec5SDimitry Andric 9370b57cec5SDimitry Andric // Widen odd vectors to next power of two. 9380b57cec5SDimitry Andric if (!VT.isPow2VectorType()) { 9390b57cec5SDimitry Andric EVT NVT = VT.getPow2VectorType(Context); 9400b57cec5SDimitry Andric return LegalizeKind(TypeWidenVector, NVT); 9410b57cec5SDimitry Andric } 9420b57cec5SDimitry Andric 9430b57cec5SDimitry Andric // Vectors with illegal element types are expanded. 9445ffd83dbSDimitry Andric EVT NVT = EVT::getVectorVT(Context, EltVT, VT.getVectorElementCount() / 2); 9450b57cec5SDimitry Andric return LegalizeKind(TypeSplitVector, NVT); 9460b57cec5SDimitry Andric } 9470b57cec5SDimitry Andric 9480b57cec5SDimitry Andric static unsigned getVectorTypeBreakdownMVT(MVT VT, MVT &IntermediateVT, 9490b57cec5SDimitry Andric unsigned &NumIntermediates, 9500b57cec5SDimitry Andric MVT &RegisterVT, 9510b57cec5SDimitry Andric TargetLoweringBase *TLI) { 9520b57cec5SDimitry Andric // Figure out the right, legal destination reg to copy into. 9535ffd83dbSDimitry Andric ElementCount EC = VT.getVectorElementCount(); 9540b57cec5SDimitry Andric MVT EltTy = VT.getVectorElementType(); 9550b57cec5SDimitry Andric 9560b57cec5SDimitry Andric unsigned NumVectorRegs = 1; 9570b57cec5SDimitry Andric 9585ffd83dbSDimitry Andric // Scalable vectors cannot be scalarized, so splitting or widening is 9595ffd83dbSDimitry Andric // required. 9605ffd83dbSDimitry Andric if (VT.isScalableVector() && !isPowerOf2_32(EC.Min)) 9615ffd83dbSDimitry Andric llvm_unreachable( 9625ffd83dbSDimitry Andric "Splitting or widening of non-power-of-2 MVTs is not implemented."); 9635ffd83dbSDimitry Andric 9645ffd83dbSDimitry Andric // FIXME: We don't support non-power-of-2-sized vectors for now. 9655ffd83dbSDimitry Andric // Ideally we could break down into LHS/RHS like LegalizeDAG does. 9665ffd83dbSDimitry Andric if (!isPowerOf2_32(EC.Min)) { 9675ffd83dbSDimitry Andric // Split EC to unit size (scalable property is preserved). 9685ffd83dbSDimitry Andric NumVectorRegs = EC.Min; 9695ffd83dbSDimitry Andric EC = EC / NumVectorRegs; 9700b57cec5SDimitry Andric } 9710b57cec5SDimitry Andric 9725ffd83dbSDimitry Andric // Divide the input until we get to a supported size. This will 9735ffd83dbSDimitry Andric // always end up with an EC that represent a scalar or a scalable 9745ffd83dbSDimitry Andric // scalar. 9755ffd83dbSDimitry Andric while (EC.Min > 1 && !TLI->isTypeLegal(MVT::getVectorVT(EltTy, EC))) { 9765ffd83dbSDimitry Andric EC.Min >>= 1; 9770b57cec5SDimitry Andric NumVectorRegs <<= 1; 9780b57cec5SDimitry Andric } 9790b57cec5SDimitry Andric 9800b57cec5SDimitry Andric NumIntermediates = NumVectorRegs; 9810b57cec5SDimitry Andric 9825ffd83dbSDimitry Andric MVT NewVT = MVT::getVectorVT(EltTy, EC); 9830b57cec5SDimitry Andric if (!TLI->isTypeLegal(NewVT)) 9840b57cec5SDimitry Andric NewVT = EltTy; 9850b57cec5SDimitry Andric IntermediateVT = NewVT; 9860b57cec5SDimitry Andric 9875ffd83dbSDimitry Andric unsigned LaneSizeInBits = NewVT.getScalarSizeInBits().getFixedSize(); 9880b57cec5SDimitry Andric 9890b57cec5SDimitry Andric // Convert sizes such as i33 to i64. 9905ffd83dbSDimitry Andric if (!isPowerOf2_32(LaneSizeInBits)) 9915ffd83dbSDimitry Andric LaneSizeInBits = NextPowerOf2(LaneSizeInBits); 9920b57cec5SDimitry Andric 9930b57cec5SDimitry Andric MVT DestVT = TLI->getRegisterType(NewVT); 9940b57cec5SDimitry Andric RegisterVT = DestVT; 9950b57cec5SDimitry Andric if (EVT(DestVT).bitsLT(NewVT)) // Value is expanded, e.g. i64 -> i16. 9965ffd83dbSDimitry Andric return NumVectorRegs * 9975ffd83dbSDimitry Andric (LaneSizeInBits / DestVT.getScalarSizeInBits().getFixedSize()); 9980b57cec5SDimitry Andric 9990b57cec5SDimitry Andric // Otherwise, promotion or legal types use the same number of registers as 10000b57cec5SDimitry Andric // the vector decimated to the appropriate level. 10010b57cec5SDimitry Andric return NumVectorRegs; 10020b57cec5SDimitry Andric } 10030b57cec5SDimitry Andric 10040b57cec5SDimitry Andric /// isLegalRC - Return true if the value types that can be represented by the 10050b57cec5SDimitry Andric /// specified register class are all legal. 10060b57cec5SDimitry Andric bool TargetLoweringBase::isLegalRC(const TargetRegisterInfo &TRI, 10070b57cec5SDimitry Andric const TargetRegisterClass &RC) const { 10080b57cec5SDimitry Andric for (auto I = TRI.legalclasstypes_begin(RC); *I != MVT::Other; ++I) 10090b57cec5SDimitry Andric if (isTypeLegal(*I)) 10100b57cec5SDimitry Andric return true; 10110b57cec5SDimitry Andric return false; 10120b57cec5SDimitry Andric } 10130b57cec5SDimitry Andric 10140b57cec5SDimitry Andric /// Replace/modify any TargetFrameIndex operands with a targte-dependent 10150b57cec5SDimitry Andric /// sequence of memory operands that is recognized by PrologEpilogInserter. 10160b57cec5SDimitry Andric MachineBasicBlock * 10170b57cec5SDimitry Andric TargetLoweringBase::emitPatchPoint(MachineInstr &InitialMI, 10180b57cec5SDimitry Andric MachineBasicBlock *MBB) const { 10190b57cec5SDimitry Andric MachineInstr *MI = &InitialMI; 10200b57cec5SDimitry Andric MachineFunction &MF = *MI->getMF(); 10210b57cec5SDimitry Andric MachineFrameInfo &MFI = MF.getFrameInfo(); 10220b57cec5SDimitry Andric 10230b57cec5SDimitry Andric // We're handling multiple types of operands here: 10240b57cec5SDimitry Andric // PATCHPOINT MetaArgs - live-in, read only, direct 10250b57cec5SDimitry Andric // STATEPOINT Deopt Spill - live-through, read only, indirect 10260b57cec5SDimitry Andric // STATEPOINT Deopt Alloca - live-through, read only, direct 10270b57cec5SDimitry Andric // (We're currently conservative and mark the deopt slots read/write in 10280b57cec5SDimitry Andric // practice.) 10290b57cec5SDimitry Andric // STATEPOINT GC Spill - live-through, read/write, indirect 10300b57cec5SDimitry Andric // STATEPOINT GC Alloca - live-through, read/write, direct 10310b57cec5SDimitry Andric // The live-in vs live-through is handled already (the live through ones are 10320b57cec5SDimitry Andric // all stack slots), but we need to handle the different type of stackmap 10330b57cec5SDimitry Andric // operands and memory effects here. 10340b57cec5SDimitry Andric 10355ffd83dbSDimitry Andric if (!llvm::any_of(MI->operands(), 10365ffd83dbSDimitry Andric [](MachineOperand &Operand) { return Operand.isFI(); })) 10375ffd83dbSDimitry Andric return MBB; 10385ffd83dbSDimitry Andric 10395ffd83dbSDimitry Andric MachineInstrBuilder MIB = BuildMI(MF, MI->getDebugLoc(), MI->getDesc()); 10405ffd83dbSDimitry Andric 10415ffd83dbSDimitry Andric // Inherit previous memory operands. 10425ffd83dbSDimitry Andric MIB.cloneMemRefs(*MI); 10435ffd83dbSDimitry Andric 10445ffd83dbSDimitry Andric for (auto &MO : MI->operands()) { 10455ffd83dbSDimitry Andric if (!MO.isFI()) { 10465ffd83dbSDimitry Andric MIB.add(MO); 10470b57cec5SDimitry Andric continue; 10485ffd83dbSDimitry Andric } 10490b57cec5SDimitry Andric 10500b57cec5SDimitry Andric // foldMemoryOperand builds a new MI after replacing a single FI operand 10510b57cec5SDimitry Andric // with the canonical set of five x86 addressing-mode operands. 10520b57cec5SDimitry Andric int FI = MO.getIndex(); 10530b57cec5SDimitry Andric 10540b57cec5SDimitry Andric // Add frame index operands recognized by stackmaps.cpp 10550b57cec5SDimitry Andric if (MFI.isStatepointSpillSlotObjectIndex(FI)) { 10560b57cec5SDimitry Andric // indirect-mem-ref tag, size, #FI, offset. 10570b57cec5SDimitry Andric // Used for spills inserted by StatepointLowering. This codepath is not 10580b57cec5SDimitry Andric // used for patchpoints/stackmaps at all, for these spilling is done via 10590b57cec5SDimitry Andric // foldMemoryOperand callback only. 10600b57cec5SDimitry Andric assert(MI->getOpcode() == TargetOpcode::STATEPOINT && "sanity"); 10610b57cec5SDimitry Andric MIB.addImm(StackMaps::IndirectMemRefOp); 10620b57cec5SDimitry Andric MIB.addImm(MFI.getObjectSize(FI)); 10635ffd83dbSDimitry Andric MIB.add(MO); 10640b57cec5SDimitry Andric MIB.addImm(0); 10650b57cec5SDimitry Andric } else { 10660b57cec5SDimitry Andric // direct-mem-ref tag, #FI, offset. 10670b57cec5SDimitry Andric // Used by patchpoint, and direct alloca arguments to statepoints 10680b57cec5SDimitry Andric MIB.addImm(StackMaps::DirectMemRefOp); 10695ffd83dbSDimitry Andric MIB.add(MO); 10700b57cec5SDimitry Andric MIB.addImm(0); 10710b57cec5SDimitry Andric } 10720b57cec5SDimitry Andric 10730b57cec5SDimitry Andric assert(MIB->mayLoad() && "Folded a stackmap use to a non-load!"); 10740b57cec5SDimitry Andric 10750b57cec5SDimitry Andric // Add a new memory operand for this FI. 10760b57cec5SDimitry Andric assert(MFI.getObjectOffset(FI) != -1); 10770b57cec5SDimitry Andric 10780b57cec5SDimitry Andric // Note: STATEPOINT MMOs are added during SelectionDAG. STACKMAP, and 10790b57cec5SDimitry Andric // PATCHPOINT should be updated to do the same. (TODO) 10800b57cec5SDimitry Andric if (MI->getOpcode() != TargetOpcode::STATEPOINT) { 10810b57cec5SDimitry Andric auto Flags = MachineMemOperand::MOLoad; 10820b57cec5SDimitry Andric MachineMemOperand *MMO = MF.getMachineMemOperand( 10830b57cec5SDimitry Andric MachinePointerInfo::getFixedStack(MF, FI), Flags, 10845ffd83dbSDimitry Andric MF.getDataLayout().getPointerSize(), MFI.getObjectAlign(FI)); 10850b57cec5SDimitry Andric MIB->addMemOperand(MF, MMO); 10860b57cec5SDimitry Andric } 10870b57cec5SDimitry Andric } 10885ffd83dbSDimitry Andric MBB->insert(MachineBasicBlock::iterator(MI), MIB); 10895ffd83dbSDimitry Andric MI->eraseFromParent(); 10900b57cec5SDimitry Andric return MBB; 10910b57cec5SDimitry Andric } 10920b57cec5SDimitry Andric 10930b57cec5SDimitry Andric MachineBasicBlock * 10940b57cec5SDimitry Andric TargetLoweringBase::emitXRayCustomEvent(MachineInstr &MI, 10950b57cec5SDimitry Andric MachineBasicBlock *MBB) const { 10960b57cec5SDimitry Andric assert(MI.getOpcode() == TargetOpcode::PATCHABLE_EVENT_CALL && 10970b57cec5SDimitry Andric "Called emitXRayCustomEvent on the wrong MI!"); 10980b57cec5SDimitry Andric auto &MF = *MI.getMF(); 10990b57cec5SDimitry Andric auto MIB = BuildMI(MF, MI.getDebugLoc(), MI.getDesc()); 11000b57cec5SDimitry Andric for (unsigned OpIdx = 0; OpIdx != MI.getNumOperands(); ++OpIdx) 11010b57cec5SDimitry Andric MIB.add(MI.getOperand(OpIdx)); 11020b57cec5SDimitry Andric 11030b57cec5SDimitry Andric MBB->insert(MachineBasicBlock::iterator(MI), MIB); 11040b57cec5SDimitry Andric MI.eraseFromParent(); 11050b57cec5SDimitry Andric return MBB; 11060b57cec5SDimitry Andric } 11070b57cec5SDimitry Andric 11080b57cec5SDimitry Andric MachineBasicBlock * 11090b57cec5SDimitry Andric TargetLoweringBase::emitXRayTypedEvent(MachineInstr &MI, 11100b57cec5SDimitry Andric MachineBasicBlock *MBB) const { 11110b57cec5SDimitry Andric assert(MI.getOpcode() == TargetOpcode::PATCHABLE_TYPED_EVENT_CALL && 11120b57cec5SDimitry Andric "Called emitXRayTypedEvent on the wrong MI!"); 11130b57cec5SDimitry Andric auto &MF = *MI.getMF(); 11140b57cec5SDimitry Andric auto MIB = BuildMI(MF, MI.getDebugLoc(), MI.getDesc()); 11150b57cec5SDimitry Andric for (unsigned OpIdx = 0; OpIdx != MI.getNumOperands(); ++OpIdx) 11160b57cec5SDimitry Andric MIB.add(MI.getOperand(OpIdx)); 11170b57cec5SDimitry Andric 11180b57cec5SDimitry Andric MBB->insert(MachineBasicBlock::iterator(MI), MIB); 11190b57cec5SDimitry Andric MI.eraseFromParent(); 11200b57cec5SDimitry Andric return MBB; 11210b57cec5SDimitry Andric } 11220b57cec5SDimitry Andric 11230b57cec5SDimitry Andric /// findRepresentativeClass - Return the largest legal super-reg register class 11240b57cec5SDimitry Andric /// of the register class for the specified type and its associated "cost". 11250b57cec5SDimitry Andric // This function is in TargetLowering because it uses RegClassForVT which would 11260b57cec5SDimitry Andric // need to be moved to TargetRegisterInfo and would necessitate moving 11270b57cec5SDimitry Andric // isTypeLegal over as well - a massive change that would just require 11280b57cec5SDimitry Andric // TargetLowering having a TargetRegisterInfo class member that it would use. 11290b57cec5SDimitry Andric std::pair<const TargetRegisterClass *, uint8_t> 11300b57cec5SDimitry Andric TargetLoweringBase::findRepresentativeClass(const TargetRegisterInfo *TRI, 11310b57cec5SDimitry Andric MVT VT) const { 11320b57cec5SDimitry Andric const TargetRegisterClass *RC = RegClassForVT[VT.SimpleTy]; 11330b57cec5SDimitry Andric if (!RC) 11340b57cec5SDimitry Andric return std::make_pair(RC, 0); 11350b57cec5SDimitry Andric 11360b57cec5SDimitry Andric // Compute the set of all super-register classes. 11370b57cec5SDimitry Andric BitVector SuperRegRC(TRI->getNumRegClasses()); 11380b57cec5SDimitry Andric for (SuperRegClassIterator RCI(RC, TRI); RCI.isValid(); ++RCI) 11390b57cec5SDimitry Andric SuperRegRC.setBitsInMask(RCI.getMask()); 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andric // Find the first legal register class with the largest spill size. 11420b57cec5SDimitry Andric const TargetRegisterClass *BestRC = RC; 11430b57cec5SDimitry Andric for (unsigned i : SuperRegRC.set_bits()) { 11440b57cec5SDimitry Andric const TargetRegisterClass *SuperRC = TRI->getRegClass(i); 11450b57cec5SDimitry Andric // We want the largest possible spill size. 11460b57cec5SDimitry Andric if (TRI->getSpillSize(*SuperRC) <= TRI->getSpillSize(*BestRC)) 11470b57cec5SDimitry Andric continue; 11480b57cec5SDimitry Andric if (!isLegalRC(*TRI, *SuperRC)) 11490b57cec5SDimitry Andric continue; 11500b57cec5SDimitry Andric BestRC = SuperRC; 11510b57cec5SDimitry Andric } 11520b57cec5SDimitry Andric return std::make_pair(BestRC, 1); 11530b57cec5SDimitry Andric } 11540b57cec5SDimitry Andric 11550b57cec5SDimitry Andric /// computeRegisterProperties - Once all of the register classes are added, 11560b57cec5SDimitry Andric /// this allows us to compute derived properties we expose. 11570b57cec5SDimitry Andric void TargetLoweringBase::computeRegisterProperties( 11580b57cec5SDimitry Andric const TargetRegisterInfo *TRI) { 11590b57cec5SDimitry Andric static_assert(MVT::LAST_VALUETYPE <= MVT::MAX_ALLOWED_VALUETYPE, 11600b57cec5SDimitry Andric "Too many value types for ValueTypeActions to hold!"); 11610b57cec5SDimitry Andric 11620b57cec5SDimitry Andric // Everything defaults to needing one register. 11630b57cec5SDimitry Andric for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) { 11640b57cec5SDimitry Andric NumRegistersForVT[i] = 1; 11650b57cec5SDimitry Andric RegisterTypeForVT[i] = TransformToType[i] = (MVT::SimpleValueType)i; 11660b57cec5SDimitry Andric } 11670b57cec5SDimitry Andric // ...except isVoid, which doesn't need any registers. 11680b57cec5SDimitry Andric NumRegistersForVT[MVT::isVoid] = 0; 11690b57cec5SDimitry Andric 11700b57cec5SDimitry Andric // Find the largest integer register class. 11710b57cec5SDimitry Andric unsigned LargestIntReg = MVT::LAST_INTEGER_VALUETYPE; 11720b57cec5SDimitry Andric for (; RegClassForVT[LargestIntReg] == nullptr; --LargestIntReg) 11730b57cec5SDimitry Andric assert(LargestIntReg != MVT::i1 && "No integer registers defined!"); 11740b57cec5SDimitry Andric 11750b57cec5SDimitry Andric // Every integer value type larger than this largest register takes twice as 11760b57cec5SDimitry Andric // many registers to represent as the previous ValueType. 11770b57cec5SDimitry Andric for (unsigned ExpandedReg = LargestIntReg + 1; 11780b57cec5SDimitry Andric ExpandedReg <= MVT::LAST_INTEGER_VALUETYPE; ++ExpandedReg) { 11790b57cec5SDimitry Andric NumRegistersForVT[ExpandedReg] = 2*NumRegistersForVT[ExpandedReg-1]; 11800b57cec5SDimitry Andric RegisterTypeForVT[ExpandedReg] = (MVT::SimpleValueType)LargestIntReg; 11810b57cec5SDimitry Andric TransformToType[ExpandedReg] = (MVT::SimpleValueType)(ExpandedReg - 1); 11820b57cec5SDimitry Andric ValueTypeActions.setTypeAction((MVT::SimpleValueType)ExpandedReg, 11830b57cec5SDimitry Andric TypeExpandInteger); 11840b57cec5SDimitry Andric } 11850b57cec5SDimitry Andric 11860b57cec5SDimitry Andric // Inspect all of the ValueType's smaller than the largest integer 11870b57cec5SDimitry Andric // register to see which ones need promotion. 11880b57cec5SDimitry Andric unsigned LegalIntReg = LargestIntReg; 11890b57cec5SDimitry Andric for (unsigned IntReg = LargestIntReg - 1; 11900b57cec5SDimitry Andric IntReg >= (unsigned)MVT::i1; --IntReg) { 11910b57cec5SDimitry Andric MVT IVT = (MVT::SimpleValueType)IntReg; 11920b57cec5SDimitry Andric if (isTypeLegal(IVT)) { 11930b57cec5SDimitry Andric LegalIntReg = IntReg; 11940b57cec5SDimitry Andric } else { 11950b57cec5SDimitry Andric RegisterTypeForVT[IntReg] = TransformToType[IntReg] = 11960b57cec5SDimitry Andric (MVT::SimpleValueType)LegalIntReg; 11970b57cec5SDimitry Andric ValueTypeActions.setTypeAction(IVT, TypePromoteInteger); 11980b57cec5SDimitry Andric } 11990b57cec5SDimitry Andric } 12000b57cec5SDimitry Andric 12010b57cec5SDimitry Andric // ppcf128 type is really two f64's. 12020b57cec5SDimitry Andric if (!isTypeLegal(MVT::ppcf128)) { 12030b57cec5SDimitry Andric if (isTypeLegal(MVT::f64)) { 12040b57cec5SDimitry Andric NumRegistersForVT[MVT::ppcf128] = 2*NumRegistersForVT[MVT::f64]; 12050b57cec5SDimitry Andric RegisterTypeForVT[MVT::ppcf128] = MVT::f64; 12060b57cec5SDimitry Andric TransformToType[MVT::ppcf128] = MVT::f64; 12070b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::ppcf128, TypeExpandFloat); 12080b57cec5SDimitry Andric } else { 12090b57cec5SDimitry Andric NumRegistersForVT[MVT::ppcf128] = NumRegistersForVT[MVT::i128]; 12100b57cec5SDimitry Andric RegisterTypeForVT[MVT::ppcf128] = RegisterTypeForVT[MVT::i128]; 12110b57cec5SDimitry Andric TransformToType[MVT::ppcf128] = MVT::i128; 12120b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::ppcf128, TypeSoftenFloat); 12130b57cec5SDimitry Andric } 12140b57cec5SDimitry Andric } 12150b57cec5SDimitry Andric 12160b57cec5SDimitry Andric // Decide how to handle f128. If the target does not have native f128 support, 12170b57cec5SDimitry Andric // expand it to i128 and we will be generating soft float library calls. 12180b57cec5SDimitry Andric if (!isTypeLegal(MVT::f128)) { 12190b57cec5SDimitry Andric NumRegistersForVT[MVT::f128] = NumRegistersForVT[MVT::i128]; 12200b57cec5SDimitry Andric RegisterTypeForVT[MVT::f128] = RegisterTypeForVT[MVT::i128]; 12210b57cec5SDimitry Andric TransformToType[MVT::f128] = MVT::i128; 12220b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::f128, TypeSoftenFloat); 12230b57cec5SDimitry Andric } 12240b57cec5SDimitry Andric 12250b57cec5SDimitry Andric // Decide how to handle f64. If the target does not have native f64 support, 12260b57cec5SDimitry Andric // expand it to i64 and we will be generating soft float library calls. 12270b57cec5SDimitry Andric if (!isTypeLegal(MVT::f64)) { 12280b57cec5SDimitry Andric NumRegistersForVT[MVT::f64] = NumRegistersForVT[MVT::i64]; 12290b57cec5SDimitry Andric RegisterTypeForVT[MVT::f64] = RegisterTypeForVT[MVT::i64]; 12300b57cec5SDimitry Andric TransformToType[MVT::f64] = MVT::i64; 12310b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::f64, TypeSoftenFloat); 12320b57cec5SDimitry Andric } 12330b57cec5SDimitry Andric 12340b57cec5SDimitry Andric // Decide how to handle f32. If the target does not have native f32 support, 12350b57cec5SDimitry Andric // expand it to i32 and we will be generating soft float library calls. 12360b57cec5SDimitry Andric if (!isTypeLegal(MVT::f32)) { 12370b57cec5SDimitry Andric NumRegistersForVT[MVT::f32] = NumRegistersForVT[MVT::i32]; 12380b57cec5SDimitry Andric RegisterTypeForVT[MVT::f32] = RegisterTypeForVT[MVT::i32]; 12390b57cec5SDimitry Andric TransformToType[MVT::f32] = MVT::i32; 12400b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::f32, TypeSoftenFloat); 12410b57cec5SDimitry Andric } 12420b57cec5SDimitry Andric 12430b57cec5SDimitry Andric // Decide how to handle f16. If the target does not have native f16 support, 12440b57cec5SDimitry Andric // promote it to f32, because there are no f16 library calls (except for 12450b57cec5SDimitry Andric // conversions). 12460b57cec5SDimitry Andric if (!isTypeLegal(MVT::f16)) { 12475ffd83dbSDimitry Andric // Allow targets to control how we legalize half. 12485ffd83dbSDimitry Andric if (softPromoteHalfType()) { 12495ffd83dbSDimitry Andric NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::i16]; 12505ffd83dbSDimitry Andric RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::i16]; 12515ffd83dbSDimitry Andric TransformToType[MVT::f16] = MVT::f32; 12525ffd83dbSDimitry Andric ValueTypeActions.setTypeAction(MVT::f16, TypeSoftPromoteHalf); 12535ffd83dbSDimitry Andric } else { 12540b57cec5SDimitry Andric NumRegistersForVT[MVT::f16] = NumRegistersForVT[MVT::f32]; 12550b57cec5SDimitry Andric RegisterTypeForVT[MVT::f16] = RegisterTypeForVT[MVT::f32]; 12560b57cec5SDimitry Andric TransformToType[MVT::f16] = MVT::f32; 12570b57cec5SDimitry Andric ValueTypeActions.setTypeAction(MVT::f16, TypePromoteFloat); 12580b57cec5SDimitry Andric } 12595ffd83dbSDimitry Andric } 12600b57cec5SDimitry Andric 12610b57cec5SDimitry Andric // Loop over all of the vector value types to see which need transformations. 12620b57cec5SDimitry Andric for (unsigned i = MVT::FIRST_VECTOR_VALUETYPE; 12630b57cec5SDimitry Andric i <= (unsigned)MVT::LAST_VECTOR_VALUETYPE; ++i) { 12640b57cec5SDimitry Andric MVT VT = (MVT::SimpleValueType) i; 12650b57cec5SDimitry Andric if (isTypeLegal(VT)) 12660b57cec5SDimitry Andric continue; 12670b57cec5SDimitry Andric 12680b57cec5SDimitry Andric MVT EltVT = VT.getVectorElementType(); 12695ffd83dbSDimitry Andric ElementCount EC = VT.getVectorElementCount(); 12700b57cec5SDimitry Andric bool IsLegalWiderType = false; 12718bcb0991SDimitry Andric bool IsScalable = VT.isScalableVector(); 12720b57cec5SDimitry Andric LegalizeTypeAction PreferredAction = getPreferredVectorAction(VT); 12730b57cec5SDimitry Andric switch (PreferredAction) { 12748bcb0991SDimitry Andric case TypePromoteInteger: { 12758bcb0991SDimitry Andric MVT::SimpleValueType EndVT = IsScalable ? 12768bcb0991SDimitry Andric MVT::LAST_INTEGER_SCALABLE_VECTOR_VALUETYPE : 12778bcb0991SDimitry Andric MVT::LAST_INTEGER_FIXEDLEN_VECTOR_VALUETYPE; 12780b57cec5SDimitry Andric // Try to promote the elements of integer vectors. If no legal 12790b57cec5SDimitry Andric // promotion was found, fall through to the widen-vector method. 12808bcb0991SDimitry Andric for (unsigned nVT = i + 1; 12818bcb0991SDimitry Andric (MVT::SimpleValueType)nVT <= EndVT; ++nVT) { 12820b57cec5SDimitry Andric MVT SVT = (MVT::SimpleValueType) nVT; 12830b57cec5SDimitry Andric // Promote vectors of integers to vectors with the same number 12840b57cec5SDimitry Andric // of elements, with a wider element type. 12850b57cec5SDimitry Andric if (SVT.getScalarSizeInBits() > EltVT.getSizeInBits() && 12865ffd83dbSDimitry Andric SVT.getVectorElementCount() == EC && isTypeLegal(SVT)) { 12870b57cec5SDimitry Andric TransformToType[i] = SVT; 12880b57cec5SDimitry Andric RegisterTypeForVT[i] = SVT; 12890b57cec5SDimitry Andric NumRegistersForVT[i] = 1; 12900b57cec5SDimitry Andric ValueTypeActions.setTypeAction(VT, TypePromoteInteger); 12910b57cec5SDimitry Andric IsLegalWiderType = true; 12920b57cec5SDimitry Andric break; 12930b57cec5SDimitry Andric } 12940b57cec5SDimitry Andric } 12950b57cec5SDimitry Andric if (IsLegalWiderType) 12960b57cec5SDimitry Andric break; 12970b57cec5SDimitry Andric LLVM_FALLTHROUGH; 12988bcb0991SDimitry Andric } 12990b57cec5SDimitry Andric 13000b57cec5SDimitry Andric case TypeWidenVector: 13015ffd83dbSDimitry Andric if (isPowerOf2_32(EC.Min)) { 13020b57cec5SDimitry Andric // Try to widen the vector. 13030b57cec5SDimitry Andric for (unsigned nVT = i + 1; nVT <= MVT::LAST_VECTOR_VALUETYPE; ++nVT) { 13040b57cec5SDimitry Andric MVT SVT = (MVT::SimpleValueType) nVT; 13055ffd83dbSDimitry Andric if (SVT.getVectorElementType() == EltVT && 13065ffd83dbSDimitry Andric SVT.isScalableVector() == IsScalable && 13075ffd83dbSDimitry Andric SVT.getVectorElementCount().Min > EC.Min && isTypeLegal(SVT)) { 13080b57cec5SDimitry Andric TransformToType[i] = SVT; 13090b57cec5SDimitry Andric RegisterTypeForVT[i] = SVT; 13100b57cec5SDimitry Andric NumRegistersForVT[i] = 1; 13110b57cec5SDimitry Andric ValueTypeActions.setTypeAction(VT, TypeWidenVector); 13120b57cec5SDimitry Andric IsLegalWiderType = true; 13130b57cec5SDimitry Andric break; 13140b57cec5SDimitry Andric } 13150b57cec5SDimitry Andric } 13160b57cec5SDimitry Andric if (IsLegalWiderType) 13170b57cec5SDimitry Andric break; 13188bcb0991SDimitry Andric } else { 13198bcb0991SDimitry Andric // Only widen to the next power of 2 to keep consistency with EVT. 13208bcb0991SDimitry Andric MVT NVT = VT.getPow2VectorType(); 13218bcb0991SDimitry Andric if (isTypeLegal(NVT)) { 13228bcb0991SDimitry Andric TransformToType[i] = NVT; 13238bcb0991SDimitry Andric ValueTypeActions.setTypeAction(VT, TypeWidenVector); 13248bcb0991SDimitry Andric RegisterTypeForVT[i] = NVT; 13258bcb0991SDimitry Andric NumRegistersForVT[i] = 1; 13268bcb0991SDimitry Andric break; 13278bcb0991SDimitry Andric } 13288bcb0991SDimitry Andric } 13290b57cec5SDimitry Andric LLVM_FALLTHROUGH; 13300b57cec5SDimitry Andric 13310b57cec5SDimitry Andric case TypeSplitVector: 13320b57cec5SDimitry Andric case TypeScalarizeVector: { 13330b57cec5SDimitry Andric MVT IntermediateVT; 13340b57cec5SDimitry Andric MVT RegisterVT; 13350b57cec5SDimitry Andric unsigned NumIntermediates; 1336480093f4SDimitry Andric unsigned NumRegisters = getVectorTypeBreakdownMVT(VT, IntermediateVT, 13370b57cec5SDimitry Andric NumIntermediates, RegisterVT, this); 1338480093f4SDimitry Andric NumRegistersForVT[i] = NumRegisters; 1339480093f4SDimitry Andric assert(NumRegistersForVT[i] == NumRegisters && 1340480093f4SDimitry Andric "NumRegistersForVT size cannot represent NumRegisters!"); 13410b57cec5SDimitry Andric RegisterTypeForVT[i] = RegisterVT; 13420b57cec5SDimitry Andric 13430b57cec5SDimitry Andric MVT NVT = VT.getPow2VectorType(); 13440b57cec5SDimitry Andric if (NVT == VT) { 13450b57cec5SDimitry Andric // Type is already a power of 2. The default action is to split. 13460b57cec5SDimitry Andric TransformToType[i] = MVT::Other; 13470b57cec5SDimitry Andric if (PreferredAction == TypeScalarizeVector) 13480b57cec5SDimitry Andric ValueTypeActions.setTypeAction(VT, TypeScalarizeVector); 13490b57cec5SDimitry Andric else if (PreferredAction == TypeSplitVector) 13500b57cec5SDimitry Andric ValueTypeActions.setTypeAction(VT, TypeSplitVector); 13515ffd83dbSDimitry Andric else if (EC.Min > 1) 13525ffd83dbSDimitry Andric ValueTypeActions.setTypeAction(VT, TypeSplitVector); 13530b57cec5SDimitry Andric else 13545ffd83dbSDimitry Andric ValueTypeActions.setTypeAction(VT, EC.Scalable 13555ffd83dbSDimitry Andric ? TypeScalarizeScalableVector 13565ffd83dbSDimitry Andric : TypeScalarizeVector); 13570b57cec5SDimitry Andric } else { 13580b57cec5SDimitry Andric TransformToType[i] = NVT; 13590b57cec5SDimitry Andric ValueTypeActions.setTypeAction(VT, TypeWidenVector); 13600b57cec5SDimitry Andric } 13610b57cec5SDimitry Andric break; 13620b57cec5SDimitry Andric } 13630b57cec5SDimitry Andric default: 13640b57cec5SDimitry Andric llvm_unreachable("Unknown vector legalization action!"); 13650b57cec5SDimitry Andric } 13660b57cec5SDimitry Andric } 13670b57cec5SDimitry Andric 13680b57cec5SDimitry Andric // Determine the 'representative' register class for each value type. 13690b57cec5SDimitry Andric // An representative register class is the largest (meaning one which is 13700b57cec5SDimitry Andric // not a sub-register class / subreg register class) legal register class for 13710b57cec5SDimitry Andric // a group of value types. For example, on i386, i8, i16, and i32 13720b57cec5SDimitry Andric // representative would be GR32; while on x86_64 it's GR64. 13730b57cec5SDimitry Andric for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) { 13740b57cec5SDimitry Andric const TargetRegisterClass* RRC; 13750b57cec5SDimitry Andric uint8_t Cost; 13760b57cec5SDimitry Andric std::tie(RRC, Cost) = findRepresentativeClass(TRI, (MVT::SimpleValueType)i); 13770b57cec5SDimitry Andric RepRegClassForVT[i] = RRC; 13780b57cec5SDimitry Andric RepRegClassCostForVT[i] = Cost; 13790b57cec5SDimitry Andric } 13800b57cec5SDimitry Andric } 13810b57cec5SDimitry Andric 13820b57cec5SDimitry Andric EVT TargetLoweringBase::getSetCCResultType(const DataLayout &DL, LLVMContext &, 13830b57cec5SDimitry Andric EVT VT) const { 13840b57cec5SDimitry Andric assert(!VT.isVector() && "No default SetCC type for vectors!"); 13850b57cec5SDimitry Andric return getPointerTy(DL).SimpleTy; 13860b57cec5SDimitry Andric } 13870b57cec5SDimitry Andric 13880b57cec5SDimitry Andric MVT::SimpleValueType TargetLoweringBase::getCmpLibcallReturnType() const { 13890b57cec5SDimitry Andric return MVT::i32; // return the default value 13900b57cec5SDimitry Andric } 13910b57cec5SDimitry Andric 13920b57cec5SDimitry Andric /// getVectorTypeBreakdown - Vector types are broken down into some number of 13930b57cec5SDimitry Andric /// legal first class types. For example, MVT::v8f32 maps to 2 MVT::v4f32 13940b57cec5SDimitry Andric /// with Altivec or SSE1, or 8 promoted MVT::f64 values with the X86 FP stack. 13950b57cec5SDimitry Andric /// Similarly, MVT::v2i64 turns into 4 MVT::i32 values with both PPC and X86. 13960b57cec5SDimitry Andric /// 13970b57cec5SDimitry Andric /// This method returns the number of registers needed, and the VT for each 13980b57cec5SDimitry Andric /// register. It also returns the VT and quantity of the intermediate values 13990b57cec5SDimitry Andric /// before they are promoted/expanded. 14000b57cec5SDimitry Andric unsigned TargetLoweringBase::getVectorTypeBreakdown(LLVMContext &Context, EVT VT, 14010b57cec5SDimitry Andric EVT &IntermediateVT, 14020b57cec5SDimitry Andric unsigned &NumIntermediates, 14030b57cec5SDimitry Andric MVT &RegisterVT) const { 14045ffd83dbSDimitry Andric ElementCount EltCnt = VT.getVectorElementCount(); 14050b57cec5SDimitry Andric 14060b57cec5SDimitry Andric // If there is a wider vector type with the same element type as this one, 14070b57cec5SDimitry Andric // or a promoted vector type that has the same number of elements which 14080b57cec5SDimitry Andric // are wider, then we should convert to that legal vector type. 14090b57cec5SDimitry Andric // This handles things like <2 x float> -> <4 x float> and 14100b57cec5SDimitry Andric // <4 x i1> -> <4 x i32>. 14110b57cec5SDimitry Andric LegalizeTypeAction TA = getTypeAction(Context, VT); 14125ffd83dbSDimitry Andric if (EltCnt.Min != 1 && (TA == TypeWidenVector || TA == TypePromoteInteger)) { 14130b57cec5SDimitry Andric EVT RegisterEVT = getTypeToTransformTo(Context, VT); 14140b57cec5SDimitry Andric if (isTypeLegal(RegisterEVT)) { 14150b57cec5SDimitry Andric IntermediateVT = RegisterEVT; 14160b57cec5SDimitry Andric RegisterVT = RegisterEVT.getSimpleVT(); 14170b57cec5SDimitry Andric NumIntermediates = 1; 14180b57cec5SDimitry Andric return 1; 14190b57cec5SDimitry Andric } 14200b57cec5SDimitry Andric } 14210b57cec5SDimitry Andric 14220b57cec5SDimitry Andric // Figure out the right, legal destination reg to copy into. 14230b57cec5SDimitry Andric EVT EltTy = VT.getVectorElementType(); 14240b57cec5SDimitry Andric 14250b57cec5SDimitry Andric unsigned NumVectorRegs = 1; 14260b57cec5SDimitry Andric 14275ffd83dbSDimitry Andric // Scalable vectors cannot be scalarized, so handle the legalisation of the 14285ffd83dbSDimitry Andric // types like done elsewhere in SelectionDAG. 14295ffd83dbSDimitry Andric if (VT.isScalableVector() && !isPowerOf2_32(EltCnt.Min)) { 14305ffd83dbSDimitry Andric LegalizeKind LK; 14315ffd83dbSDimitry Andric EVT PartVT = VT; 14325ffd83dbSDimitry Andric do { 14335ffd83dbSDimitry Andric // Iterate until we've found a legal (part) type to hold VT. 14345ffd83dbSDimitry Andric LK = getTypeConversion(Context, PartVT); 14355ffd83dbSDimitry Andric PartVT = LK.second; 14365ffd83dbSDimitry Andric } while (LK.first != TypeLegal); 14375ffd83dbSDimitry Andric 14385ffd83dbSDimitry Andric NumIntermediates = 14395ffd83dbSDimitry Andric VT.getVectorElementCount().Min / PartVT.getVectorElementCount().Min; 14405ffd83dbSDimitry Andric 14415ffd83dbSDimitry Andric // FIXME: This code needs to be extended to handle more complex vector 14425ffd83dbSDimitry Andric // breakdowns, like nxv7i64 -> nxv8i64 -> 4 x nxv2i64. Currently the only 14435ffd83dbSDimitry Andric // supported cases are vectors that are broken down into equal parts 14445ffd83dbSDimitry Andric // such as nxv6i64 -> 3 x nxv2i64. 14455ffd83dbSDimitry Andric assert(NumIntermediates * PartVT.getVectorElementCount().Min == 14465ffd83dbSDimitry Andric VT.getVectorElementCount().Min && 14475ffd83dbSDimitry Andric "Expected an integer multiple of PartVT"); 14485ffd83dbSDimitry Andric IntermediateVT = PartVT; 14495ffd83dbSDimitry Andric RegisterVT = getRegisterType(Context, IntermediateVT); 14505ffd83dbSDimitry Andric return NumIntermediates; 14515ffd83dbSDimitry Andric } 14525ffd83dbSDimitry Andric 14535ffd83dbSDimitry Andric // FIXME: We don't support non-power-of-2-sized vectors for now. Ideally 14545ffd83dbSDimitry Andric // we could break down into LHS/RHS like LegalizeDAG does. 14555ffd83dbSDimitry Andric if (!isPowerOf2_32(EltCnt.Min)) { 14565ffd83dbSDimitry Andric NumVectorRegs = EltCnt.Min; 14575ffd83dbSDimitry Andric EltCnt.Min = 1; 14580b57cec5SDimitry Andric } 14590b57cec5SDimitry Andric 14600b57cec5SDimitry Andric // Divide the input until we get to a supported size. This will always 14610b57cec5SDimitry Andric // end with a scalar if the target doesn't support vectors. 14625ffd83dbSDimitry Andric while (EltCnt.Min > 1 && 14635ffd83dbSDimitry Andric !isTypeLegal(EVT::getVectorVT(Context, EltTy, EltCnt))) { 14645ffd83dbSDimitry Andric EltCnt.Min >>= 1; 14650b57cec5SDimitry Andric NumVectorRegs <<= 1; 14660b57cec5SDimitry Andric } 14670b57cec5SDimitry Andric 14680b57cec5SDimitry Andric NumIntermediates = NumVectorRegs; 14690b57cec5SDimitry Andric 14705ffd83dbSDimitry Andric EVT NewVT = EVT::getVectorVT(Context, EltTy, EltCnt); 14710b57cec5SDimitry Andric if (!isTypeLegal(NewVT)) 14720b57cec5SDimitry Andric NewVT = EltTy; 14730b57cec5SDimitry Andric IntermediateVT = NewVT; 14740b57cec5SDimitry Andric 14750b57cec5SDimitry Andric MVT DestVT = getRegisterType(Context, NewVT); 14760b57cec5SDimitry Andric RegisterVT = DestVT; 14770b57cec5SDimitry Andric 14785ffd83dbSDimitry Andric if (EVT(DestVT).bitsLT(NewVT)) { // Value is expanded, e.g. i64 -> i16. 14795ffd83dbSDimitry Andric TypeSize NewVTSize = NewVT.getSizeInBits(); 14800b57cec5SDimitry Andric // Convert sizes such as i33 to i64. 14815ffd83dbSDimitry Andric if (!isPowerOf2_32(NewVTSize.getKnownMinSize())) 14825ffd83dbSDimitry Andric NewVTSize = NewVTSize.NextPowerOf2(); 14830b57cec5SDimitry Andric return NumVectorRegs*(NewVTSize/DestVT.getSizeInBits()); 14845ffd83dbSDimitry Andric } 14850b57cec5SDimitry Andric 14860b57cec5SDimitry Andric // Otherwise, promotion or legal types use the same number of registers as 14870b57cec5SDimitry Andric // the vector decimated to the appropriate level. 14880b57cec5SDimitry Andric return NumVectorRegs; 14890b57cec5SDimitry Andric } 14900b57cec5SDimitry Andric 1491480093f4SDimitry Andric bool TargetLoweringBase::isSuitableForJumpTable(const SwitchInst *SI, 1492480093f4SDimitry Andric uint64_t NumCases, 1493480093f4SDimitry Andric uint64_t Range, 1494480093f4SDimitry Andric ProfileSummaryInfo *PSI, 1495480093f4SDimitry Andric BlockFrequencyInfo *BFI) const { 1496480093f4SDimitry Andric // FIXME: This function check the maximum table size and density, but the 1497480093f4SDimitry Andric // minimum size is not checked. It would be nice if the minimum size is 1498480093f4SDimitry Andric // also combined within this function. Currently, the minimum size check is 1499480093f4SDimitry Andric // performed in findJumpTable() in SelectionDAGBuiler and 1500480093f4SDimitry Andric // getEstimatedNumberOfCaseClusters() in BasicTTIImpl. 1501480093f4SDimitry Andric const bool OptForSize = 1502480093f4SDimitry Andric SI->getParent()->getParent()->hasOptSize() || 1503480093f4SDimitry Andric llvm::shouldOptimizeForSize(SI->getParent(), PSI, BFI); 1504480093f4SDimitry Andric const unsigned MinDensity = getMinimumJumpTableDensity(OptForSize); 1505480093f4SDimitry Andric const unsigned MaxJumpTableSize = getMaximumJumpTableSize(); 1506480093f4SDimitry Andric 1507480093f4SDimitry Andric // Check whether the number of cases is small enough and 1508480093f4SDimitry Andric // the range is dense enough for a jump table. 1509480093f4SDimitry Andric return (OptForSize || Range <= MaxJumpTableSize) && 1510480093f4SDimitry Andric (NumCases * 100 >= Range * MinDensity); 1511480093f4SDimitry Andric } 1512480093f4SDimitry Andric 15130b57cec5SDimitry Andric /// Get the EVTs and ArgFlags collections that represent the legalized return 15140b57cec5SDimitry Andric /// type of the given function. This does not require a DAG or a return value, 15150b57cec5SDimitry Andric /// and is suitable for use before any DAGs for the function are constructed. 15160b57cec5SDimitry Andric /// TODO: Move this out of TargetLowering.cpp. 15170b57cec5SDimitry Andric void llvm::GetReturnInfo(CallingConv::ID CC, Type *ReturnType, 15180b57cec5SDimitry Andric AttributeList attr, 15190b57cec5SDimitry Andric SmallVectorImpl<ISD::OutputArg> &Outs, 15200b57cec5SDimitry Andric const TargetLowering &TLI, const DataLayout &DL) { 15210b57cec5SDimitry Andric SmallVector<EVT, 4> ValueVTs; 15220b57cec5SDimitry Andric ComputeValueVTs(TLI, DL, ReturnType, ValueVTs); 15230b57cec5SDimitry Andric unsigned NumValues = ValueVTs.size(); 15240b57cec5SDimitry Andric if (NumValues == 0) return; 15250b57cec5SDimitry Andric 15260b57cec5SDimitry Andric for (unsigned j = 0, f = NumValues; j != f; ++j) { 15270b57cec5SDimitry Andric EVT VT = ValueVTs[j]; 15280b57cec5SDimitry Andric ISD::NodeType ExtendKind = ISD::ANY_EXTEND; 15290b57cec5SDimitry Andric 15300b57cec5SDimitry Andric if (attr.hasAttribute(AttributeList::ReturnIndex, Attribute::SExt)) 15310b57cec5SDimitry Andric ExtendKind = ISD::SIGN_EXTEND; 15320b57cec5SDimitry Andric else if (attr.hasAttribute(AttributeList::ReturnIndex, Attribute::ZExt)) 15330b57cec5SDimitry Andric ExtendKind = ISD::ZERO_EXTEND; 15340b57cec5SDimitry Andric 15350b57cec5SDimitry Andric // FIXME: C calling convention requires the return type to be promoted to 15360b57cec5SDimitry Andric // at least 32-bit. But this is not necessary for non-C calling 15370b57cec5SDimitry Andric // conventions. The frontend should mark functions whose return values 15380b57cec5SDimitry Andric // require promoting with signext or zeroext attributes. 15390b57cec5SDimitry Andric if (ExtendKind != ISD::ANY_EXTEND && VT.isInteger()) { 15400b57cec5SDimitry Andric MVT MinVT = TLI.getRegisterType(ReturnType->getContext(), MVT::i32); 15410b57cec5SDimitry Andric if (VT.bitsLT(MinVT)) 15420b57cec5SDimitry Andric VT = MinVT; 15430b57cec5SDimitry Andric } 15440b57cec5SDimitry Andric 15450b57cec5SDimitry Andric unsigned NumParts = 15460b57cec5SDimitry Andric TLI.getNumRegistersForCallingConv(ReturnType->getContext(), CC, VT); 15470b57cec5SDimitry Andric MVT PartVT = 15480b57cec5SDimitry Andric TLI.getRegisterTypeForCallingConv(ReturnType->getContext(), CC, VT); 15490b57cec5SDimitry Andric 15500b57cec5SDimitry Andric // 'inreg' on function refers to return value 15510b57cec5SDimitry Andric ISD::ArgFlagsTy Flags = ISD::ArgFlagsTy(); 15520b57cec5SDimitry Andric if (attr.hasAttribute(AttributeList::ReturnIndex, Attribute::InReg)) 15530b57cec5SDimitry Andric Flags.setInReg(); 15540b57cec5SDimitry Andric 15550b57cec5SDimitry Andric // Propagate extension type if any 15560b57cec5SDimitry Andric if (attr.hasAttribute(AttributeList::ReturnIndex, Attribute::SExt)) 15570b57cec5SDimitry Andric Flags.setSExt(); 15580b57cec5SDimitry Andric else if (attr.hasAttribute(AttributeList::ReturnIndex, Attribute::ZExt)) 15590b57cec5SDimitry Andric Flags.setZExt(); 15600b57cec5SDimitry Andric 15610b57cec5SDimitry Andric for (unsigned i = 0; i < NumParts; ++i) 15620b57cec5SDimitry Andric Outs.push_back(ISD::OutputArg(Flags, PartVT, VT, /*isfixed=*/true, 0, 0)); 15630b57cec5SDimitry Andric } 15640b57cec5SDimitry Andric } 15650b57cec5SDimitry Andric 15660b57cec5SDimitry Andric /// getByValTypeAlignment - Return the desired alignment for ByVal aggregate 15670b57cec5SDimitry Andric /// function arguments in the caller parameter area. This is the actual 15680b57cec5SDimitry Andric /// alignment, not its logarithm. 15690b57cec5SDimitry Andric unsigned TargetLoweringBase::getByValTypeAlignment(Type *Ty, 15700b57cec5SDimitry Andric const DataLayout &DL) const { 15715ffd83dbSDimitry Andric return DL.getABITypeAlign(Ty).value(); 15720b57cec5SDimitry Andric } 15730b57cec5SDimitry Andric 15748bcb0991SDimitry Andric bool TargetLoweringBase::allowsMemoryAccessForAlignment( 15758bcb0991SDimitry Andric LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace, 15765ffd83dbSDimitry Andric Align Alignment, MachineMemOperand::Flags Flags, bool *Fast) const { 15770b57cec5SDimitry Andric // Check if the specified alignment is sufficient based on the data layout. 15780b57cec5SDimitry Andric // TODO: While using the data layout works in practice, a better solution 15790b57cec5SDimitry Andric // would be to implement this check directly (make this a virtual function). 15800b57cec5SDimitry Andric // For example, the ABI alignment may change based on software platform while 15810b57cec5SDimitry Andric // this function should only be affected by hardware implementation. 15820b57cec5SDimitry Andric Type *Ty = VT.getTypeForEVT(Context); 15835ffd83dbSDimitry Andric if (Alignment >= DL.getABITypeAlign(Ty)) { 15840b57cec5SDimitry Andric // Assume that an access that meets the ABI-specified alignment is fast. 15850b57cec5SDimitry Andric if (Fast != nullptr) 15860b57cec5SDimitry Andric *Fast = true; 15870b57cec5SDimitry Andric return true; 15880b57cec5SDimitry Andric } 15890b57cec5SDimitry Andric 15900b57cec5SDimitry Andric // This is a misaligned access. 15915ffd83dbSDimitry Andric return allowsMisalignedMemoryAccesses(VT, AddrSpace, Alignment.value(), Flags, 15925ffd83dbSDimitry Andric Fast); 15930b57cec5SDimitry Andric } 15940b57cec5SDimitry Andric 15958bcb0991SDimitry Andric bool TargetLoweringBase::allowsMemoryAccessForAlignment( 15968bcb0991SDimitry Andric LLVMContext &Context, const DataLayout &DL, EVT VT, 15978bcb0991SDimitry Andric const MachineMemOperand &MMO, bool *Fast) const { 15988bcb0991SDimitry Andric return allowsMemoryAccessForAlignment(Context, DL, VT, MMO.getAddrSpace(), 15995ffd83dbSDimitry Andric MMO.getAlign(), MMO.getFlags(), Fast); 16008bcb0991SDimitry Andric } 16018bcb0991SDimitry Andric 16025ffd83dbSDimitry Andric bool TargetLoweringBase::allowsMemoryAccess(LLVMContext &Context, 16035ffd83dbSDimitry Andric const DataLayout &DL, EVT VT, 16045ffd83dbSDimitry Andric unsigned AddrSpace, Align Alignment, 16055ffd83dbSDimitry Andric MachineMemOperand::Flags Flags, 16065ffd83dbSDimitry Andric bool *Fast) const { 16078bcb0991SDimitry Andric return allowsMemoryAccessForAlignment(Context, DL, VT, AddrSpace, Alignment, 16088bcb0991SDimitry Andric Flags, Fast); 16098bcb0991SDimitry Andric } 16108bcb0991SDimitry Andric 16110b57cec5SDimitry Andric bool TargetLoweringBase::allowsMemoryAccess(LLVMContext &Context, 16120b57cec5SDimitry Andric const DataLayout &DL, EVT VT, 16130b57cec5SDimitry Andric const MachineMemOperand &MMO, 16140b57cec5SDimitry Andric bool *Fast) const { 16155ffd83dbSDimitry Andric return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(), MMO.getAlign(), 16165ffd83dbSDimitry Andric MMO.getFlags(), Fast); 16170b57cec5SDimitry Andric } 16180b57cec5SDimitry Andric 16190b57cec5SDimitry Andric BranchProbability TargetLoweringBase::getPredictableBranchThreshold() const { 16200b57cec5SDimitry Andric return BranchProbability(MinPercentageForPredictableBranch, 100); 16210b57cec5SDimitry Andric } 16220b57cec5SDimitry Andric 16230b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 16240b57cec5SDimitry Andric // TargetTransformInfo Helpers 16250b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 16260b57cec5SDimitry Andric 16270b57cec5SDimitry Andric int TargetLoweringBase::InstructionOpcodeToISD(unsigned Opcode) const { 16280b57cec5SDimitry Andric enum InstructionOpcodes { 16290b57cec5SDimitry Andric #define HANDLE_INST(NUM, OPCODE, CLASS) OPCODE = NUM, 16300b57cec5SDimitry Andric #define LAST_OTHER_INST(NUM) InstructionOpcodesCount = NUM 16310b57cec5SDimitry Andric #include "llvm/IR/Instruction.def" 16320b57cec5SDimitry Andric }; 16330b57cec5SDimitry Andric switch (static_cast<InstructionOpcodes>(Opcode)) { 16340b57cec5SDimitry Andric case Ret: return 0; 16350b57cec5SDimitry Andric case Br: return 0; 16360b57cec5SDimitry Andric case Switch: return 0; 16370b57cec5SDimitry Andric case IndirectBr: return 0; 16380b57cec5SDimitry Andric case Invoke: return 0; 16390b57cec5SDimitry Andric case CallBr: return 0; 16400b57cec5SDimitry Andric case Resume: return 0; 16410b57cec5SDimitry Andric case Unreachable: return 0; 16420b57cec5SDimitry Andric case CleanupRet: return 0; 16430b57cec5SDimitry Andric case CatchRet: return 0; 16440b57cec5SDimitry Andric case CatchPad: return 0; 16450b57cec5SDimitry Andric case CatchSwitch: return 0; 16460b57cec5SDimitry Andric case CleanupPad: return 0; 16470b57cec5SDimitry Andric case FNeg: return ISD::FNEG; 16480b57cec5SDimitry Andric case Add: return ISD::ADD; 16490b57cec5SDimitry Andric case FAdd: return ISD::FADD; 16500b57cec5SDimitry Andric case Sub: return ISD::SUB; 16510b57cec5SDimitry Andric case FSub: return ISD::FSUB; 16520b57cec5SDimitry Andric case Mul: return ISD::MUL; 16530b57cec5SDimitry Andric case FMul: return ISD::FMUL; 16540b57cec5SDimitry Andric case UDiv: return ISD::UDIV; 16550b57cec5SDimitry Andric case SDiv: return ISD::SDIV; 16560b57cec5SDimitry Andric case FDiv: return ISD::FDIV; 16570b57cec5SDimitry Andric case URem: return ISD::UREM; 16580b57cec5SDimitry Andric case SRem: return ISD::SREM; 16590b57cec5SDimitry Andric case FRem: return ISD::FREM; 16600b57cec5SDimitry Andric case Shl: return ISD::SHL; 16610b57cec5SDimitry Andric case LShr: return ISD::SRL; 16620b57cec5SDimitry Andric case AShr: return ISD::SRA; 16630b57cec5SDimitry Andric case And: return ISD::AND; 16640b57cec5SDimitry Andric case Or: return ISD::OR; 16650b57cec5SDimitry Andric case Xor: return ISD::XOR; 16660b57cec5SDimitry Andric case Alloca: return 0; 16670b57cec5SDimitry Andric case Load: return ISD::LOAD; 16680b57cec5SDimitry Andric case Store: return ISD::STORE; 16690b57cec5SDimitry Andric case GetElementPtr: return 0; 16700b57cec5SDimitry Andric case Fence: return 0; 16710b57cec5SDimitry Andric case AtomicCmpXchg: return 0; 16720b57cec5SDimitry Andric case AtomicRMW: return 0; 16730b57cec5SDimitry Andric case Trunc: return ISD::TRUNCATE; 16740b57cec5SDimitry Andric case ZExt: return ISD::ZERO_EXTEND; 16750b57cec5SDimitry Andric case SExt: return ISD::SIGN_EXTEND; 16760b57cec5SDimitry Andric case FPToUI: return ISD::FP_TO_UINT; 16770b57cec5SDimitry Andric case FPToSI: return ISD::FP_TO_SINT; 16780b57cec5SDimitry Andric case UIToFP: return ISD::UINT_TO_FP; 16790b57cec5SDimitry Andric case SIToFP: return ISD::SINT_TO_FP; 16800b57cec5SDimitry Andric case FPTrunc: return ISD::FP_ROUND; 16810b57cec5SDimitry Andric case FPExt: return ISD::FP_EXTEND; 16820b57cec5SDimitry Andric case PtrToInt: return ISD::BITCAST; 16830b57cec5SDimitry Andric case IntToPtr: return ISD::BITCAST; 16840b57cec5SDimitry Andric case BitCast: return ISD::BITCAST; 16850b57cec5SDimitry Andric case AddrSpaceCast: return ISD::ADDRSPACECAST; 16860b57cec5SDimitry Andric case ICmp: return ISD::SETCC; 16870b57cec5SDimitry Andric case FCmp: return ISD::SETCC; 16880b57cec5SDimitry Andric case PHI: return 0; 16890b57cec5SDimitry Andric case Call: return 0; 16900b57cec5SDimitry Andric case Select: return ISD::SELECT; 16910b57cec5SDimitry Andric case UserOp1: return 0; 16920b57cec5SDimitry Andric case UserOp2: return 0; 16930b57cec5SDimitry Andric case VAArg: return 0; 16940b57cec5SDimitry Andric case ExtractElement: return ISD::EXTRACT_VECTOR_ELT; 16950b57cec5SDimitry Andric case InsertElement: return ISD::INSERT_VECTOR_ELT; 16960b57cec5SDimitry Andric case ShuffleVector: return ISD::VECTOR_SHUFFLE; 16970b57cec5SDimitry Andric case ExtractValue: return ISD::MERGE_VALUES; 16980b57cec5SDimitry Andric case InsertValue: return ISD::MERGE_VALUES; 16990b57cec5SDimitry Andric case LandingPad: return 0; 17005ffd83dbSDimitry Andric case Freeze: return ISD::FREEZE; 17010b57cec5SDimitry Andric } 17020b57cec5SDimitry Andric 17030b57cec5SDimitry Andric llvm_unreachable("Unknown instruction type encountered!"); 17040b57cec5SDimitry Andric } 17050b57cec5SDimitry Andric 17060b57cec5SDimitry Andric std::pair<int, MVT> 17070b57cec5SDimitry Andric TargetLoweringBase::getTypeLegalizationCost(const DataLayout &DL, 17080b57cec5SDimitry Andric Type *Ty) const { 17090b57cec5SDimitry Andric LLVMContext &C = Ty->getContext(); 17100b57cec5SDimitry Andric EVT MTy = getValueType(DL, Ty); 17110b57cec5SDimitry Andric 17120b57cec5SDimitry Andric int Cost = 1; 17130b57cec5SDimitry Andric // We keep legalizing the type until we find a legal kind. We assume that 17140b57cec5SDimitry Andric // the only operation that costs anything is the split. After splitting 17150b57cec5SDimitry Andric // we need to handle two types. 17160b57cec5SDimitry Andric while (true) { 17170b57cec5SDimitry Andric LegalizeKind LK = getTypeConversion(C, MTy); 17180b57cec5SDimitry Andric 17190b57cec5SDimitry Andric if (LK.first == TypeLegal) 17200b57cec5SDimitry Andric return std::make_pair(Cost, MTy.getSimpleVT()); 17210b57cec5SDimitry Andric 17220b57cec5SDimitry Andric if (LK.first == TypeSplitVector || LK.first == TypeExpandInteger) 17230b57cec5SDimitry Andric Cost *= 2; 17240b57cec5SDimitry Andric 17250b57cec5SDimitry Andric // Do not loop with f128 type. 17260b57cec5SDimitry Andric if (MTy == LK.second) 17270b57cec5SDimitry Andric return std::make_pair(Cost, MTy.getSimpleVT()); 17280b57cec5SDimitry Andric 17290b57cec5SDimitry Andric // Keep legalizing the type. 17300b57cec5SDimitry Andric MTy = LK.second; 17310b57cec5SDimitry Andric } 17320b57cec5SDimitry Andric } 17330b57cec5SDimitry Andric 17340b57cec5SDimitry Andric Value *TargetLoweringBase::getDefaultSafeStackPointerLocation(IRBuilder<> &IRB, 17350b57cec5SDimitry Andric bool UseTLS) const { 17360b57cec5SDimitry Andric // compiler-rt provides a variable with a magic name. Targets that do not 17370b57cec5SDimitry Andric // link with compiler-rt may also provide such a variable. 17380b57cec5SDimitry Andric Module *M = IRB.GetInsertBlock()->getParent()->getParent(); 17390b57cec5SDimitry Andric const char *UnsafeStackPtrVar = "__safestack_unsafe_stack_ptr"; 17400b57cec5SDimitry Andric auto UnsafeStackPtr = 17410b57cec5SDimitry Andric dyn_cast_or_null<GlobalVariable>(M->getNamedValue(UnsafeStackPtrVar)); 17420b57cec5SDimitry Andric 17430b57cec5SDimitry Andric Type *StackPtrTy = Type::getInt8PtrTy(M->getContext()); 17440b57cec5SDimitry Andric 17450b57cec5SDimitry Andric if (!UnsafeStackPtr) { 17460b57cec5SDimitry Andric auto TLSModel = UseTLS ? 17470b57cec5SDimitry Andric GlobalValue::InitialExecTLSModel : 17480b57cec5SDimitry Andric GlobalValue::NotThreadLocal; 17490b57cec5SDimitry Andric // The global variable is not defined yet, define it ourselves. 17500b57cec5SDimitry Andric // We use the initial-exec TLS model because we do not support the 17510b57cec5SDimitry Andric // variable living anywhere other than in the main executable. 17520b57cec5SDimitry Andric UnsafeStackPtr = new GlobalVariable( 17530b57cec5SDimitry Andric *M, StackPtrTy, false, GlobalValue::ExternalLinkage, nullptr, 17540b57cec5SDimitry Andric UnsafeStackPtrVar, nullptr, TLSModel); 17550b57cec5SDimitry Andric } else { 17560b57cec5SDimitry Andric // The variable exists, check its type and attributes. 17570b57cec5SDimitry Andric if (UnsafeStackPtr->getValueType() != StackPtrTy) 17580b57cec5SDimitry Andric report_fatal_error(Twine(UnsafeStackPtrVar) + " must have void* type"); 17590b57cec5SDimitry Andric if (UseTLS != UnsafeStackPtr->isThreadLocal()) 17600b57cec5SDimitry Andric report_fatal_error(Twine(UnsafeStackPtrVar) + " must " + 17610b57cec5SDimitry Andric (UseTLS ? "" : "not ") + "be thread-local"); 17620b57cec5SDimitry Andric } 17630b57cec5SDimitry Andric return UnsafeStackPtr; 17640b57cec5SDimitry Andric } 17650b57cec5SDimitry Andric 17660b57cec5SDimitry Andric Value *TargetLoweringBase::getSafeStackPointerLocation(IRBuilder<> &IRB) const { 17670b57cec5SDimitry Andric if (!TM.getTargetTriple().isAndroid()) 17680b57cec5SDimitry Andric return getDefaultSafeStackPointerLocation(IRB, true); 17690b57cec5SDimitry Andric 17700b57cec5SDimitry Andric // Android provides a libc function to retrieve the address of the current 17710b57cec5SDimitry Andric // thread's unsafe stack pointer. 17720b57cec5SDimitry Andric Module *M = IRB.GetInsertBlock()->getParent()->getParent(); 17730b57cec5SDimitry Andric Type *StackPtrTy = Type::getInt8PtrTy(M->getContext()); 17740b57cec5SDimitry Andric FunctionCallee Fn = M->getOrInsertFunction("__safestack_pointer_address", 17750b57cec5SDimitry Andric StackPtrTy->getPointerTo(0)); 17760b57cec5SDimitry Andric return IRB.CreateCall(Fn); 17770b57cec5SDimitry Andric } 17780b57cec5SDimitry Andric 17790b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 17800b57cec5SDimitry Andric // Loop Strength Reduction hooks 17810b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 17820b57cec5SDimitry Andric 17830b57cec5SDimitry Andric /// isLegalAddressingMode - Return true if the addressing mode represented 17840b57cec5SDimitry Andric /// by AM is legal for this target, for a load/store of the specified type. 17850b57cec5SDimitry Andric bool TargetLoweringBase::isLegalAddressingMode(const DataLayout &DL, 17860b57cec5SDimitry Andric const AddrMode &AM, Type *Ty, 17870b57cec5SDimitry Andric unsigned AS, Instruction *I) const { 17880b57cec5SDimitry Andric // The default implementation of this implements a conservative RISCy, r+r and 17890b57cec5SDimitry Andric // r+i addr mode. 17900b57cec5SDimitry Andric 17910b57cec5SDimitry Andric // Allows a sign-extended 16-bit immediate field. 17920b57cec5SDimitry Andric if (AM.BaseOffs <= -(1LL << 16) || AM.BaseOffs >= (1LL << 16)-1) 17930b57cec5SDimitry Andric return false; 17940b57cec5SDimitry Andric 17950b57cec5SDimitry Andric // No global is ever allowed as a base. 17960b57cec5SDimitry Andric if (AM.BaseGV) 17970b57cec5SDimitry Andric return false; 17980b57cec5SDimitry Andric 17990b57cec5SDimitry Andric // Only support r+r, 18000b57cec5SDimitry Andric switch (AM.Scale) { 18010b57cec5SDimitry Andric case 0: // "r+i" or just "i", depending on HasBaseReg. 18020b57cec5SDimitry Andric break; 18030b57cec5SDimitry Andric case 1: 18040b57cec5SDimitry Andric if (AM.HasBaseReg && AM.BaseOffs) // "r+r+i" is not allowed. 18050b57cec5SDimitry Andric return false; 18060b57cec5SDimitry Andric // Otherwise we have r+r or r+i. 18070b57cec5SDimitry Andric break; 18080b57cec5SDimitry Andric case 2: 18090b57cec5SDimitry Andric if (AM.HasBaseReg || AM.BaseOffs) // 2*r+r or 2*r+i is not allowed. 18100b57cec5SDimitry Andric return false; 18110b57cec5SDimitry Andric // Allow 2*r as r+r. 18120b57cec5SDimitry Andric break; 18130b57cec5SDimitry Andric default: // Don't allow n * r 18140b57cec5SDimitry Andric return false; 18150b57cec5SDimitry Andric } 18160b57cec5SDimitry Andric 18170b57cec5SDimitry Andric return true; 18180b57cec5SDimitry Andric } 18190b57cec5SDimitry Andric 18200b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 18210b57cec5SDimitry Andric // Stack Protector 18220b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 18230b57cec5SDimitry Andric 18240b57cec5SDimitry Andric // For OpenBSD return its special guard variable. Otherwise return nullptr, 18250b57cec5SDimitry Andric // so that SelectionDAG handle SSP. 18260b57cec5SDimitry Andric Value *TargetLoweringBase::getIRStackGuard(IRBuilder<> &IRB) const { 18270b57cec5SDimitry Andric if (getTargetMachine().getTargetTriple().isOSOpenBSD()) { 18280b57cec5SDimitry Andric Module &M = *IRB.GetInsertBlock()->getParent()->getParent(); 18290b57cec5SDimitry Andric PointerType *PtrTy = Type::getInt8PtrTy(M.getContext()); 1830*16d6b3b3SDimitry Andric Constant *C = M.getOrInsertGlobal("__guard_local", PtrTy); 1831*16d6b3b3SDimitry Andric if (GlobalVariable *G = dyn_cast_or_null<GlobalVariable>(C)) 1832*16d6b3b3SDimitry Andric G->setVisibility(GlobalValue::HiddenVisibility); 1833*16d6b3b3SDimitry Andric return C; 18340b57cec5SDimitry Andric } 18350b57cec5SDimitry Andric return nullptr; 18360b57cec5SDimitry Andric } 18370b57cec5SDimitry Andric 18380b57cec5SDimitry Andric // Currently only support "standard" __stack_chk_guard. 18390b57cec5SDimitry Andric // TODO: add LOAD_STACK_GUARD support. 18400b57cec5SDimitry Andric void TargetLoweringBase::insertSSPDeclarations(Module &M) const { 18410b57cec5SDimitry Andric if (!M.getNamedValue("__stack_chk_guard")) 18420b57cec5SDimitry Andric new GlobalVariable(M, Type::getInt8PtrTy(M.getContext()), false, 18430b57cec5SDimitry Andric GlobalVariable::ExternalLinkage, 18440b57cec5SDimitry Andric nullptr, "__stack_chk_guard"); 18450b57cec5SDimitry Andric } 18460b57cec5SDimitry Andric 18470b57cec5SDimitry Andric // Currently only support "standard" __stack_chk_guard. 18480b57cec5SDimitry Andric // TODO: add LOAD_STACK_GUARD support. 18490b57cec5SDimitry Andric Value *TargetLoweringBase::getSDagStackGuard(const Module &M) const { 18500b57cec5SDimitry Andric return M.getNamedValue("__stack_chk_guard"); 18510b57cec5SDimitry Andric } 18520b57cec5SDimitry Andric 18530b57cec5SDimitry Andric Function *TargetLoweringBase::getSSPStackGuardCheck(const Module &M) const { 18540b57cec5SDimitry Andric return nullptr; 18550b57cec5SDimitry Andric } 18560b57cec5SDimitry Andric 18570b57cec5SDimitry Andric unsigned TargetLoweringBase::getMinimumJumpTableEntries() const { 18580b57cec5SDimitry Andric return MinimumJumpTableEntries; 18590b57cec5SDimitry Andric } 18600b57cec5SDimitry Andric 18610b57cec5SDimitry Andric void TargetLoweringBase::setMinimumJumpTableEntries(unsigned Val) { 18620b57cec5SDimitry Andric MinimumJumpTableEntries = Val; 18630b57cec5SDimitry Andric } 18640b57cec5SDimitry Andric 18650b57cec5SDimitry Andric unsigned TargetLoweringBase::getMinimumJumpTableDensity(bool OptForSize) const { 18660b57cec5SDimitry Andric return OptForSize ? OptsizeJumpTableDensity : JumpTableDensity; 18670b57cec5SDimitry Andric } 18680b57cec5SDimitry Andric 18690b57cec5SDimitry Andric unsigned TargetLoweringBase::getMaximumJumpTableSize() const { 18700b57cec5SDimitry Andric return MaximumJumpTableSize; 18710b57cec5SDimitry Andric } 18720b57cec5SDimitry Andric 18730b57cec5SDimitry Andric void TargetLoweringBase::setMaximumJumpTableSize(unsigned Val) { 18740b57cec5SDimitry Andric MaximumJumpTableSize = Val; 18750b57cec5SDimitry Andric } 18760b57cec5SDimitry Andric 18775ffd83dbSDimitry Andric bool TargetLoweringBase::isJumpTableRelative() const { 18785ffd83dbSDimitry Andric return getTargetMachine().isPositionIndependent(); 18795ffd83dbSDimitry Andric } 18805ffd83dbSDimitry Andric 18810b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 18820b57cec5SDimitry Andric // Reciprocal Estimates 18830b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 18840b57cec5SDimitry Andric 18850b57cec5SDimitry Andric /// Get the reciprocal estimate attribute string for a function that will 18860b57cec5SDimitry Andric /// override the target defaults. 18870b57cec5SDimitry Andric static StringRef getRecipEstimateForFunc(MachineFunction &MF) { 18880b57cec5SDimitry Andric const Function &F = MF.getFunction(); 18890b57cec5SDimitry Andric return F.getFnAttribute("reciprocal-estimates").getValueAsString(); 18900b57cec5SDimitry Andric } 18910b57cec5SDimitry Andric 18920b57cec5SDimitry Andric /// Construct a string for the given reciprocal operation of the given type. 18930b57cec5SDimitry Andric /// This string should match the corresponding option to the front-end's 18940b57cec5SDimitry Andric /// "-mrecip" flag assuming those strings have been passed through in an 18950b57cec5SDimitry Andric /// attribute string. For example, "vec-divf" for a division of a vXf32. 18960b57cec5SDimitry Andric static std::string getReciprocalOpName(bool IsSqrt, EVT VT) { 18970b57cec5SDimitry Andric std::string Name = VT.isVector() ? "vec-" : ""; 18980b57cec5SDimitry Andric 18990b57cec5SDimitry Andric Name += IsSqrt ? "sqrt" : "div"; 19000b57cec5SDimitry Andric 19010b57cec5SDimitry Andric // TODO: Handle "half" or other float types? 19020b57cec5SDimitry Andric if (VT.getScalarType() == MVT::f64) { 19030b57cec5SDimitry Andric Name += "d"; 19040b57cec5SDimitry Andric } else { 19050b57cec5SDimitry Andric assert(VT.getScalarType() == MVT::f32 && 19060b57cec5SDimitry Andric "Unexpected FP type for reciprocal estimate"); 19070b57cec5SDimitry Andric Name += "f"; 19080b57cec5SDimitry Andric } 19090b57cec5SDimitry Andric 19100b57cec5SDimitry Andric return Name; 19110b57cec5SDimitry Andric } 19120b57cec5SDimitry Andric 19130b57cec5SDimitry Andric /// Return the character position and value (a single numeric character) of a 19140b57cec5SDimitry Andric /// customized refinement operation in the input string if it exists. Return 19150b57cec5SDimitry Andric /// false if there is no customized refinement step count. 19160b57cec5SDimitry Andric static bool parseRefinementStep(StringRef In, size_t &Position, 19170b57cec5SDimitry Andric uint8_t &Value) { 19180b57cec5SDimitry Andric const char RefStepToken = ':'; 19190b57cec5SDimitry Andric Position = In.find(RefStepToken); 19200b57cec5SDimitry Andric if (Position == StringRef::npos) 19210b57cec5SDimitry Andric return false; 19220b57cec5SDimitry Andric 19230b57cec5SDimitry Andric StringRef RefStepString = In.substr(Position + 1); 19240b57cec5SDimitry Andric // Allow exactly one numeric character for the additional refinement 19250b57cec5SDimitry Andric // step parameter. 19260b57cec5SDimitry Andric if (RefStepString.size() == 1) { 19270b57cec5SDimitry Andric char RefStepChar = RefStepString[0]; 19280b57cec5SDimitry Andric if (RefStepChar >= '0' && RefStepChar <= '9') { 19290b57cec5SDimitry Andric Value = RefStepChar - '0'; 19300b57cec5SDimitry Andric return true; 19310b57cec5SDimitry Andric } 19320b57cec5SDimitry Andric } 19330b57cec5SDimitry Andric report_fatal_error("Invalid refinement step for -recip."); 19340b57cec5SDimitry Andric } 19350b57cec5SDimitry Andric 19360b57cec5SDimitry Andric /// For the input attribute string, return one of the ReciprocalEstimate enum 19370b57cec5SDimitry Andric /// status values (enabled, disabled, or not specified) for this operation on 19380b57cec5SDimitry Andric /// the specified data type. 19390b57cec5SDimitry Andric static int getOpEnabled(bool IsSqrt, EVT VT, StringRef Override) { 19400b57cec5SDimitry Andric if (Override.empty()) 19410b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 19420b57cec5SDimitry Andric 19430b57cec5SDimitry Andric SmallVector<StringRef, 4> OverrideVector; 19440b57cec5SDimitry Andric Override.split(OverrideVector, ','); 19450b57cec5SDimitry Andric unsigned NumArgs = OverrideVector.size(); 19460b57cec5SDimitry Andric 19470b57cec5SDimitry Andric // Check if "all", "none", or "default" was specified. 19480b57cec5SDimitry Andric if (NumArgs == 1) { 19490b57cec5SDimitry Andric // Look for an optional setting of the number of refinement steps needed 19500b57cec5SDimitry Andric // for this type of reciprocal operation. 19510b57cec5SDimitry Andric size_t RefPos; 19520b57cec5SDimitry Andric uint8_t RefSteps; 19530b57cec5SDimitry Andric if (parseRefinementStep(Override, RefPos, RefSteps)) { 19540b57cec5SDimitry Andric // Split the string for further processing. 19550b57cec5SDimitry Andric Override = Override.substr(0, RefPos); 19560b57cec5SDimitry Andric } 19570b57cec5SDimitry Andric 19580b57cec5SDimitry Andric // All reciprocal types are enabled. 19590b57cec5SDimitry Andric if (Override == "all") 19600b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Enabled; 19610b57cec5SDimitry Andric 19620b57cec5SDimitry Andric // All reciprocal types are disabled. 19630b57cec5SDimitry Andric if (Override == "none") 19640b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Disabled; 19650b57cec5SDimitry Andric 19660b57cec5SDimitry Andric // Target defaults for enablement are used. 19670b57cec5SDimitry Andric if (Override == "default") 19680b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 19690b57cec5SDimitry Andric } 19700b57cec5SDimitry Andric 19710b57cec5SDimitry Andric // The attribute string may omit the size suffix ('f'/'d'). 19720b57cec5SDimitry Andric std::string VTName = getReciprocalOpName(IsSqrt, VT); 19730b57cec5SDimitry Andric std::string VTNameNoSize = VTName; 19740b57cec5SDimitry Andric VTNameNoSize.pop_back(); 19750b57cec5SDimitry Andric static const char DisabledPrefix = '!'; 19760b57cec5SDimitry Andric 19770b57cec5SDimitry Andric for (StringRef RecipType : OverrideVector) { 19780b57cec5SDimitry Andric size_t RefPos; 19790b57cec5SDimitry Andric uint8_t RefSteps; 19800b57cec5SDimitry Andric if (parseRefinementStep(RecipType, RefPos, RefSteps)) 19810b57cec5SDimitry Andric RecipType = RecipType.substr(0, RefPos); 19820b57cec5SDimitry Andric 19830b57cec5SDimitry Andric // Ignore the disablement token for string matching. 19840b57cec5SDimitry Andric bool IsDisabled = RecipType[0] == DisabledPrefix; 19850b57cec5SDimitry Andric if (IsDisabled) 19860b57cec5SDimitry Andric RecipType = RecipType.substr(1); 19870b57cec5SDimitry Andric 19880b57cec5SDimitry Andric if (RecipType.equals(VTName) || RecipType.equals(VTNameNoSize)) 19890b57cec5SDimitry Andric return IsDisabled ? TargetLoweringBase::ReciprocalEstimate::Disabled 19900b57cec5SDimitry Andric : TargetLoweringBase::ReciprocalEstimate::Enabled; 19910b57cec5SDimitry Andric } 19920b57cec5SDimitry Andric 19930b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 19940b57cec5SDimitry Andric } 19950b57cec5SDimitry Andric 19960b57cec5SDimitry Andric /// For the input attribute string, return the customized refinement step count 19970b57cec5SDimitry Andric /// for this operation on the specified data type. If the step count does not 19980b57cec5SDimitry Andric /// exist, return the ReciprocalEstimate enum value for unspecified. 19990b57cec5SDimitry Andric static int getOpRefinementSteps(bool IsSqrt, EVT VT, StringRef Override) { 20000b57cec5SDimitry Andric if (Override.empty()) 20010b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 20020b57cec5SDimitry Andric 20030b57cec5SDimitry Andric SmallVector<StringRef, 4> OverrideVector; 20040b57cec5SDimitry Andric Override.split(OverrideVector, ','); 20050b57cec5SDimitry Andric unsigned NumArgs = OverrideVector.size(); 20060b57cec5SDimitry Andric 20070b57cec5SDimitry Andric // Check if "all", "default", or "none" was specified. 20080b57cec5SDimitry Andric if (NumArgs == 1) { 20090b57cec5SDimitry Andric // Look for an optional setting of the number of refinement steps needed 20100b57cec5SDimitry Andric // for this type of reciprocal operation. 20110b57cec5SDimitry Andric size_t RefPos; 20120b57cec5SDimitry Andric uint8_t RefSteps; 20130b57cec5SDimitry Andric if (!parseRefinementStep(Override, RefPos, RefSteps)) 20140b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 20150b57cec5SDimitry Andric 20160b57cec5SDimitry Andric // Split the string for further processing. 20170b57cec5SDimitry Andric Override = Override.substr(0, RefPos); 20180b57cec5SDimitry Andric assert(Override != "none" && 20190b57cec5SDimitry Andric "Disabled reciprocals, but specifed refinement steps?"); 20200b57cec5SDimitry Andric 20210b57cec5SDimitry Andric // If this is a general override, return the specified number of steps. 20220b57cec5SDimitry Andric if (Override == "all" || Override == "default") 20230b57cec5SDimitry Andric return RefSteps; 20240b57cec5SDimitry Andric } 20250b57cec5SDimitry Andric 20260b57cec5SDimitry Andric // The attribute string may omit the size suffix ('f'/'d'). 20270b57cec5SDimitry Andric std::string VTName = getReciprocalOpName(IsSqrt, VT); 20280b57cec5SDimitry Andric std::string VTNameNoSize = VTName; 20290b57cec5SDimitry Andric VTNameNoSize.pop_back(); 20300b57cec5SDimitry Andric 20310b57cec5SDimitry Andric for (StringRef RecipType : OverrideVector) { 20320b57cec5SDimitry Andric size_t RefPos; 20330b57cec5SDimitry Andric uint8_t RefSteps; 20340b57cec5SDimitry Andric if (!parseRefinementStep(RecipType, RefPos, RefSteps)) 20350b57cec5SDimitry Andric continue; 20360b57cec5SDimitry Andric 20370b57cec5SDimitry Andric RecipType = RecipType.substr(0, RefPos); 20380b57cec5SDimitry Andric if (RecipType.equals(VTName) || RecipType.equals(VTNameNoSize)) 20390b57cec5SDimitry Andric return RefSteps; 20400b57cec5SDimitry Andric } 20410b57cec5SDimitry Andric 20420b57cec5SDimitry Andric return TargetLoweringBase::ReciprocalEstimate::Unspecified; 20430b57cec5SDimitry Andric } 20440b57cec5SDimitry Andric 20450b57cec5SDimitry Andric int TargetLoweringBase::getRecipEstimateSqrtEnabled(EVT VT, 20460b57cec5SDimitry Andric MachineFunction &MF) const { 20470b57cec5SDimitry Andric return getOpEnabled(true, VT, getRecipEstimateForFunc(MF)); 20480b57cec5SDimitry Andric } 20490b57cec5SDimitry Andric 20500b57cec5SDimitry Andric int TargetLoweringBase::getRecipEstimateDivEnabled(EVT VT, 20510b57cec5SDimitry Andric MachineFunction &MF) const { 20520b57cec5SDimitry Andric return getOpEnabled(false, VT, getRecipEstimateForFunc(MF)); 20530b57cec5SDimitry Andric } 20540b57cec5SDimitry Andric 20550b57cec5SDimitry Andric int TargetLoweringBase::getSqrtRefinementSteps(EVT VT, 20560b57cec5SDimitry Andric MachineFunction &MF) const { 20570b57cec5SDimitry Andric return getOpRefinementSteps(true, VT, getRecipEstimateForFunc(MF)); 20580b57cec5SDimitry Andric } 20590b57cec5SDimitry Andric 20600b57cec5SDimitry Andric int TargetLoweringBase::getDivRefinementSteps(EVT VT, 20610b57cec5SDimitry Andric MachineFunction &MF) const { 20620b57cec5SDimitry Andric return getOpRefinementSteps(false, VT, getRecipEstimateForFunc(MF)); 20630b57cec5SDimitry Andric } 20640b57cec5SDimitry Andric 20650b57cec5SDimitry Andric void TargetLoweringBase::finalizeLowering(MachineFunction &MF) const { 20660b57cec5SDimitry Andric MF.getRegInfo().freezeReservedRegs(MF); 20670b57cec5SDimitry Andric } 20685ffd83dbSDimitry Andric 20695ffd83dbSDimitry Andric MachineMemOperand::Flags 20705ffd83dbSDimitry Andric TargetLoweringBase::getLoadMemOperandFlags(const LoadInst &LI, 20715ffd83dbSDimitry Andric const DataLayout &DL) const { 20725ffd83dbSDimitry Andric MachineMemOperand::Flags Flags = MachineMemOperand::MOLoad; 20735ffd83dbSDimitry Andric if (LI.isVolatile()) 20745ffd83dbSDimitry Andric Flags |= MachineMemOperand::MOVolatile; 20755ffd83dbSDimitry Andric 20765ffd83dbSDimitry Andric if (LI.hasMetadata(LLVMContext::MD_nontemporal)) 20775ffd83dbSDimitry Andric Flags |= MachineMemOperand::MONonTemporal; 20785ffd83dbSDimitry Andric 20795ffd83dbSDimitry Andric if (LI.hasMetadata(LLVMContext::MD_invariant_load)) 20805ffd83dbSDimitry Andric Flags |= MachineMemOperand::MOInvariant; 20815ffd83dbSDimitry Andric 20825ffd83dbSDimitry Andric if (isDereferenceablePointer(LI.getPointerOperand(), LI.getType(), DL)) 20835ffd83dbSDimitry Andric Flags |= MachineMemOperand::MODereferenceable; 20845ffd83dbSDimitry Andric 20855ffd83dbSDimitry Andric Flags |= getTargetMMOFlags(LI); 20865ffd83dbSDimitry Andric return Flags; 20875ffd83dbSDimitry Andric } 20885ffd83dbSDimitry Andric 20895ffd83dbSDimitry Andric MachineMemOperand::Flags 20905ffd83dbSDimitry Andric TargetLoweringBase::getStoreMemOperandFlags(const StoreInst &SI, 20915ffd83dbSDimitry Andric const DataLayout &DL) const { 20925ffd83dbSDimitry Andric MachineMemOperand::Flags Flags = MachineMemOperand::MOStore; 20935ffd83dbSDimitry Andric 20945ffd83dbSDimitry Andric if (SI.isVolatile()) 20955ffd83dbSDimitry Andric Flags |= MachineMemOperand::MOVolatile; 20965ffd83dbSDimitry Andric 20975ffd83dbSDimitry Andric if (SI.hasMetadata(LLVMContext::MD_nontemporal)) 20985ffd83dbSDimitry Andric Flags |= MachineMemOperand::MONonTemporal; 20995ffd83dbSDimitry Andric 21005ffd83dbSDimitry Andric // FIXME: Not preserving dereferenceable 21015ffd83dbSDimitry Andric Flags |= getTargetMMOFlags(SI); 21025ffd83dbSDimitry Andric return Flags; 21035ffd83dbSDimitry Andric } 21045ffd83dbSDimitry Andric 21055ffd83dbSDimitry Andric MachineMemOperand::Flags 21065ffd83dbSDimitry Andric TargetLoweringBase::getAtomicMemOperandFlags(const Instruction &AI, 21075ffd83dbSDimitry Andric const DataLayout &DL) const { 21085ffd83dbSDimitry Andric auto Flags = MachineMemOperand::MOLoad | MachineMemOperand::MOStore; 21095ffd83dbSDimitry Andric 21105ffd83dbSDimitry Andric if (const AtomicRMWInst *RMW = dyn_cast<AtomicRMWInst>(&AI)) { 21115ffd83dbSDimitry Andric if (RMW->isVolatile()) 21125ffd83dbSDimitry Andric Flags |= MachineMemOperand::MOVolatile; 21135ffd83dbSDimitry Andric } else if (const AtomicCmpXchgInst *CmpX = dyn_cast<AtomicCmpXchgInst>(&AI)) { 21145ffd83dbSDimitry Andric if (CmpX->isVolatile()) 21155ffd83dbSDimitry Andric Flags |= MachineMemOperand::MOVolatile; 21165ffd83dbSDimitry Andric } else 21175ffd83dbSDimitry Andric llvm_unreachable("not an atomic instruction"); 21185ffd83dbSDimitry Andric 21195ffd83dbSDimitry Andric // FIXME: Not preserving dereferenceable 21205ffd83dbSDimitry Andric Flags |= getTargetMMOFlags(AI); 21215ffd83dbSDimitry Andric return Flags; 21225ffd83dbSDimitry Andric } 21235ffd83dbSDimitry Andric 21245ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 21255ffd83dbSDimitry Andric // GlobalISel Hooks 21265ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 21275ffd83dbSDimitry Andric 21285ffd83dbSDimitry Andric bool TargetLoweringBase::shouldLocalize(const MachineInstr &MI, 21295ffd83dbSDimitry Andric const TargetTransformInfo *TTI) const { 21305ffd83dbSDimitry Andric auto &MF = *MI.getMF(); 21315ffd83dbSDimitry Andric auto &MRI = MF.getRegInfo(); 21325ffd83dbSDimitry Andric // Assuming a spill and reload of a value has a cost of 1 instruction each, 21335ffd83dbSDimitry Andric // this helper function computes the maximum number of uses we should consider 21345ffd83dbSDimitry Andric // for remat. E.g. on arm64 global addresses take 2 insts to materialize. We 21355ffd83dbSDimitry Andric // break even in terms of code size when the original MI has 2 users vs 21365ffd83dbSDimitry Andric // choosing to potentially spill. Any more than 2 users we we have a net code 21375ffd83dbSDimitry Andric // size increase. This doesn't take into account register pressure though. 21385ffd83dbSDimitry Andric auto maxUses = [](unsigned RematCost) { 21395ffd83dbSDimitry Andric // A cost of 1 means remats are basically free. 21405ffd83dbSDimitry Andric if (RematCost == 1) 21415ffd83dbSDimitry Andric return UINT_MAX; 21425ffd83dbSDimitry Andric if (RematCost == 2) 21435ffd83dbSDimitry Andric return 2U; 21445ffd83dbSDimitry Andric 21455ffd83dbSDimitry Andric // Remat is too expensive, only sink if there's one user. 21465ffd83dbSDimitry Andric if (RematCost > 2) 21475ffd83dbSDimitry Andric return 1U; 21485ffd83dbSDimitry Andric llvm_unreachable("Unexpected remat cost"); 21495ffd83dbSDimitry Andric }; 21505ffd83dbSDimitry Andric 21515ffd83dbSDimitry Andric // Helper to walk through uses and terminate if we've reached a limit. Saves 21525ffd83dbSDimitry Andric // us spending time traversing uses if all we want to know is if it's >= min. 21535ffd83dbSDimitry Andric auto isUsesAtMost = [&](unsigned Reg, unsigned MaxUses) { 21545ffd83dbSDimitry Andric unsigned NumUses = 0; 21555ffd83dbSDimitry Andric auto UI = MRI.use_instr_nodbg_begin(Reg), UE = MRI.use_instr_nodbg_end(); 21565ffd83dbSDimitry Andric for (; UI != UE && NumUses < MaxUses; ++UI) { 21575ffd83dbSDimitry Andric NumUses++; 21585ffd83dbSDimitry Andric } 21595ffd83dbSDimitry Andric // If we haven't reached the end yet then there are more than MaxUses users. 21605ffd83dbSDimitry Andric return UI == UE; 21615ffd83dbSDimitry Andric }; 21625ffd83dbSDimitry Andric 21635ffd83dbSDimitry Andric switch (MI.getOpcode()) { 21645ffd83dbSDimitry Andric default: 21655ffd83dbSDimitry Andric return false; 21665ffd83dbSDimitry Andric // Constants-like instructions should be close to their users. 21675ffd83dbSDimitry Andric // We don't want long live-ranges for them. 21685ffd83dbSDimitry Andric case TargetOpcode::G_CONSTANT: 21695ffd83dbSDimitry Andric case TargetOpcode::G_FCONSTANT: 21705ffd83dbSDimitry Andric case TargetOpcode::G_FRAME_INDEX: 21715ffd83dbSDimitry Andric case TargetOpcode::G_INTTOPTR: 21725ffd83dbSDimitry Andric return true; 21735ffd83dbSDimitry Andric case TargetOpcode::G_GLOBAL_VALUE: { 21745ffd83dbSDimitry Andric unsigned RematCost = TTI->getGISelRematGlobalCost(); 21755ffd83dbSDimitry Andric Register Reg = MI.getOperand(0).getReg(); 21765ffd83dbSDimitry Andric unsigned MaxUses = maxUses(RematCost); 21775ffd83dbSDimitry Andric if (MaxUses == UINT_MAX) 21785ffd83dbSDimitry Andric return true; // Remats are "free" so always localize. 21795ffd83dbSDimitry Andric bool B = isUsesAtMost(Reg, MaxUses); 21805ffd83dbSDimitry Andric return B; 21815ffd83dbSDimitry Andric } 21825ffd83dbSDimitry Andric } 21835ffd83dbSDimitry Andric } 2184