LLVM API Documentation

Defines | Functions | Variables
SelectionDAGBuilder.cpp File Reference
#include "SelectionDAGBuilder.h"
#include "SDNodeDbgValue.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/Analysis/AliasAnalysis.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/CodeGen/Analysis.h"
#include "llvm/CodeGen/FastISel.h"
#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/GCMetadata.h"
#include "llvm/CodeGen/GCStrategy.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/StackMaps.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetFrameLowering.h"
#include "llvm/Target/TargetInstrInfo.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetSelectionDAGInfo.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include <algorithm>
#include "llvm/IR/Instruction.def"
#include "llvm/CodeGen/SelectionDAGISel.h"

Go to the source code of this file.

Defines

#define DEBUG_TYPE   "isel"
#define HANDLE_INST(NUM, OPCODE, CLASS)   case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;

Functions

static SDValue getCopyFromPartsVector (SelectionDAG &DAG, SDLoc DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V)
static SDValue getCopyFromParts (SelectionDAG &DAG, SDLoc DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, const Value *V, ISD::NodeType AssertOp=ISD::DELETED_NODE)
static void diagnosePossiblyInvalidConstraint (LLVMContext &Ctx, const Value *V, const Twine &ErrMsg)
static void getCopyToPartsVector (SelectionDAG &DAG, SDLoc dl, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V)
static void getCopyToParts (SelectionDAG &DAG, SDLoc DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, const Value *V, ISD::NodeType ExtendKind=ISD::ANY_EXTEND)
static bool InBlock (const Value *V, const BasicBlock *BB)
static void ScaleWeights (uint64_t &NewTrue, uint64_t &NewFalse)
 Scale down both weights to fit into uint32_t.
static bool areJTsAllowed (const TargetLowering &TLI)
static APInt ComputeRange (const APInt &First, const APInt &Last)
static bool isSequentialInRange (const SmallVectorImpl< int > &Mask, unsigned Pos, unsigned Size, int Low)
static SDValue InsertFenceForAtomic (SDValue Chain, AtomicOrdering Order, SynchronizationScope Scope, bool Before, SDLoc dl, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue GetSignificand (SelectionDAG &DAG, SDValue Op, SDLoc dl)
static SDValue GetExponent (SelectionDAG &DAG, SDValue Op, const TargetLowering &TLI, SDLoc dl)
static SDValue getF32Constant (SelectionDAG &DAG, unsigned Flt)
 getF32Constant - Get 32-bit floating point constant.
static SDValue expandExp (SDLoc dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue expandLog (SDLoc dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue expandLog2 (SDLoc dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue expandLog10 (SDLoc dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue expandExp2 (SDLoc dl, SDValue Op, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue expandPow (SDLoc dl, SDValue LHS, SDValue RHS, SelectionDAG &DAG, const TargetLowering &TLI)
static SDValue ExpandPowI (SDLoc DL, SDValue LHS, SDValue RHS, SelectionDAG &DAG)
 ExpandPowI - Expand a llvm.powi intrinsic.
static unsigned getTruncatedArgReg (const SDValue &N)
static bool IsOnlyUsedInZeroEqualityComparison (const Value *V)
static SDValue getMemCmpLoad (const Value *PtrVal, MVT LoadVT, Type *LoadTy, SelectionDAGBuilder &Builder)
static void GetRegistersForValue (SelectionDAG &DAG, const TargetLowering &TLI, SDLoc DL, SDISelAsmOperandInfo &OpInfo)
static void addStackMapLiveVars (const CallInst &CI, unsigned StartIdx, SmallVectorImpl< SDValue > &Ops, SelectionDAGBuilder &Builder)
 Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's operand list.
static AttributeSet getReturnAttrs (TargetLowering::CallLoweringInfo &CLI)
static bool isOnlyUsedInEntryBlock (const Argument *A, bool FastISel)

Variables

static unsigned LimitFloatPrecision
static cl::opt< unsigned, trueLimitFPPrecision ("limit-float-precision", cl::desc("Generate low-precision inline sequences ""for some float libcalls"), cl::location(LimitFloatPrecision), cl::init(0))
static const unsigned MaxParallelChains = 64

Define Documentation

#define DEBUG_TYPE   "isel"

Definition at line 65 of file SelectionDAGBuilder.cpp.

#define HANDLE_INST (   NUM,
  OPCODE,
  CLASS 
)    case Instruction::OPCODE: visit##OPCODE((const CLASS&)I); break;

Function Documentation

static void addStackMapLiveVars ( const CallInst CI,
unsigned  StartIdx,
SmallVectorImpl< SDValue > &  Ops,
SelectionDAGBuilder Builder 
) [static]

Add a stack map intrinsic call's live variable operands to a stackmap or patchpoint target node's operand list.

Constants are converted to TargetConstants purely as an optimization to avoid constant materialization and register allocation.

FrameIndex operands are converted to TargetFrameIndex so that ISEL does not generate addess computation nodes, and so ExpandISelPseudo can convert the TargetFrameIndex into a DirectMemRefOp StackMap location. This avoids address materialization and register allocation, but may also be required for correctness. If a StackMap (or PatchPoint) intrinsic directly uses an alloca in the entry block, then the runtime may assume that the alloca's StackMap location can be read immediately after compilation and that the location is valid at any point during execution (this is similar to the assumption made by the llvm.gcroot intrinsic). If the alloca's location were only available in a register, then the runtime would need to trap when execution reaches the StackMap in order to read the alloca's location.

Definition at line 6907 of file SelectionDAGBuilder.cpp.

References llvm::StackMaps::ConstantOp, llvm::SelectionDAGBuilder::DAG, llvm::CallInst::getArgOperand(), llvm::CallInst::getNumArgOperands(), llvm::TargetLoweringBase::getPointerTy(), llvm::SelectionDAG::getTargetConstant(), llvm::SelectionDAG::getTargetFrameIndex(), llvm::SelectionDAG::getTargetLoweringInfo(), llvm::SelectionDAGBuilder::getValue(), llvm::MVT::i64, and llvm::SmallVectorTemplateBase< T, isPodLike >::push_back().

static bool areJTsAllowed ( const TargetLowering TLI) [inline, static]
static APInt ComputeRange ( const APInt First,
const APInt Last 
) [static]

Definition at line 2237 of file SelectionDAGBuilder.cpp.

References llvm::APInt::getBitWidth(), and llvm::APInt::sext().

static void diagnosePossiblyInvalidConstraint ( LLVMContext Ctx,
const Value V,
const Twine ErrMsg 
) [static]

Definition at line 219 of file SelectionDAGBuilder.cpp.

References llvm::LLVMContext::emitError(), and I.

Referenced by getCopyFromPartsVector(), and getCopyToParts().

static SDValue expandExp ( SDLoc  dl,
SDValue  Op,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue expandExp2 ( SDLoc  dl,
SDValue  Op,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue expandLog ( SDLoc  dl,
SDValue  Op,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue expandLog10 ( SDLoc  dl,
SDValue  Op,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue expandLog2 ( SDLoc  dl,
SDValue  Op,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue expandPow ( SDLoc  dl,
SDValue  LHS,
SDValue  RHS,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static SDValue ExpandPowI ( SDLoc  DL,
SDValue  LHS,
SDValue  RHS,
SelectionDAG DAG 
) [static]
static SDValue getCopyFromParts ( SelectionDAG DAG,
SDLoc  DL,
const SDValue Parts,
unsigned  NumParts,
MVT  PartVT,
EVT  ValueVT,
const Value V,
ISD::NodeType  AssertOp = ISD::DELETED_NODE 
) [static]
static SDValue getCopyFromPartsVector ( SelectionDAG DAG,
SDLoc  DL,
const SDValue Parts,
unsigned  NumParts,
MVT  PartVT,
EVT  ValueVT,
const Value V 
) [static]
static void getCopyToParts ( SelectionDAG DAG,
SDLoc  DL,
SDValue  Val,
SDValue Parts,
unsigned  NumParts,
MVT  PartVT,
const Value V,
ISD::NodeType  ExtendKind = ISD::ANY_EXTEND 
) [static]
static void getCopyToPartsVector ( SelectionDAG DAG,
SDLoc  DL,
SDValue  Val,
SDValue Parts,
unsigned  NumParts,
MVT  PartVT,
const Value V 
) [static]
static SDValue GetExponent ( SelectionDAG DAG,
SDValue  Op,
const TargetLowering TLI,
SDLoc  dl 
) [static]

GetExponent - Get the exponent:

(float)(int)(((Op & 0x7f800000) >> 23) - 127);

where Op is the hexadecimal representation of floating point value.

Definition at line 3918 of file SelectionDAGBuilder.cpp.

References llvm::ISD::AND, llvm::MVT::f32, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::TargetLoweringBase::getPointerTy(), llvm::MVT::i32, llvm::ISD::SINT_TO_FP, llvm::ISD::SRL, and llvm::ISD::SUB.

Referenced by expandLog(), expandLog10(), and expandLog2().

static SDValue getF32Constant ( SelectionDAG DAG,
unsigned  Flt 
) [static]

getF32Constant - Get 32-bit floating point constant.

Definition at line 3931 of file SelectionDAGBuilder.cpp.

References llvm::lltok::APFloat, llvm::MVT::f32, llvm::SelectionDAG::getConstantFP(), and llvm::APFloat::IEEEsingle.

Referenced by expandExp(), expandExp2(), expandLog(), expandLog10(), expandLog2(), and expandPow().

static SDValue getMemCmpLoad ( const Value PtrVal,
MVT  LoadVT,
Type LoadTy,
SelectionDAGBuilder Builder 
) [static]
static void GetRegistersForValue ( SelectionDAG DAG,
const TargetLowering TLI,
SDLoc  DL,
SDISelAsmOperandInfo &  OpInfo 
) [static]

GetRegistersForValue - Assign registers (virtual or physical) for the specified operand. We prefer to assign virtual registers, to allow the register allocator to handle the assignment process. However, if the asm uses features that we can't model on machineinstrs, we have SDISel do the allocation. This produces generally horrible, but correct, code.

OpInfo describes the operand.

Definition at line 6193 of file SelectionDAGBuilder.cpp.

References llvm::TargetRegisterClass::begin(), llvm::ISD::BITCAST, llvm::MachineRegisterInfo::createVirtualRegister(), llvm::TargetRegisterClass::end(), llvm::SelectionDAG::getContext(), llvm::MVT::getIntegerVT(), llvm::SelectionDAG::getMachineFunction(), llvm::SelectionDAG::getNode(), llvm::TargetLoweringBase::getNumRegisters(), llvm::TargetLowering::getRegForInlineAsmConstraint(), llvm::MachineFunction::getRegInfo(), llvm::MVT::getSizeInBits(), I, llvm::InlineAsm::isInput, llvm::MVT::isInteger(), llvm::MVT::Other, llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), and llvm::TargetRegisterClass::vt_begin().

static SDValue GetSignificand ( SelectionDAG DAG,
SDValue  Op,
SDLoc  dl 
) [static]

GetSignificand - Get the significand and build it into a floating-point number with exponent of 1:

Op = (Op & 0x007fffff) | 0x3f800000;

where Op is the hexadecimal representation of floating point value.

Definition at line 3904 of file SelectionDAGBuilder.cpp.

References llvm::ISD::AND, llvm::ISD::BITCAST, llvm::MVT::f32, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::MVT::i32, and llvm::ISD::OR.

Referenced by expandLog(), expandLog10(), and expandLog2().

static unsigned getTruncatedArgReg ( const SDValue N) [static]
static bool InBlock ( const Value V,
const BasicBlock BB 
) [static]
static SDValue InsertFenceForAtomic ( SDValue  Chain,
AtomicOrdering  Order,
SynchronizationScope  Scope,
bool  Before,
SDLoc  dl,
SelectionDAG DAG,
const TargetLowering TLI 
) [static]
static bool isOnlyUsedInEntryBlock ( const Argument A,
bool  FastISel 
) [static]

isOnlyUsedInEntryBlock - If the specified argument is only used in the entry block, return true. This includes arguments used by switches, since the switch may expand into multiple basic blocks.

Definition at line 7441 of file SelectionDAGBuilder.cpp.

References llvm::Function::begin(), llvm::Argument::getParent(), llvm::Value::use_empty(), and llvm::Value::users().

IsOnlyUsedInZeroEqualityComparison - Return true if it only matters that the value is equal or not-equal to zero.

Definition at line 5612 of file SelectionDAGBuilder.cpp.

References llvm::Constant::isNullValue(), and llvm::Value::users().

static bool isSequentialInRange ( const SmallVectorImpl< int > &  Mask,
unsigned  Pos,
unsigned  Size,
int  Low 
) [static]

Definition at line 3100 of file SelectionDAGBuilder.cpp.

static void ScaleWeights ( uint64_t &  NewTrue,
uint64_t &  NewFalse 
) [static]

Scale down both weights to fit into uint32_t.

Definition at line 1422 of file SelectionDAGBuilder.cpp.

Referenced by llvm::SelectionDAGBuilder::FindMergedConditions().


Variable Documentation

LimitFloatPrecision - Generate low-precision inline sequences for some float libcalls (6, 8 or 12 bits).

Definition at line 69 of file SelectionDAGBuilder.cpp.

Referenced by expandExp(), expandExp2(), expandLog(), expandLog10(), expandLog2(), and expandPow().

cl::opt<unsigned, true> LimitFPPrecision("limit-float-precision", cl::desc("Generate low-precision inline sequences ""for some float libcalls"), cl::location(LimitFloatPrecision), cl::init(0)) [static]

Definition at line 92 of file SelectionDAGBuilder.cpp.