mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
The hasMemory argument is irrelevant to how the argument
for an "i" constraint should get lowered; PR 6309. While this argument was passed around a lot, this is the only place it was used, so it goes away from a lot of other places. llvm-svn: 106893
This commit is contained in:
parent
a1739048a1
commit
b1fc776fca
@ -1310,11 +1310,9 @@ public:
|
||||
/// type to use for the specific AsmOperandInfo, setting
|
||||
/// OpInfo.ConstraintCode and OpInfo.ConstraintType. If the actual operand
|
||||
/// being passed in is available, it can be passed in as Op, otherwise an
|
||||
/// empty SDValue can be passed. If hasMemory is true it means one of the asm
|
||||
/// constraint of the inline asm instruction being processed is 'm'.
|
||||
/// empty SDValue can be passed.
|
||||
virtual void ComputeConstraintToUse(AsmOperandInfo &OpInfo,
|
||||
SDValue Op,
|
||||
bool hasMemory,
|
||||
SelectionDAG *DAG = 0) const;
|
||||
|
||||
/// getConstraintType - Given a constraint, return the type of constraint it
|
||||
@ -1349,11 +1347,8 @@ public:
|
||||
virtual const char *LowerXConstraint(EVT ConstraintVT) const;
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is true
|
||||
/// it means one of the asm constraint of the inline asm instruction being
|
||||
/// processed is 'm'.
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op, char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -5340,7 +5340,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
}
|
||||
|
||||
// Compute the constraint code and ConstraintType to use.
|
||||
TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, hasMemory, &DAG);
|
||||
TLI.ComputeConstraintToUse(OpInfo, OpInfo.CallOperand, &DAG);
|
||||
|
||||
// If this is a memory input, and if the operand is not indirect, do what we
|
||||
// need to to provide an address for the memory input.
|
||||
@ -5542,7 +5542,7 @@ void SelectionDAGBuilder::visitInlineAsm(ImmutableCallSite CS) {
|
||||
|
||||
std::vector<SDValue> Ops;
|
||||
TLI.LowerAsmOperandForConstraint(InOperandVal, OpInfo.ConstraintCode[0],
|
||||
hasMemory, Ops, DAG);
|
||||
Ops, DAG);
|
||||
if (Ops.empty())
|
||||
report_fatal_error("Invalid operand for inline asm constraint '" +
|
||||
Twine(OpInfo.ConstraintCode) + "'!");
|
||||
|
@ -2383,7 +2383,6 @@ const char *TargetLowering::LowerXConstraint(EVT ConstraintVT) const{
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
switch (ConstraintLetter) {
|
||||
@ -2544,7 +2543,7 @@ static unsigned getConstraintGenerality(TargetLowering::ConstraintType CT) {
|
||||
/// 'm' over 'r', for example.
|
||||
///
|
||||
static void ChooseConstraint(TargetLowering::AsmOperandInfo &OpInfo,
|
||||
bool hasMemory, const TargetLowering &TLI,
|
||||
const TargetLowering &TLI,
|
||||
SDValue Op, SelectionDAG *DAG) {
|
||||
assert(OpInfo.Codes.size() > 1 && "Doesn't have multiple constraint options");
|
||||
unsigned BestIdx = 0;
|
||||
@ -2564,7 +2563,7 @@ static void ChooseConstraint(TargetLowering::AsmOperandInfo &OpInfo,
|
||||
assert(OpInfo.Codes[i].size() == 1 &&
|
||||
"Unhandled multi-letter 'other' constraint");
|
||||
std::vector<SDValue> ResultOps;
|
||||
TLI.LowerAsmOperandForConstraint(Op, OpInfo.Codes[i][0], hasMemory,
|
||||
TLI.LowerAsmOperandForConstraint(Op, OpInfo.Codes[i][0],
|
||||
ResultOps, *DAG);
|
||||
if (!ResultOps.empty()) {
|
||||
BestType = CType;
|
||||
@ -2591,7 +2590,6 @@ static void ChooseConstraint(TargetLowering::AsmOperandInfo &OpInfo,
|
||||
/// OpInfo.ConstraintCode and OpInfo.ConstraintType.
|
||||
void TargetLowering::ComputeConstraintToUse(AsmOperandInfo &OpInfo,
|
||||
SDValue Op,
|
||||
bool hasMemory,
|
||||
SelectionDAG *DAG) const {
|
||||
assert(!OpInfo.Codes.empty() && "Must have at least one constraint");
|
||||
|
||||
@ -2600,7 +2598,7 @@ void TargetLowering::ComputeConstraintToUse(AsmOperandInfo &OpInfo,
|
||||
OpInfo.ConstraintCode = OpInfo.Codes[0];
|
||||
OpInfo.ConstraintType = getConstraintType(OpInfo.ConstraintCode);
|
||||
} else {
|
||||
ChooseConstraint(OpInfo, hasMemory, *this, Op, DAG);
|
||||
ChooseConstraint(OpInfo, *this, Op, DAG);
|
||||
}
|
||||
|
||||
// 'X' matches anything.
|
||||
|
@ -5049,7 +5049,6 @@ getRegClassForInlineAsmConstraint(const std::string &Constraint,
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char Constraint,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0, 0);
|
||||
@ -5198,8 +5197,7 @@ void ARMTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
Ops.push_back(Result);
|
||||
return;
|
||||
}
|
||||
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, hasMemory,
|
||||
Ops, DAG);
|
||||
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -242,7 +242,6 @@ namespace llvm {
|
||||
/// being processed is 'm'.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -3064,12 +3064,10 @@ SPUTargetLowering::ComputeNumSignBitsForTargetNode(SDValue Op,
|
||||
void
|
||||
SPUTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
// Default, for the time being, to the base class handler
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, ConstraintLetter, hasMemory,
|
||||
Ops, DAG);
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, ConstraintLetter, Ops, DAG);
|
||||
}
|
||||
|
||||
/// isLegalAddressImmediate - Return true if the integer value can be used
|
||||
|
@ -134,7 +134,6 @@ namespace llvm {
|
||||
EVT VT) const;
|
||||
|
||||
void LowerAsmOperandForConstraint(SDValue Op, char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -5380,11 +5380,8 @@ PPCTargetLowering::getRegForInlineAsmConstraint(const std::string &Constraint,
|
||||
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is true
|
||||
/// it means one of the asm constraint of the inline asm instruction being
|
||||
/// processed is 'm'.
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op, char Letter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0,0);
|
||||
@ -5443,7 +5440,7 @@ void PPCTargetLowering::LowerAsmOperandForConstraint(SDValue Op, char Letter,
|
||||
}
|
||||
|
||||
// Handle standard constraint letters.
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, Letter, hasMemory, Ops, DAG);
|
||||
TargetLowering::LowerAsmOperandForConstraint(Op, Letter, Ops, DAG);
|
||||
}
|
||||
|
||||
// isLegalAddressingMode - Return true if the addressing mode represented
|
||||
|
@ -318,12 +318,9 @@ namespace llvm {
|
||||
unsigned getByValTypeAlignment(const Type *Ty) const;
|
||||
|
||||
/// LowerAsmOperandForConstraint - Lower the specified operand into the Ops
|
||||
/// vector. If it is invalid, don't add anything to Ops. If hasMemory is
|
||||
/// true it means one of the asm constraint of the inline asm instruction
|
||||
/// being processed is 'm'.
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -10168,7 +10168,6 @@ LowerXConstraint(EVT ConstraintVT) const {
|
||||
/// vector. If it is invalid, don't add anything to Ops.
|
||||
void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
char Constraint,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue>&Ops,
|
||||
SelectionDAG &DAG) const {
|
||||
SDValue Result(0, 0);
|
||||
@ -10284,11 +10283,7 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
getTargetMachine())))
|
||||
return;
|
||||
|
||||
if (hasMemory)
|
||||
Op = LowerGlobalAddress(GV, Op.getDebugLoc(), Offset, DAG);
|
||||
else
|
||||
Op = DAG.getTargetGlobalAddress(GV, GA->getValueType(0), Offset);
|
||||
Result = Op;
|
||||
Result = DAG.getTargetGlobalAddress(GV, GA->getValueType(0), Offset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -10297,8 +10292,7 @@ void X86TargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|
||||
Ops.push_back(Result);
|
||||
return;
|
||||
}
|
||||
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, hasMemory,
|
||||
Ops, DAG);
|
||||
return TargetLowering::LowerAsmOperandForConstraint(Op, Constraint, Ops, DAG);
|
||||
}
|
||||
|
||||
std::vector<unsigned> X86TargetLowering::
|
||||
|
@ -500,7 +500,6 @@ namespace llvm {
|
||||
/// being processed is 'm'.
|
||||
virtual void LowerAsmOperandForConstraint(SDValue Op,
|
||||
char ConstraintLetter,
|
||||
bool hasMemory,
|
||||
std::vector<SDValue> &Ops,
|
||||
SelectionDAG &DAG) const;
|
||||
|
||||
|
@ -759,8 +759,7 @@ bool CodeGenPrepare::OptimizeInlineAsmInst(Instruction *I, CallSite CS,
|
||||
}
|
||||
|
||||
// Compute the constraint code and ConstraintType to use.
|
||||
TLI->ComputeConstraintToUse(OpInfo, SDValue(),
|
||||
OpInfo.ConstraintType == TargetLowering::C_Memory);
|
||||
TLI->ComputeConstraintToUse(OpInfo, SDValue());
|
||||
|
||||
if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
|
||||
OpInfo.isIndirect) {
|
||||
|
@ -401,8 +401,7 @@ static bool IsOperandAMemoryOperand(CallInst *CI, InlineAsm *IA, Value *OpVal,
|
||||
}
|
||||
|
||||
// Compute the constraint code and ConstraintType to use.
|
||||
TLI.ComputeConstraintToUse(OpInfo, SDValue(),
|
||||
OpInfo.ConstraintType == TargetLowering::C_Memory);
|
||||
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!
|
||||
|
19
test/CodeGen/X86/2010-06-25-asm-RA-crash.ll
Normal file
19
test/CodeGen/X86/2010-06-25-asm-RA-crash.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: llc %s -disable-fp-elim -mtriple=i686-pc-mingw32
|
||||
|
||||
%struct.__SEH2Frame = type {}
|
||||
|
||||
define void @_SEH2FrameHandler() nounwind {
|
||||
entry:
|
||||
%target.addr.i = alloca i8*, align 4 ; <i8**> [#uses=2]
|
||||
%frame = alloca %struct.__SEH2Frame*, align 4 ; <%struct.__SEH2Frame**> [#uses=1]
|
||||
%tmp = load %struct.__SEH2Frame** %frame ; <%struct.__SEH2Frame*> [#uses=1]
|
||||
%conv = bitcast %struct.__SEH2Frame* %tmp to i8* ; <i8*> [#uses=1]
|
||||
store i8* %conv, i8** %target.addr.i
|
||||
%tmp.i = load i8** %target.addr.i ; <i8*> [#uses=1]
|
||||
call void asm sideeffect "push %ebp\0Apush $$0\0Apush $$0\0Apush $$Return${:uid}\0Apush $0\0Acall ${1:c}\0AReturn${:uid}: pop %ebp\0A", "imr,imr,~{ax},~{bx},~{cx},~{dx},~{si},~{di},~{flags},~{memory},~{dirflag},~{fpsr},~{flags}"(i8* %tmp.i, void (...)* @RtlUnwind) nounwind, !srcloc !0
|
||||
ret void
|
||||
}
|
||||
|
||||
declare x86_stdcallcc void @RtlUnwind(...)
|
||||
|
||||
!0 = metadata !{i32 215}
|
Loading…
Reference in New Issue
Block a user