forked from OSchip/llvm-project
getRegForInlineAsmConstraint wants to use TargetRegisterInfo for
a lookup, pass that in rather than use a naked call to getSubtargetImpl. This involved passing down and around either a TargetMachine or TargetRegisterInfo. Update all callers/definitions around the targets and SelectionDAG. llvm-svn: 230699
This commit is contained in:
parent
d75c00c638
commit
11e4df73c8
|
@ -2525,7 +2525,8 @@ public:
|
|||
/// specific constraints and their prefixes, and also tie in the associated
|
||||
/// operand values. If this returns an empty vector, and if the constraint
|
||||
/// string itself isn't empty, there was an error parsing.
|
||||
virtual AsmOperandInfoVector ParseConstraints(ImmutableCallSite CS) const;
|
||||
virtual AsmOperandInfoVector ParseConstraints(const TargetRegisterInfo *TRI,
|
||||
ImmutableCallSite CS) const;
|
||||
|
||||
/// Examine constraint type and operand type and determine a weight value.
|
||||
/// The operand object must already have been set up with the operand type.
|
||||
|
@ -2557,9 +2558,9 @@ public:
|
|||
///
|
||||
/// This should only be used for C_Register constraints. On error, this
|
||||
/// returns a register number of 0 and a null register class pointer.
|
||||
virtual std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const;
|
||||
virtual std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint, MVT VT) const;
|
||||
|
||||
/// Try to replace an X constraint, which matches anything, with another that
|
||||
/// has more specific requirements based on the type of the corresponding
|
||||
|
|
|
@ -2814,14 +2814,17 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
|
|||
/// inline asm call are due to memory operands. If so, return true, otherwise
|
||||
/// return false.
|
||||
static bool IsOperandAMemoryOperand(CallInst *CI, InlineAsm *IA, Value *OpVal,
|
||||
const TargetLowering &TLI) {
|
||||
const TargetMachine &TM) {
|
||||
const Function *F = CI->getParent()->getParent();
|
||||
const TargetLowering *TLI = TM.getSubtargetImpl(*F)->getTargetLowering();
|
||||
const TargetRegisterInfo *TRI = TM.getSubtargetImpl(*F)->getRegisterInfo();
|
||||
TargetLowering::AsmOperandInfoVector TargetConstraints =
|
||||
TLI.ParseConstraints(ImmutableCallSite(CI));
|
||||
TLI->ParseConstraints(TRI, ImmutableCallSite(CI));
|
||||
for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {
|
||||
TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i];
|
||||
|
||||
// Compute the constraint code and ConstraintType to use.
|
||||
TLI.ComputeConstraintToUse(OpInfo, SDValue());
|
||||
TLI->ComputeConstraintToUse(OpInfo, SDValue());
|
||||
|
||||
// If this asm operand is our Value*, and if it isn't an indirect memory
|
||||
// operand, we can't fold it!
|
||||
|
@ -2837,10 +2840,10 @@ static bool IsOperandAMemoryOperand(CallInst *CI, InlineAsm *IA, Value *OpVal,
|
|||
/// FindAllMemoryUses - Recursively walk all the uses of I until we find a
|
||||
/// memory use. If we find an obviously non-foldable instruction, return true.
|
||||
/// Add the ultimately found memory instructions to MemoryUses.
|
||||
static bool FindAllMemoryUses(Instruction *I,
|
||||
SmallVectorImpl<std::pair<Instruction*,unsigned> > &MemoryUses,
|
||||
SmallPtrSetImpl<Instruction*> &ConsideredInsts,
|
||||
const TargetLowering &TLI) {
|
||||
static bool FindAllMemoryUses(
|
||||
Instruction *I,
|
||||
SmallVectorImpl<std::pair<Instruction *, unsigned>> &MemoryUses,
|
||||
SmallPtrSetImpl<Instruction *> &ConsideredInsts, const TargetMachine &TM) {
|
||||
// If we already considered this instruction, we're done.
|
||||
if (!ConsideredInsts.insert(I).second)
|
||||
return false;
|
||||
|
@ -2870,12 +2873,12 @@ static bool FindAllMemoryUses(Instruction *I,
|
|||
if (!IA) return true;
|
||||
|
||||
// If this is a memory operand, we're cool, otherwise bail out.
|
||||
if (!IsOperandAMemoryOperand(CI, IA, I, TLI))
|
||||
if (!IsOperandAMemoryOperand(CI, IA, I, TM))
|
||||
return true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FindAllMemoryUses(UserI, MemoryUses, ConsideredInsts, TLI))
|
||||
if (FindAllMemoryUses(UserI, MemoryUses, ConsideredInsts, TM))
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2963,7 +2966,7 @@ IsProfitableToFoldIntoAddressingMode(Instruction *I, ExtAddrMode &AMBefore,
|
|||
// uses.
|
||||
SmallVector<std::pair<Instruction*,unsigned>, 16> MemoryUses;
|
||||
SmallPtrSet<Instruction*, 16> ConsideredInsts;
|
||||
if (FindAllMemoryUses(I, MemoryUses, ConsideredInsts, TLI))
|
||||
if (FindAllMemoryUses(I, MemoryUses, ConsideredInsts, TM))
|
||||
return false; // Has a non-memory, non-foldable use!
|
||||
|
||||
// Now that we know that all uses of this instruction are part of a chain of
|
||||
|
@ -3372,8 +3375,10 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
|||
bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) {
|
||||
bool MadeChange = false;
|
||||
|
||||
const TargetRegisterInfo *TRI =
|
||||
TM->getSubtargetImpl(*CS->getParent()->getParent())->getRegisterInfo();
|
||||
TargetLowering::AsmOperandInfoVector
|
||||
TargetConstraints = TLI->ParseConstraints(CS);
|
||||
TargetConstraints = TLI->ParseConstraints(TRI, CS);
|
||||
unsigned ArgNo = 0;
|
||||
for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {
|
||||
TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i];
|
||||
|
|
|
@ -133,16 +133,17 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
|
|||
ImmutableCallSite CS(I);
|
||||
if (isa<InlineAsm>(CS.getCalledValue())) {
|
||||
unsigned SP = TLI->getStackPointerRegisterToSaveRestore();
|
||||
const TargetRegisterInfo *TRI = MF->getSubtarget().getRegisterInfo();
|
||||
std::vector<TargetLowering::AsmOperandInfo> Ops =
|
||||
TLI->ParseConstraints(CS);
|
||||
TLI->ParseConstraints(TRI, CS);
|
||||
for (size_t I = 0, E = Ops.size(); I != E; ++I) {
|
||||
TargetLowering::AsmOperandInfo &Op = Ops[I];
|
||||
if (Op.Type == InlineAsm::isClobber) {
|
||||
// Clobbers don't have SDValue operands, hence SDValue().
|
||||
TLI->ComputeConstraintToUse(Op, SDValue(), DAG);
|
||||
std::pair<unsigned, const TargetRegisterClass *> PhysReg =
|
||||
TLI->getRegForInlineAsmConstraint(Op.ConstraintCode,
|
||||
Op.ConstraintVT);
|
||||
TLI->getRegForInlineAsmConstraint(TRI, Op.ConstraintCode,
|
||||
Op.ConstraintVT);
|
||||
if (PhysReg.first == SP)
|
||||
MF->getFrameInfo()->setHasInlineAsmWithSPAdjust(true);
|
||||
}
|
||||
|
|
|
@ -6403,9 +6403,10 @@ static void GetRegistersForValue(SelectionDAG &DAG,
|
|||
|
||||
// If this is a constraint for a single physreg, or a constraint for a
|
||||
// register class, find it.
|
||||
std::pair<unsigned, const TargetRegisterClass*> PhysReg =
|
||||
TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass *> PhysReg =
|
||||
TLI.getRegForInlineAsmConstraint(MF.getSubtarget().getRegisterInfo(),
|
||||
OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
|
||||
unsigned NumRegs = 1;
|
||||
if (OpInfo.ConstraintVT != MVT::Other) {
|
||||
|
@ -6501,8 +6502,8 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
|||
SDISelAsmOperandInfoVector ConstraintOperands;
|
||||
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
TargetLowering::AsmOperandInfoVector
|
||||
TargetConstraints = TLI.ParseConstraints(CS);
|
||||
TargetLowering::AsmOperandInfoVector TargetConstraints =
|
||||
TLI.ParseConstraints(DAG.getSubtarget().getRegisterInfo(), CS);
|
||||
|
||||
bool hasMemory = false;
|
||||
|
||||
|
@ -6594,12 +6595,13 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
|||
SDISelAsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
|
||||
|
||||
if (OpInfo.ConstraintVT != Input.ConstraintVT) {
|
||||
std::pair<unsigned, const TargetRegisterClass*> MatchRC =
|
||||
TLI.getRegForInlineAsmConstraint(OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass*> InputRC =
|
||||
TLI.getRegForInlineAsmConstraint(Input.ConstraintCode,
|
||||
Input.ConstraintVT);
|
||||
const TargetRegisterInfo *TRI = DAG.getSubtarget().getRegisterInfo();
|
||||
std::pair<unsigned, const TargetRegisterClass *> MatchRC =
|
||||
TLI.getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass *> InputRC =
|
||||
TLI.getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
|
||||
Input.ConstraintVT);
|
||||
if ((OpInfo.ConstraintVT.isInteger() !=
|
||||
Input.ConstraintVT.isInteger()) ||
|
||||
(MatchRC.second != InputRC.second)) {
|
||||
|
|
|
@ -2187,9 +2187,10 @@ void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*> TargetLowering::
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *RI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.empty() || Constraint[0] != '{')
|
||||
return std::make_pair(0u, static_cast<TargetRegisterClass*>(nullptr));
|
||||
assert(*(Constraint.end()-1) == '}' && "Not a brace enclosed constraint?");
|
||||
|
@ -2201,8 +2202,6 @@ getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
std::make_pair(0u, static_cast<const TargetRegisterClass*>(nullptr));
|
||||
|
||||
// Figure out which register class contains this reg.
|
||||
const TargetRegisterInfo *RI =
|
||||
getTargetMachine().getSubtargetImpl()->getRegisterInfo();
|
||||
for (TargetRegisterInfo::regclass_iterator RCI = RI->regclass_begin(),
|
||||
E = RI->regclass_end(); RCI != E; ++RCI) {
|
||||
const TargetRegisterClass *RC = *RCI;
|
||||
|
@ -2255,8 +2254,9 @@ unsigned TargetLowering::AsmOperandInfo::getMatchedOperand() const {
|
|||
/// and also tie in the associated operand values.
|
||||
/// If this returns an empty vector, and if the constraint string itself
|
||||
/// isn't empty, there was an error parsing.
|
||||
TargetLowering::AsmOperandInfoVector TargetLowering::ParseConstraints(
|
||||
ImmutableCallSite CS) const {
|
||||
TargetLowering::AsmOperandInfoVector
|
||||
TargetLowering::ParseConstraints(const TargetRegisterInfo *TRI,
|
||||
ImmutableCallSite CS) const {
|
||||
/// ConstraintOperands - Information about all of the constraints.
|
||||
AsmOperandInfoVector ConstraintOperands;
|
||||
const InlineAsm *IA = cast<InlineAsm>(CS.getCalledValue());
|
||||
|
@ -2418,12 +2418,12 @@ TargetLowering::AsmOperandInfoVector TargetLowering::ParseConstraints(
|
|||
AsmOperandInfo &Input = ConstraintOperands[OpInfo.MatchingInput];
|
||||
|
||||
if (OpInfo.ConstraintVT != Input.ConstraintVT) {
|
||||
std::pair<unsigned, const TargetRegisterClass*> MatchRC =
|
||||
getRegForInlineAsmConstraint(OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass*> InputRC =
|
||||
getRegForInlineAsmConstraint(Input.ConstraintCode,
|
||||
Input.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass *> MatchRC =
|
||||
getRegForInlineAsmConstraint(TRI, OpInfo.ConstraintCode,
|
||||
OpInfo.ConstraintVT);
|
||||
std::pair<unsigned, const TargetRegisterClass *> InputRC =
|
||||
getRegForInlineAsmConstraint(TRI, Input.ConstraintCode,
|
||||
Input.ConstraintVT);
|
||||
if ((OpInfo.ConstraintVT.isInteger() !=
|
||||
Input.ConstraintVT.isInteger()) ||
|
||||
(MatchRC.second != InputRC.second)) {
|
||||
|
|
|
@ -4263,7 +4263,8 @@ AArch64TargetLowering::getSingleConstraintMatchWeight(
|
|||
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
AArch64TargetLowering::getRegForInlineAsmConstraint(
|
||||
const std::string &Constraint, MVT VT) const {
|
||||
const TargetRegisterInfo *TRI, const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
case 'r':
|
||||
|
@ -4292,7 +4293,7 @@ AArch64TargetLowering::getRegForInlineAsmConstraint(
|
|||
// Use the default implementation in TargetLowering to convert the register
|
||||
// constraint into a member of a register class.
|
||||
std::pair<unsigned, const TargetRegisterClass *> Res;
|
||||
Res = TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
Res = TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
|
||||
// Not found as a standard register?
|
||||
if (!Res.second) {
|
||||
|
|
|
@ -453,7 +453,8 @@ private:
|
|||
const char *constraint) const override;
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
|
|
|
@ -10629,7 +10629,8 @@ ARMTargetLowering::getSingleConstraintMatchWeight(
|
|||
|
||||
typedef std::pair<unsigned, const TargetRegisterClass*> RCPair;
|
||||
RCPair
|
||||
ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
ARMTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
// GCC ARM Constraint Letters
|
||||
|
@ -10675,7 +10676,7 @@ ARMTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
if (StringRef("{cc}").equals_lower(Constraint))
|
||||
return std::make_pair(unsigned(ARM::CPSR), &ARM::CCRRegClass);
|
||||
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
|
|
|
@ -333,9 +333,10 @@ namespace llvm {
|
|||
ConstraintWeight getSingleConstraintMatchWeight(
|
||||
AsmOperandInfo &info, const char *constraint) const override;
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is
|
||||
|
|
|
@ -1595,10 +1595,10 @@ const {
|
|||
// Inline Assembly Support
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
HexagonTargetLowering::getRegForInlineAsmConstraint(const
|
||||
std::string &Constraint,
|
||||
MVT VT) const {
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
HexagonTargetLowering::getRegForInlineAsmConstraint(
|
||||
const TargetRegisterInfo *TRI, const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
case 'r': // R0-R31
|
||||
|
@ -1619,7 +1619,7 @@ HexagonTargetLowering::getRegForInlineAsmConstraint(const
|
|||
}
|
||||
}
|
||||
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
/// isFPImmLegal - Returns true if the target can instruction select the
|
||||
|
|
|
@ -165,8 +165,9 @@ bool isPositiveHalfWord(SDNode *N);
|
|||
ISD::MemIndexedMode &AM,
|
||||
SelectionDAG &DAG) const override;
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
// Intrinsics
|
||||
|
|
|
@ -225,10 +225,10 @@ MSP430TargetLowering::getConstraintType(const std::string &Constraint) const {
|
|||
return TargetLowering::getConstraintType(Constraint);
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
MSP430TargetLowering::
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
MSP430TargetLowering::getRegForInlineAsmConstraint(
|
||||
const TargetRegisterInfo *TRI, const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
// GCC Constraint Letters
|
||||
switch (Constraint[0]) {
|
||||
|
@ -241,7 +241,7 @@ getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
}
|
||||
}
|
||||
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -97,8 +97,9 @@ namespace llvm {
|
|||
|
||||
TargetLowering::ConstraintType
|
||||
getConstraintType(const std::string &Constraint) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
/// isTruncateFree - Return true if it's free to truncate a value of type
|
||||
|
|
|
@ -3291,9 +3291,10 @@ parseRegForInlineAsmConstraint(StringRef C, MVT VT) const {
|
|||
/// Given a register class constraint, like 'r', if this corresponds directly
|
||||
/// to an LLVM register class, return a register of 0 and the register class
|
||||
/// pointer.
|
||||
std::pair<unsigned, const TargetRegisterClass*> MipsTargetLowering::
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const
|
||||
{
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
MipsTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
case 'd': // Address register. Same as 'r' unless generating MIPS16 code.
|
||||
|
@ -3349,7 +3350,7 @@ getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const
|
|||
if (R.second)
|
||||
return R;
|
||||
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
|
|
|
@ -489,9 +489,10 @@ namespace llvm {
|
|||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
parseRegForInlineAsmConstraint(StringRef C, MVT VT) const;
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is
|
||||
|
|
|
@ -3762,7 +3762,8 @@ NVPTXTargetLowering::getConstraintType(const std::string &Constraint) const {
|
|||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
NVPTXTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
NVPTXTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
|
@ -3783,7 +3784,7 @@ NVPTXTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
return std::make_pair(0U, &NVPTX::Float64RegsRegClass);
|
||||
}
|
||||
}
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
/// getFunctionAlignment - Return the Log2 alignment of this function.
|
||||
|
|
|
@ -470,7 +470,8 @@ public:
|
|||
ConstraintType
|
||||
getConstraintType(const std::string &Constraint) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
SDValue LowerFormalArguments(
|
||||
|
|
|
@ -10431,8 +10431,9 @@ PPCTargetLowering::getSingleConstraintMatchWeight(
|
|||
return weight;
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
PPCTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
// GCC RS6000 Constraint Letters
|
||||
|
@ -10473,8 +10474,8 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
return std::make_pair(0U, &PPC::VSFRCRegClass);
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*> R =
|
||||
TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
std::pair<unsigned, const TargetRegisterClass *> R =
|
||||
TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
|
||||
// r[0-9]+ are used, on PPC64, to refer to the corresponding 64-bit registers
|
||||
// (which we call X[0-9]+). If a 64-bit value has been requested, and a
|
||||
|
@ -10483,12 +10484,10 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
// FIXME: If TargetLowering::getRegForInlineAsmConstraint could somehow use
|
||||
// the AsmName field from *RegisterInfo.td, then this would not be necessary.
|
||||
if (R.first && VT == MVT::i64 && Subtarget.isPPC64() &&
|
||||
PPC::GPRCRegClass.contains(R.first)) {
|
||||
const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
|
||||
PPC::GPRCRegClass.contains(R.first))
|
||||
return std::make_pair(TRI->getMatchingSuperReg(R.first,
|
||||
PPC::sub_32, &PPC::G8RCRegClass),
|
||||
&PPC::G8RCRegClass);
|
||||
}
|
||||
|
||||
// GCC accepts 'cc' as an alias for 'cr0', and we need to do the same.
|
||||
if (!R.second && StringRef("{cc}").equals_lower(Constraint)) {
|
||||
|
|
|
@ -509,9 +509,10 @@ namespace llvm {
|
|||
ConstraintWeight getSingleConstraintMatchWeight(
|
||||
AsmOperandInfo &info, const char *constraint) const override;
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
/// getByValTypeAlignment - Return the desired alignment for ByVal aggregate
|
||||
/// function arguments in the caller parameter area. This is the actual
|
||||
|
|
|
@ -3130,8 +3130,9 @@ LowerAsmOperandForConstraint(SDValue Op,
|
|||
TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
SparcTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
SparcTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
|
@ -3156,11 +3157,12 @@ SparcTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
char regIdx = '0' + (intVal % 8);
|
||||
char tmp[] = { '{', regType, regIdx, '}', 0 };
|
||||
std::string newConstraint = std::string(tmp);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(newConstraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, newConstraint,
|
||||
VT);
|
||||
}
|
||||
}
|
||||
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
bool
|
||||
|
|
|
@ -80,8 +80,10 @@ namespace llvm {
|
|||
std::string &Constraint,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
|
||||
MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; }
|
||||
|
|
|
@ -499,8 +499,10 @@ parseRegisterNumber(const std::string &Constraint,
|
|||
return std::make_pair(0U, nullptr);
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass *> SystemZTargetLowering::
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const {
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
SystemZTargetLowering::getRegForInlineAsmConstraint(
|
||||
const TargetRegisterInfo *TRI, const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
// GCC Constraint Letters
|
||||
switch (Constraint[0]) {
|
||||
|
@ -557,7 +559,7 @@ getRegForInlineAsmConstraint(const std::string &Constraint, MVT VT) const {
|
|||
SystemZMC::FP64Regs);
|
||||
}
|
||||
}
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
||||
void SystemZTargetLowering::
|
||||
|
|
|
@ -221,8 +221,9 @@ public:
|
|||
bool isTruncateFree(EVT, EVT) const override;
|
||||
const char *getTargetNodeName(unsigned Opcode) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
TargetLowering::ConstraintType
|
||||
getConstraintType(const std::string &Constraint) const override;
|
||||
TargetLowering::ConstraintWeight
|
||||
|
|
|
@ -23943,8 +23943,9 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
|||
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
X86TargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
// First, see if this is a constraint that directly corresponds to an LLVM
|
||||
// register class.
|
||||
|
@ -24050,7 +24051,7 @@ X86TargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
// Use the default implementation in TargetLowering to convert the register
|
||||
// constraint into a member of a register class.
|
||||
std::pair<unsigned, const TargetRegisterClass*> Res;
|
||||
Res = TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
Res = TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
|
||||
// Not found as a standard register?
|
||||
if (!Res.second) {
|
||||
|
|
|
@ -701,9 +701,10 @@ namespace llvm {
|
|||
/// (e.g. {edx}), return the register number and the register class for the
|
||||
/// register. This should only be used for C_Register constraints. On
|
||||
/// error, this returns a register number of 0.
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
/// Return true if the addressing mode represented
|
||||
/// by AM is legal for this target, for a load/store of the specified type.
|
||||
|
|
|
@ -1957,10 +1957,10 @@ XCoreTargetLowering::isLegalAddressingMode(const AddrMode &AM,
|
|||
// XCore Inline Assembly Support
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
XCoreTargetLowering::
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
XCoreTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const {
|
||||
if (Constraint.size() == 1) {
|
||||
switch (Constraint[0]) {
|
||||
default : break;
|
||||
|
@ -1970,5 +1970,5 @@ getRegForInlineAsmConstraint(const std::string &Constraint,
|
|||
}
|
||||
// Use the default implementation in TargetLowering to convert the register
|
||||
// constraint into a member of a register class.
|
||||
return TargetLowering::getRegForInlineAsmConstraint(Constraint, VT);
|
||||
return TargetLowering::getRegForInlineAsmConstraint(TRI, Constraint, VT);
|
||||
}
|
||||
|
|
|
@ -172,8 +172,9 @@ namespace llvm {
|
|||
SDValue LowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
||||
// Inline asm support
|
||||
std::pair<unsigned, const TargetRegisterClass*>
|
||||
getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
std::pair<unsigned, const TargetRegisterClass *>
|
||||
getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
||||
const std::string &Constraint,
|
||||
MVT VT) const override;
|
||||
|
||||
// Expand specifics
|
||||
|
|
Loading…
Reference in New Issue