LLVM  10.0.0svn
Namespaces | Functions
AArch64FastISel.cpp File Reference
#include "AArch64.h"
#include "AArch64CallingConvention.h"
#include "AArch64RegisterInfo.h"
#include "AArch64Subtarget.h"
#include "MCTargetDesc/AArch64AddressingModes.h"
#include "Utils/AArch64BaseInfo.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/BranchProbabilityInfo.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/FastISel.h"
#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/IR/Argument.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/AtomicOrdering.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MachineValueType.h"
#include "llvm/Support/MathExtras.h"
#include <algorithm>
#include <cassert>
#include <cstdint>
#include <iterator>
#include <utility>
#include "AArch64GenFastISel.inc"

Go to the source code of this file.

Namespaces

 llvm
 This class represents lattice values for constants.
 

Functions

static bool isIntExtFree (const Instruction *I)
 Check if the sign-/zero-extend will be a noop. More...
 
static unsigned getImplicitScaleFactor (MVT VT)
 Determine the implicit scale factor that is applied by a memory operation for a given value type. More...
 
static bool isMulPowOf2 (const Value *I)
 Check if the multiply is by a power-of-2 constant. More...
 
static AArch64CC::CondCode getCompareCC (CmpInst::Predicate Pred)
 
static bool isZExtLoad (const MachineInstr *LI)
 
static bool isSExtLoad (const MachineInstr *LI)
 

Function Documentation

◆ getCompareCC()

static AArch64CC::CondCode getCompareCC ( CmpInst::Predicate  Pred)
static

Definition at line 2209 of file AArch64FastISel.cpp.

References llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), llvm::AArch64CC::AL, assert(), B, llvm::ISD::BR, llvm::BuildMI(), llvm::ISD::Constant, llvm::constrainOperandRegClass(), emitCmp(), llvm::AArch64CC::EQ, llvm::MVT::f32, llvm::MVT::f64, llvm::CmpInst::FCMP_FALSE, llvm::CmpInst::FCMP_OEQ, llvm::CmpInst::FCMP_OGE, llvm::CmpInst::FCMP_OGT, llvm::CmpInst::FCMP_OLE, llvm::CmpInst::FCMP_OLT, llvm::CmpInst::FCMP_ONE, llvm::CmpInst::FCMP_ORD, llvm::CmpInst::FCMP_TRUE, llvm::CmpInst::FCMP_UEQ, llvm::CmpInst::FCMP_UGE, llvm::CmpInst::FCMP_UGT, llvm::CmpInst::FCMP_ULE, llvm::CmpInst::FCMP_ULT, llvm::CmpInst::FCMP_UNE, llvm::CmpInst::FCMP_UNO, llvm::AArch64CC::GE, llvm::MachineBasicBlock::getBasicBlock(), llvm::SelectInst::getCondition(), llvm::BranchInst::getCondition(), llvm::Instruction::getDebugLoc(), llvm::SelectInst::getFalseValue(), llvm::CmpInst::getInversePredicate(), llvm::AArch64CC::getInvertedCondCode(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::MVT::getSizeInBits(), llvm::BranchInst::getSuccessor(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), llvm::AArch64CC::GT, llvm::Value::hasOneUse(), llvm::AArch64CC::HI, llvm::AArch64CC::HS, I, llvm::MVT::i1, llvm::MVT::i16, llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLE, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGE, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULE, llvm::CmpInst::ICMP_ULT, llvm::Type::isIntegerTy(), llvm::ConstantInt::isOne(), llvm::BranchInst::isUnconditional(), llvm::CmpInst::isUnsigned(), llvm::Type::isVectorTy(), llvm::ConstantInt::isZero(), llvm::AArch64CC::LE, llvm::AArch64CC::LO, llvm::AArch64CC::LS, llvm::AArch64CC::LT, llvm::AArch64CC::MI, llvm::AArch64CC::NE, llvm::AArch64CC::PL, SI, llvm::MVT::SimpleTy, llvm::IndirectBrInst::successors(), std::swap(), TII, llvm::AArch64CC::VC, llvm::AArch64CC::VS, and llvm::ISD::XOR.

◆ getImplicitScaleFactor()

static unsigned getImplicitScaleFactor ( MVT  VT)
static

Determine the implicit scale factor that is applied by a memory operation for a given value type.

Definition at line 328 of file AArch64FastISel.cpp.

References llvm::MachineInstrBuilder::addConstantPoolIndex(), llvm::MachineInstrBuilder::addGlobalAddress(), llvm::MachineInstrBuilder::addImm(), llvm::AArch64ISD::ADRP, llvm::AMDGPU::HSAMD::Kernel::Arg::Key::Align, assert(), llvm::APFloat::bitcastToAPInt(), llvm::BuildMI(), C, llvm::CC_AArch64_AAPCS(), llvm::CC_AArch64_DarwinPCS(), llvm::CC_AArch64_GHC(), llvm::CC_AArch64_WebKit_JS(), llvm::AArch64Subtarget::ClassifyGlobalReference(), llvm::ISD::Constant, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::MVT::f32, llvm::MVT::f64, llvm::AArch64_AM::getFP32Imm(), llvm::AArch64_AM::getFP64Imm(), llvm::getKillRegState(), llvm::EVT::getSimpleVT(), llvm::AllocaInst::getType(), llvm::Value::getType(), llvm::GlobalValue::getType(), llvm::ConstantFP::getValueAPF(), llvm::ConstantInt::getZExtValue(), llvm::APInt::getZExtValue(), llvm::CallingConv::GHC, llvm::MVT::i1, llvm::MVT::i16, llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::Constant::isNullValue(), llvm::EVT::isSimple(), llvm::AArch64Subtarget::isTargetDarwin(), llvm::AArch64Subtarget::isTargetMachO(), llvm::GlobalValue::isThreadLocal(), llvm::ConstantInt::isZero(), llvm::CodeModel::Large, llvm::AArch64II::MO_GOT, llvm::AArch64II::MO_NC, llvm::AArch64II::MO_PAGE, llvm::AArch64II::MO_PAGEOFF, SI, llvm::MVT::SimpleTy, TII, llvm::SystemZISD::TM, llvm::AArch64Subtarget::useSmallAddressing(), and llvm::CallingConv::WebKit_JS.

Referenced by isMulPowOf2().

◆ isIntExtFree()

static bool isIntExtFree ( const Instruction I)
static

Check if the sign-/zero-extend will be a noop.

Definition at line 308 of file AArch64FastISel.cpp.

References Arg, assert(), llvm::User::getOperand(), llvm::Value::getType(), I, llvm::Type::isIntegerTy(), and llvm::Type::isVectorTy().

Referenced by isMulPowOf2(), and isSExtLoad().

◆ isMulPowOf2()

static bool isMulPowOf2 ( const Value I)
static

Check if the multiply is by a power-of-2 constant.

Definition at line 535 of file AArch64FastISel.cpp.

References llvm::MCID::Add, llvm::MachineInstrBuilder::addFrameIndex(), llvm::MachineInstrBuilder::addImm(), llvm::MachineInstrBuilder::addMemOperand(), llvm::MachineInstrBuilder::addReg(), llvm::Address, llvm::ISD::AND, Arg, llvm::AArch64_AM::ASR, assert(), llvm::BuildMI(), C, llvm::ISD::Constant, llvm::constrainOperandRegClass(), llvm::dyn_cast(), E, emitCmp(), llvm::AArch64_AM::encodeLogicalImmediate(), llvm::MVT::f128, llvm::MVT::f32, llvm::MVT::f64, llvm::gep_type_begin(), llvm::gep_type_end(), llvm::AArch64_AM::getArithExtendImm(), llvm::MachineInstr::getDesc(), llvm::StructLayout::getElementOffset(), llvm::MachinePointerInfo::getFixedStack(), getImplicitScaleFactor(), llvm::MVT::getIntegerVT(), llvm::getKillRegState(), llvm::MCInstrDesc::getNumDefs(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::ConstantInt::getSExtValue(), llvm::AArch64_AM::getShifterImm(), llvm::EVT::getSimpleVT(), llvm::MVT::getSizeInBits(), llvm::Value::getType(), llvm::ConstantInt::getZExtValue(), llvm::Value::hasOneUse(), I, llvm::MVT::i1, llvm::MVT::i16, llvm::MVT::i32, llvm::MVT::i64, llvm::MVT::i8, llvm::AArch64_AM::InvalidShiftExtend, isIntExtFree(), llvm::AArch64_AM::isLogicalImmediate(), llvm::ConstantFP::isNegative(), llvm::Constant::isNullValue(), llvm::isPowerOf2_64(), llvm::isReleaseOrStronger(), llvm::EVT::isSimple(), llvm::Type::isSized(), llvm::MVT::isVector(), llvm::Type::isVectorTy(), llvm::ConstantInt::isZero(), llvm::ConstantFP::isZero(), LLVM_FALLTHROUGH, llvm_unreachable, llvm::AArch64_AM::LSL, llvm::AArch64_AM::LSR, llvm::BitmaskEnumDetail::Mask(), llvm::max(), MI, llvm::MachineMemOperand::MOLoad, llvm::MachineMemOperand::MOStore, MRI, llvm::ISD::OR, llvm::MVT::Other, SI, llvm::MVT::SimpleTy, std::swap(), llvm::AArch64_AM::SXTB, llvm::AArch64_AM::SXTH, llvm::AArch64_AM::SXTW, llvm::AArch64_AM::SXTX, TII, llvm::Value::use_begin(), llvm::AArch64_AM::UXTB, llvm::AArch64_AM::UXTH, llvm::AArch64_AM::UXTW, and llvm::ISD::XOR.

◆ isSExtLoad()

static bool isSExtLoad ( const MachineInstr LI)
static

◆ isZExtLoad()

static bool isZExtLoad ( const MachineInstr LI)
static

Definition at line 4429 of file AArch64FastISel.cpp.

References llvm::MachineInstr::getOpcode().

Referenced by isSExtLoad().