mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-24 12:29:33 +00:00
[SelectionDAG] Move RegsForValue into SelectionDAGBuilder.h. NFC.
Summary: The exported class will be used in later change, in StatepointLowering.cpp. It is still internal to SelectionDAG (not exported via include/). Reviewers: reames, atrick Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9478 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236554 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
49d19ee888
commit
7aab5ee93d
@ -22,7 +22,6 @@
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/FastISel.h"
|
||||
#include "llvm/CodeGen/FunctionLoweringInfo.h"
|
||||
#include "llvm/CodeGen/GCMetadata.h"
|
||||
@ -578,93 +577,25 @@ static void getCopyToPartsVector(SelectionDAG &DAG, SDLoc DL,
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
/// RegsForValue - This struct represents the registers (physical or virtual)
|
||||
/// that a particular set of values is assigned, and the type information
|
||||
/// about the value. The most common situation is to represent one value at a
|
||||
/// time, but struct or array values are handled element-wise as multiple
|
||||
/// values. The splitting of aggregates is performed recursively, so that we
|
||||
/// never have aggregate-typed registers. The values at this point do not
|
||||
/// necessarily have legal types, so each value may require one or more
|
||||
/// registers of some legal type.
|
||||
///
|
||||
struct RegsForValue {
|
||||
/// ValueVTs - The value types of the values, which may not be legal, and
|
||||
/// may need be promoted or synthesized from one or more registers.
|
||||
///
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
RegsForValue::RegsForValue() {}
|
||||
|
||||
/// RegVTs - The value types of the registers. This is the same size as
|
||||
/// ValueVTs and it records, for each value, what the type of the assigned
|
||||
/// register or registers are. (Individual values are never synthesized
|
||||
/// from more than one type of register.)
|
||||
///
|
||||
/// With virtual registers, the contents of RegVTs is redundant with TLI's
|
||||
/// getRegisterType member function, however when with physical registers
|
||||
/// it is necessary to have a separate record of the types.
|
||||
///
|
||||
SmallVector<MVT, 4> RegVTs;
|
||||
RegsForValue::RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt,
|
||||
EVT valuevt)
|
||||
: ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs) {}
|
||||
|
||||
/// Regs - This list holds the registers assigned to the values.
|
||||
/// Each legal or promoted value requires one register, and each
|
||||
/// expanded value requires multiple registers.
|
||||
///
|
||||
SmallVector<unsigned, 4> Regs;
|
||||
RegsForValue::RegsForValue(LLVMContext &Context, const TargetLowering &tli,
|
||||
unsigned Reg, Type *Ty) {
|
||||
ComputeValueVTs(tli, Ty, ValueVTs);
|
||||
|
||||
RegsForValue() {}
|
||||
|
||||
RegsForValue(const SmallVector<unsigned, 4> ®s,
|
||||
MVT regvt, EVT valuevt)
|
||||
: ValueVTs(1, valuevt), RegVTs(1, regvt), Regs(regs) {}
|
||||
|
||||
RegsForValue(LLVMContext &Context, const TargetLowering &tli,
|
||||
unsigned Reg, Type *Ty) {
|
||||
ComputeValueVTs(tli, Ty, ValueVTs);
|
||||
|
||||
for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {
|
||||
EVT ValueVT = ValueVTs[Value];
|
||||
unsigned NumRegs = tli.getNumRegisters(Context, ValueVT);
|
||||
MVT RegisterVT = tli.getRegisterType(Context, ValueVT);
|
||||
for (unsigned i = 0; i != NumRegs; ++i)
|
||||
Regs.push_back(Reg + i);
|
||||
RegVTs.push_back(RegisterVT);
|
||||
Reg += NumRegs;
|
||||
}
|
||||
}
|
||||
|
||||
/// append - Add the specified values to this one.
|
||||
void append(const RegsForValue &RHS) {
|
||||
ValueVTs.append(RHS.ValueVTs.begin(), RHS.ValueVTs.end());
|
||||
RegVTs.append(RHS.RegVTs.begin(), RHS.RegVTs.end());
|
||||
Regs.append(RHS.Regs.begin(), RHS.Regs.end());
|
||||
}
|
||||
|
||||
/// getCopyFromRegs - Emit a series of CopyFromReg nodes that copies from
|
||||
/// this value and returns the result as a ValueVTs value. This uses
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo,
|
||||
SDLoc dl,
|
||||
SDValue &Chain, SDValue *Flag,
|
||||
const Value *V = nullptr) const;
|
||||
|
||||
/// getCopyToRegs - Emit a series of CopyToReg nodes that copies the
|
||||
/// specified value into the registers specified by this object. This uses
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
void
|
||||
getCopyToRegs(SDValue Val, SelectionDAG &DAG, SDLoc dl, SDValue &Chain,
|
||||
SDValue *Flag, const Value *V,
|
||||
ISD::NodeType PreferredExtendType = ISD::ANY_EXTEND) const;
|
||||
|
||||
/// AddInlineAsmOperands - Add this value to the specified inlineasm node
|
||||
/// operand list. This adds the code marker, matching input operand index
|
||||
/// (if applicable), and includes the number of values added into it.
|
||||
void AddInlineAsmOperands(unsigned Kind,
|
||||
bool HasMatching, unsigned MatchingIdx, SDLoc dl,
|
||||
SelectionDAG &DAG,
|
||||
std::vector<SDValue> &Ops) const;
|
||||
};
|
||||
for (unsigned Value = 0, e = ValueVTs.size(); Value != e; ++Value) {
|
||||
EVT ValueVT = ValueVTs[Value];
|
||||
unsigned NumRegs = tli.getNumRegisters(Context, ValueVT);
|
||||
MVT RegisterVT = tli.getRegisterType(Context, ValueVT);
|
||||
for (unsigned i = 0; i != NumRegs; ++i)
|
||||
Regs.push_back(Reg + i);
|
||||
RegVTs.push_back(RegisterVT);
|
||||
Reg += NumRegs;
|
||||
}
|
||||
}
|
||||
|
||||
/// getCopyFromRegs - Emit a series of CopyFromReg nodes that copies from
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "StatepointLowering.h"
|
||||
#include "llvm/ADT/APInt.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/CodeGen/Analysis.h"
|
||||
#include "llvm/CodeGen/SelectionDAG.h"
|
||||
#include "llvm/CodeGen/SelectionDAGNodes.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
@ -879,6 +880,79 @@ private:
|
||||
void updateDAGForMaybeTailCall(SDValue MaybeTC);
|
||||
};
|
||||
|
||||
/// RegsForValue - This struct represents the registers (physical or virtual)
|
||||
/// that a particular set of values is assigned, and the type information about
|
||||
/// the value. The most common situation is to represent one value at a time,
|
||||
/// but struct or array values are handled element-wise as multiple values. The
|
||||
/// splitting of aggregates is performed recursively, so that we never have
|
||||
/// aggregate-typed registers. The values at this point do not necessarily have
|
||||
/// legal types, so each value may require one or more registers of some legal
|
||||
/// type.
|
||||
///
|
||||
struct RegsForValue {
|
||||
/// ValueVTs - The value types of the values, which may not be legal, and
|
||||
/// may need be promoted or synthesized from one or more registers.
|
||||
///
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
|
||||
/// RegVTs - The value types of the registers. This is the same size as
|
||||
/// ValueVTs and it records, for each value, what the type of the assigned
|
||||
/// register or registers are. (Individual values are never synthesized
|
||||
/// from more than one type of register.)
|
||||
///
|
||||
/// With virtual registers, the contents of RegVTs is redundant with TLI's
|
||||
/// getRegisterType member function, however when with physical registers
|
||||
/// it is necessary to have a separate record of the types.
|
||||
///
|
||||
SmallVector<MVT, 4> RegVTs;
|
||||
|
||||
/// Regs - This list holds the registers assigned to the values.
|
||||
/// Each legal or promoted value requires one register, and each
|
||||
/// expanded value requires multiple registers.
|
||||
///
|
||||
SmallVector<unsigned, 4> Regs;
|
||||
|
||||
RegsForValue();
|
||||
|
||||
RegsForValue(const SmallVector<unsigned, 4> ®s, MVT regvt, EVT valuevt);
|
||||
|
||||
RegsForValue(LLVMContext &Context, const TargetLowering &tli, unsigned Reg,
|
||||
Type *Ty);
|
||||
|
||||
/// append - Add the specified values to this one.
|
||||
void append(const RegsForValue &RHS) {
|
||||
ValueVTs.append(RHS.ValueVTs.begin(), RHS.ValueVTs.end());
|
||||
RegVTs.append(RHS.RegVTs.begin(), RHS.RegVTs.end());
|
||||
Regs.append(RHS.Regs.begin(), RHS.Regs.end());
|
||||
}
|
||||
|
||||
/// getCopyFromRegs - Emit a series of CopyFromReg nodes that copies from
|
||||
/// this value and returns the result as a ValueVTs value. This uses
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
SDValue getCopyFromRegs(SelectionDAG &DAG, FunctionLoweringInfo &FuncInfo,
|
||||
SDLoc dl,
|
||||
SDValue &Chain, SDValue *Flag,
|
||||
const Value *V = nullptr) const;
|
||||
|
||||
/// getCopyToRegs - Emit a series of CopyToReg nodes that copies the
|
||||
/// specified value into the registers specified by this object. This uses
|
||||
/// Chain/Flag as the input and updates them for the output Chain/Flag.
|
||||
/// If the Flag pointer is NULL, no flag is used.
|
||||
void
|
||||
getCopyToRegs(SDValue Val, SelectionDAG &DAG, SDLoc dl, SDValue &Chain,
|
||||
SDValue *Flag, const Value *V,
|
||||
ISD::NodeType PreferredExtendType = ISD::ANY_EXTEND) const;
|
||||
|
||||
/// AddInlineAsmOperands - Add this value to the specified inlineasm node
|
||||
/// operand list. This adds the code marker, matching input operand index
|
||||
/// (if applicable), and includes the number of values added into it.
|
||||
void AddInlineAsmOperands(unsigned Kind,
|
||||
bool HasMatching, unsigned MatchingIdx, SDLoc dl,
|
||||
SelectionDAG &DAG,
|
||||
std::vector<SDValue> &Ops) const;
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user