LLVM 20.0.0git
|
This file defines the interfaces that M68k uses to lower LLVM code into a selection DAG. More...
#include "M68kISelLowering.h"
#include "M68kCallingConv.h"
#include "M68kMachineFunction.h"
#include "M68kSubtarget.h"
#include "M68kTargetMachine.h"
#include "M68kTargetObjectFile.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/SelectionDAG.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Support/raw_ostream.h"
#include "M68kGenCallingConv.inc"
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "M68k-isel" |
Enumerations | |
enum | StructReturnType { NotStructReturn , RegStructReturn , StackStructReturn } |
Functions | |
STATISTIC (NumTailCalls, "Number of tail calls") | |
static StructReturnType | callIsStructReturn (const SmallVectorImpl< ISD::OutputArg > &Outs) |
static StructReturnType | argsAreStructReturn (const SmallVectorImpl< ISD::InputArg > &Ins) |
Determines whether a function uses struct return semantics. | |
static SDValue | CreateCopyOfByValArgument (SDValue Src, SDValue Dst, SDValue Chain, ISD::ArgFlagsTy Flags, SelectionDAG &DAG, const SDLoc &DL) |
Make a copy of an aggregate at address specified by "Src" to address "Dst" with size and alignment information specified by the specific parameter attribute. | |
static bool | canGuaranteeTCO (CallingConv::ID CC) |
Return true if the calling convention is one that we can guarantee TCO for. | |
static bool | mayTailCallThisCC (CallingConv::ID CC) |
Return true if we might ever do TCO for calls with this calling convention. | |
static bool | shouldGuaranteeTCO (CallingConv::ID CC, bool GuaranteedTailCallOpt) |
Return true if the function is being made into a tailcall target by changing its ABI. | |
static bool | MatchingStackOffset (SDValue Arg, unsigned Offset, ISD::ArgFlagsTy Flags, MachineFrameInfo &MFI, const MachineRegisterInfo *MRI, const M68kInstrInfo *TII, const CCValAssign &VA) |
Return true if the given stack call argument is already available in the same position (relatively) of the caller's incoming argument stack. | |
static bool | isOverflowArithmetic (unsigned Opcode) |
static void | lowerOverflowArithmetic (SDValue Op, SelectionDAG &DAG, SDValue &Result, SDValue &CCR, unsigned &CC) |
static SDValue | getBitTestCondition (SDValue Src, SDValue BitNo, ISD::CondCode CC, const SDLoc &DL, SelectionDAG &DAG) |
Create a BTST (Bit Test) node - Test bit BitNo in Src and set condition according to equal/not-equal condition code CC . | |
static SDValue | LowerAndToBTST (SDValue And, ISD::CondCode CC, const SDLoc &DL, SelectionDAG &DAG) |
Result of 'and' is compared against zero. Change to a BTST node if possible. | |
static M68k::CondCode | TranslateIntegerM68kCC (ISD::CondCode SetCCOpcode) |
static unsigned | TranslateM68kCC (ISD::CondCode SetCCOpcode, const SDLoc &DL, bool IsFP, SDValue &LHS, SDValue &RHS, SelectionDAG &DAG) |
Do a one-to-one translation of a ISD::CondCode to the M68k-specific condition code, returning the condition code and the LHS/RHS of the comparison to make. | |
static SDValue | LowerTruncateToBTST (SDValue Op, ISD::CondCode CC, const SDLoc &DL, SelectionDAG &DAG) |
static bool | hasNonFlagsUse (SDValue Op) |
return true if Op has a use that doesn't just read flags. | |
static bool | isM68kCCUnsigned (unsigned M68kCC) |
Return true if the condition is an unsigned comparison operation. | |
static bool | isM68kLogicalCmp (SDValue Op) |
Return true if opcode is a M68k logical comparison. | |
static bool | isTruncWithZeroHighBitsInput (SDValue V, SelectionDAG &DAG) |
static bool | isAndOrOfSetCCs (SDValue Op, unsigned &Opc) |
Return true if node is an ISD::AND or ISD::OR of two M68k::SETcc nodes each of which has no other use apart from the AND / OR. | |
static bool | isXor1OfSetCC (SDValue Op) |
Return true if node is an ISD::XOR of a M68kISD::SETCC and 1 and that the SETCC node has a single use. | |
static bool | isCMOVPseudo (MachineInstr &MI) |
static bool | checkAndUpdateCCRKill (MachineBasicBlock::iterator SelectItr, MachineBasicBlock *BB, const TargetRegisterInfo *TRI) |
static SDValue | getSETCC (M68k::CondCode Cond, SDValue CCR, const SDLoc &dl, SelectionDAG &DAG) |
static SDValue | combineCarryThroughADD (SDValue CCR) |
static SDValue | combineSetCCCCR (SDValue CCR, M68k::CondCode &CC, SelectionDAG &DAG, const M68kSubtarget &Subtarget) |
Optimize a CCR definition used according to the condition code CC into a simpler CCR value, potentially returning a new CC and replacing uses of chain values. | |
static SDValue | combineM68kSetCC (SDNode *N, SelectionDAG &DAG, const M68kSubtarget &Subtarget) |
static SDValue | combineM68kBrCond (SDNode *N, SelectionDAG &DAG, const M68kSubtarget &Subtarget) |
static SDValue | combineSUBX (SDNode *N, SelectionDAG &DAG) |
static SDValue | combineADDX (SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI) |
This file defines the interfaces that M68k uses to lower LLVM code into a selection DAG.
Definition in file M68kISelLowering.cpp.
#define DEBUG_TYPE "M68k-isel" |
Definition at line 42 of file M68kISelLowering.cpp.
enum StructReturnType |
Enumerator | |
---|---|
NotStructReturn | |
RegStructReturn | |
StackStructReturn |
Definition at line 231 of file M68kISelLowering.cpp.
|
static |
Determines whether a function uses struct return semantics.
Definition at line 248 of file M68kISelLowering.cpp.
References NotStructReturn, RegStructReturn, and StackStructReturn.
|
static |
Definition at line 234 of file M68kISelLowering.cpp.
References llvm::SmallVectorBase< Size_T >::empty(), NotStructReturn, RegStructReturn, and StackStructReturn.
|
static |
Return true if the calling convention is one that we can guarantee TCO for.
Definition at line 275 of file M68kISelLowering.cpp.
|
static |
Definition at line 3071 of file M68kISelLowering.cpp.
References llvm::MachineInstr::definesRegister(), llvm::MachineBasicBlock::end(), llvm::MachineInstr::readsRegister(), llvm::MachineBasicBlock::successors(), and TRI.
|
static |
Definition at line 3616 of file M68kISelLowering.cpp.
References llvm::M68kISD::ADDX, combineCarryThroughADD(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getVTList(), and N.
Definition at line 3538 of file M68kISelLowering.cpp.
References llvm::M68kISD::ADD, llvm::ISD::AND, llvm::ISD::ANY_EXTEND, llvm::M68k::COND_CS, llvm::SDValue::getConstantOperandVal(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::isAllOnesConstant(), llvm::isOneConstant(), llvm::M68kISD::SETCC, llvm::M68kISD::SETCC_CARRY, llvm::ISD::SIGN_EXTEND, llvm::ISD::TRUNCATE, and llvm::ISD::ZERO_EXTEND.
Referenced by combineADC(), combineADDX(), combineSBB(), combineSetCCCCR(), combineSetCCEFLAGS(), and combineSUBX().
|
static |
Definition at line 3586 of file M68kISelLowering.cpp.
References llvm::M68kISD::BRCOND, CC, combineSetCCCCR(), Cond, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), and N.
|
static |
Definition at line 3574 of file M68kISelLowering.cpp.
References CC, combineSetCCCCR(), DL, getSETCC(), and N.
|
static |
Optimize a CCR definition used according to the condition code CC
into a simpler CCR value, potentially returning a new CC
and replacing uses of chain values.
Definition at line 3563 of file M68kISelLowering.cpp.
References CC, combineCarryThroughADD(), and llvm::M68k::COND_CS.
Referenced by combineM68kBrCond(), and combineM68kSetCC().
|
static |
Definition at line 3604 of file M68kISelLowering.cpp.
References combineCarryThroughADD(), llvm::SelectionDAG::getNode(), llvm::SelectionDAG::getVTList(), N, and llvm::M68kISD::SUBX.
|
static |
Make a copy of an aggregate at address specified by "Src" to address "Dst" with size and alignment information specified by the specific parameter attribute.
The copy will be passed as a byval function parameter.
Definition at line 263 of file M68kISelLowering.cpp.
References DL, llvm::SelectionDAG::getConstant(), and llvm::SelectionDAG::getMemcpy().
|
static |
Create a BTST (Bit Test) node - Test bit BitNo
in Src
and set condition according to equal/not-equal condition code CC
.
Definition at line 1653 of file M68kISelLowering.cpp.
References llvm::ISD::ANY_EXTEND, llvm::M68kISD::BTST, CC, Cond, llvm::M68k::COND_EQ, llvm::M68k::COND_NE, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValueType(), llvm::M68kISD::SETCC, and llvm::ISD::SETEQ.
Referenced by LowerAndToBTST(), and LowerTruncateToBTST().
|
static |
Definition at line 3530 of file M68kISelLowering.cpp.
References Cond, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), and llvm::M68kISD::SETCC.
return true if Op
has a use that doesn't just read flags.
Definition at line 1849 of file M68kISelLowering.cpp.
References llvm::ISD::BRCOND, llvm::Value::hasOneUse(), llvm::ISD::SELECT, llvm::ISD::SETCC, llvm::ISD::TRUNCATE, and llvm::Value::use_begin().
Referenced by EmitTest().
Return true if node is an ISD::AND or ISD::OR of two M68k::SETcc nodes each of which has no other use apart from the AND / OR.
Definition at line 2429 of file M68kISelLowering.cpp.
References llvm::ISD::AND, llvm::M68k::IsSETCC(), and llvm::ISD::OR.
Referenced by combineCompareEqual().
|
static |
Definition at line 3054 of file M68kISelLowering.cpp.
References MI.
Return true if the condition is an unsigned comparison operation.
Definition at line 2083 of file M68kISelLowering.cpp.
References llvm::M68k::COND_CC, llvm::M68k::COND_CS, llvm::M68k::COND_EQ, llvm::M68k::COND_GE, llvm::M68k::COND_GT, llvm::M68k::COND_HI, llvm::M68k::COND_LE, llvm::M68k::COND_LS, llvm::M68k::COND_LT, llvm::M68k::COND_NE, and llvm_unreachable.
Return true if opcode is a M68k logical comparison.
Definition at line 2233 of file M68kISelLowering.cpp.
References llvm::M68kISD::ADD, llvm::M68kISD::ADDX, llvm::M68kISD::AND, llvm::M68kISD::CMP, llvm::M68kISD::OR, llvm::M68kISD::SMUL, llvm::M68kISD::SUB, llvm::M68kISD::SUBX, llvm::M68kISD::UMUL, and llvm::M68kISD::XOR.
Definition at line 1536 of file M68kISelLowering.cpp.
References llvm::ISD::SADDO, llvm::ISD::SMULO, llvm::ISD::SSUBO, llvm::ISD::UADDO, llvm::ISD::UMULO, and llvm::ISD::USUBO.
|
static |
Definition at line 2249 of file M68kISelLowering.cpp.
References llvm::APInt::getHighBitsSet(), llvm::SDValue::getValueSizeInBits(), llvm::SelectionDAG::MaskedValueIsZero(), and llvm::ISD::TRUNCATE.
Return true if node is an ISD::XOR of a M68kISD::SETCC and 1 and that the SETCC node has a single use.
Definition at line 2441 of file M68kISelLowering.cpp.
References llvm::isOneConstant(), llvm::M68kISD::SETCC, and llvm::ISD::XOR.
|
static |
Result of 'and' is compared against zero. Change to a BTST node if possible.
Definition at line 1675 of file M68kISelLowering.cpp.
References llvm::And, llvm::BitWidth, CC, llvm::SelectionDAG::computeKnownBits(), DL, getBitTestCondition(), llvm::SelectionDAG::getConstant(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::SDValue::getValueSizeInBits(), llvm::isOneConstant(), llvm::isPowerOf2_64(), LHS, llvm::Log2_64_Ceil(), RHS, llvm::ISD::SHL, llvm::ISD::SRL, std::swap(), and llvm::ISD::TRUNCATE.
|
static |
Definition at line 1550 of file M68kISelLowering.cpp.
References llvm::M68kISD::ADD, CC, llvm::M68k::COND_CS, llvm::M68k::COND_VS, DL, llvm::SelectionDAG::getConstant(), llvm::SelectionDAG::getNode(), llvm::SDValue::getValue(), llvm::SelectionDAG::getVTList(), LHS, llvm_unreachable, llvm::ISD::MUL, N, RHS, llvm::ISD::SADDO, llvm::ISD::SIGN_EXTEND, llvm::M68kISD::SMUL, llvm::ISD::SMULO, llvm::ISD::SSUBO, llvm::M68kISD::SUB, llvm::ISD::TRUNCATE, llvm::ISD::UADDO, llvm::M68kISD::UMUL, llvm::ISD::UMULO, llvm::ISD::USUBO, and llvm::ISD::ZERO_EXTEND.
|
static |
Definition at line 1834 of file M68kISelLowering.cpp.
References assert(), CC, DL, getBitTestCondition(), llvm::SDValue::getOperand(), llvm::ISD::SRL, and llvm::ISD::TRUNCATE.
|
static |
Return true if the given stack call argument is already available in the same position (relatively) of the caller's incoming argument stack.
Definition at line 296 of file M68kISelLowering.cpp.
References llvm::ISD::ANY_EXTEND, assert(), llvm::ISD::AssertZext, llvm::ISD::BITCAST, llvm::ISD::CopyFromReg, llvm::ISD::FrameIndex, llvm::FrameIndexSDNode::getIndex(), llvm::CCValAssign::getLocVT(), llvm::MachineFrameInfo::getObjectOffset(), llvm::MachineFrameInfo::getObjectSize(), llvm::SDValue::getOpcode(), llvm::SDValue::getOperand(), llvm::EVT::getSizeInBits(), llvm::MVT::getSizeInBits(), llvm::SDValue::getValueType(), llvm::MachineFrameInfo::isFixedObjectIndex(), llvm::HexagonInstrInfo::isLoadFromStackSlot(), llvm::MachineFrameInfo::isObjectSExt(), llvm::MachineFrameInfo::isObjectZExt(), llvm::Register::isVirtualRegister(), MRI, llvm::Offset, Ptr, TII, llvm::ISD::TRUNCATE, and llvm::ISD::ZERO_EXTEND.
|
static |
Return true if we might ever do TCO for calls with this calling convention.
Definition at line 278 of file M68kISelLowering.cpp.
References llvm::CallingConv::C, canGuaranteeTCO(), and CC.
|
static |
Return true if the function is being made into a tailcall target by changing its ABI.
Definition at line 290 of file M68kISelLowering.cpp.
References canGuaranteeTCO(), and CC.
Referenced by llvm::X86::isCalleePop().
STATISTIC | ( | NumTailCalls | , |
"Number of tail calls" | |||
) |
|
static |
Definition at line 1723 of file M68kISelLowering.cpp.
References llvm::M68k::COND_CC, llvm::M68k::COND_CS, llvm::M68k::COND_EQ, llvm::M68k::COND_GE, llvm::M68k::COND_GT, llvm::M68k::COND_HI, llvm::M68k::COND_LE, llvm::M68k::COND_LS, llvm::M68k::COND_LT, llvm::M68k::COND_NE, llvm_unreachable, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETNE, llvm::ISD::SETUGE, llvm::ISD::SETUGT, llvm::ISD::SETULE, and llvm::ISD::SETULT.
Referenced by TranslateM68kCC().
|
static |
Do a one-to-one translation of a ISD::CondCode to the M68k-specific condition code, returning the condition code and the LHS/RHS of the comparison to make.
Definition at line 1753 of file M68kISelLowering.cpp.
References llvm::M68k::COND_CC, llvm::M68k::COND_CS, llvm::M68k::COND_EQ, llvm::M68k::COND_HI, llvm::M68k::COND_INVALID, llvm::M68k::COND_LE, llvm::M68k::COND_LS, llvm::M68k::COND_MI, llvm::M68k::COND_NE, llvm::M68k::COND_PL, DL, llvm::SelectionDAG::getConstant(), llvm::ISD::isNON_EXTLoad(), LHS, llvm_unreachable, RHS, llvm::ISD::SETEQ, llvm::ISD::SETGE, llvm::ISD::SETGT, llvm::ISD::SETLE, llvm::ISD::SETLT, llvm::ISD::SETNE, llvm::ISD::SETOEQ, llvm::ISD::SETOGE, llvm::ISD::SETOGT, llvm::ISD::SETOLE, llvm::ISD::SETOLT, llvm::ISD::SETONE, llvm::ISD::SETUEQ, llvm::ISD::SETUGE, llvm::ISD::SETUGT, llvm::ISD::SETULE, llvm::ISD::SETULT, llvm::ISD::SETUNE, std::swap(), and TranslateIntegerM68kCC().