mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-25 00:35:30 +00:00
SelectionDAG: Pass along the original argument/element type in ISD::InputArg
For some targets, it is useful to be able to look at the original type of an argument without having to dig through the original IR. This also fixes a bug in SelectionDAGBuilder where InputArg.PartOffset was not taking into account the offset of structure elements. Patch by: Justin Holewinski Tom Stellard: - Changed the type of ArgVT to EVT, so it can store non-simple types like v3i32. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193214 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6a2f9b9137
commit
d0716b0647
include/llvm/Target
lib/CodeGen
@ -113,6 +113,7 @@ namespace ISD {
|
||||
struct InputArg {
|
||||
ArgFlagsTy Flags;
|
||||
MVT VT;
|
||||
EVT ArgVT;
|
||||
bool Used;
|
||||
|
||||
/// Index original Function's argument.
|
||||
@ -124,10 +125,11 @@ namespace ISD {
|
||||
unsigned PartOffset;
|
||||
|
||||
InputArg() : VT(MVT::Other), Used(false) {}
|
||||
InputArg(ArgFlagsTy flags, EVT vt, bool used,
|
||||
InputArg(ArgFlagsTy flags, EVT vt, EVT argvt, bool used,
|
||||
unsigned origIdx, unsigned partOffs)
|
||||
: Flags(flags), Used(used), OrigArgIndex(origIdx), PartOffset(partOffs) {
|
||||
VT = vt.getSimpleVT();
|
||||
ArgVT = argvt;
|
||||
}
|
||||
};
|
||||
|
||||
@ -138,6 +140,7 @@ namespace ISD {
|
||||
struct OutputArg {
|
||||
ArgFlagsTy Flags;
|
||||
MVT VT;
|
||||
EVT ArgVT;
|
||||
|
||||
/// IsFixed - Is this a "fixed" value, ie not passed through a vararg "...".
|
||||
bool IsFixed;
|
||||
@ -151,11 +154,12 @@ namespace ISD {
|
||||
unsigned PartOffset;
|
||||
|
||||
OutputArg() : IsFixed(false) {}
|
||||
OutputArg(ArgFlagsTy flags, EVT vt, bool isfixed,
|
||||
OutputArg(ArgFlagsTy flags, EVT vt, EVT argvt, bool isfixed,
|
||||
unsigned origIdx, unsigned partOffs)
|
||||
: Flags(flags), IsFixed(isfixed), OrigArgIndex(origIdx),
|
||||
PartOffset(partOffs) {
|
||||
VT = vt.getSimpleVT();
|
||||
ArgVT = argvt;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -1268,7 +1268,7 @@ void SelectionDAGBuilder::visitRet(const ReturnInst &I) {
|
||||
|
||||
for (unsigned i = 0; i < NumParts; ++i) {
|
||||
Outs.push_back(ISD::OutputArg(Flags, Parts[i].getValueType(),
|
||||
/*isfixed=*/true, 0, 0));
|
||||
VT, /*isfixed=*/true, 0, 0));
|
||||
OutVals.push_back(Parts[i]);
|
||||
}
|
||||
}
|
||||
@ -6738,6 +6738,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
||||
for (unsigned i = 0; i != NumRegs; ++i) {
|
||||
ISD::InputArg MyFlags;
|
||||
MyFlags.VT = RegisterVT;
|
||||
MyFlags.ArgVT = VT;
|
||||
MyFlags.Used = CLI.IsReturnValueUsed;
|
||||
if (CLI.RetSExt)
|
||||
MyFlags.Flags.setSExt();
|
||||
@ -6827,7 +6828,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
||||
|
||||
for (unsigned j = 0; j != NumParts; ++j) {
|
||||
// if it isn't first piece, alignment must be 1
|
||||
ISD::OutputArg MyFlags(Flags, Parts[j].getValueType(),
|
||||
ISD::OutputArg MyFlags(Flags, Parts[j].getValueType(), VT,
|
||||
i < CLI.NumFixedArgs,
|
||||
i, j*Parts[j].getValueType().getStoreSize());
|
||||
if (NumParts > 1 && j == 0)
|
||||
@ -6966,7 +6967,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
ISD::ArgFlagsTy Flags;
|
||||
Flags.setSRet();
|
||||
MVT RegisterVT = TLI->getRegisterType(*DAG.getContext(), ValueVTs[0]);
|
||||
ISD::InputArg RetArg(Flags, RegisterVT, true, 0, 0);
|
||||
ISD::InputArg RetArg(Flags, RegisterVT, ValueVTs[0], true, 0, 0);
|
||||
Ins.push_back(RetArg);
|
||||
}
|
||||
|
||||
@ -6977,6 +6978,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
ComputeValueVTs(*TLI, I->getType(), ValueVTs);
|
||||
bool isArgValueUsed = !I->use_empty();
|
||||
unsigned PartBase = 0;
|
||||
for (unsigned Value = 0, NumValues = ValueVTs.size();
|
||||
Value != NumValues; ++Value) {
|
||||
EVT VT = ValueVTs[Value];
|
||||
@ -7014,8 +7016,8 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
MVT RegisterVT = TLI->getRegisterType(*CurDAG->getContext(), VT);
|
||||
unsigned NumRegs = TLI->getNumRegisters(*CurDAG->getContext(), VT);
|
||||
for (unsigned i = 0; i != NumRegs; ++i) {
|
||||
ISD::InputArg MyFlags(Flags, RegisterVT, isArgValueUsed,
|
||||
Idx-1, i*RegisterVT.getStoreSize());
|
||||
ISD::InputArg MyFlags(Flags, RegisterVT, VT, isArgValueUsed,
|
||||
Idx-1, PartBase+i*RegisterVT.getStoreSize());
|
||||
if (NumRegs > 1 && i == 0)
|
||||
MyFlags.Flags.setSplit();
|
||||
// if it isn't first piece, alignment must be 1
|
||||
@ -7023,6 +7025,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
||||
MyFlags.Flags.setOrigAlign(1);
|
||||
Ins.push_back(MyFlags);
|
||||
}
|
||||
PartBase += VT.getStoreSize();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1202,7 +1202,7 @@ void llvm::GetReturnInfo(Type* ReturnType, AttributeSet attr,
|
||||
Flags.setZExt();
|
||||
|
||||
for (unsigned i = 0; i < NumParts; ++i)
|
||||
Outs.push_back(ISD::OutputArg(Flags, PartVT, /*isFixed=*/true, 0, 0));
|
||||
Outs.push_back(ISD::OutputArg(Flags, PartVT, VT, /*isFixed=*/true, 0, 0));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user