forked from OSchip/llvm-project
[SelectionDAG] Change SelectionDAGISel::{funcInfo,SDB} to use unique_ptr
CurDAG is referenced more than 2000 times and used in many gerated .cpp files. Don't touch it for now.
This commit is contained in:
parent
01b98e6fd5
commit
e0d855b399
|
@ -195,7 +195,7 @@ public:
|
|||
|
||||
/// isExportedInst - Return true if the specified value is an instruction
|
||||
/// exported from its block.
|
||||
bool isExportedInst(const Value *V) {
|
||||
bool isExportedInst(const Value *V) const {
|
||||
return ValueMap.count(V);
|
||||
}
|
||||
|
||||
|
|
|
@ -48,12 +48,12 @@ class SelectionDAGISel : public MachineFunctionPass {
|
|||
public:
|
||||
TargetMachine &TM;
|
||||
const TargetLibraryInfo *LibInfo;
|
||||
FunctionLoweringInfo *FuncInfo;
|
||||
std::unique_ptr<FunctionLoweringInfo> FuncInfo;
|
||||
SwiftErrorValueTracking *SwiftError;
|
||||
MachineFunction *MF;
|
||||
MachineRegisterInfo *RegInfo;
|
||||
SelectionDAG *CurDAG;
|
||||
SelectionDAGBuilder *SDB;
|
||||
std::unique_ptr<SelectionDAGBuilder> SDB;
|
||||
AAResults *AA;
|
||||
GCFunctionInfo *GFI;
|
||||
CodeGenOpt::Level OptLevel;
|
||||
|
|
|
@ -9490,7 +9490,7 @@ findArgumentCopyElisionCandidates(const DataLayout &DL,
|
|||
/// Try to elide argument copies from memory into a local alloca. Succeeds if
|
||||
/// ArgVal is a load from a suitable fixed stack object.
|
||||
static void tryToElideArgumentCopy(
|
||||
FunctionLoweringInfo *FuncInfo, SmallVectorImpl<SDValue> &Chains,
|
||||
FunctionLoweringInfo &FuncInfo, SmallVectorImpl<SDValue> &Chains,
|
||||
DenseMap<int, int> &ArgCopyElisionFrameIndexMap,
|
||||
SmallPtrSetImpl<const Instruction *> &ElidedArgCopyInstrs,
|
||||
ArgCopyElisionMapTy &ArgCopyElisionCandidates, const Argument &Arg,
|
||||
|
@ -9510,9 +9510,9 @@ static void tryToElideArgumentCopy(
|
|||
assert(ArgCopyIter != ArgCopyElisionCandidates.end());
|
||||
const AllocaInst *AI = ArgCopyIter->second.first;
|
||||
int FixedIndex = FINode->getIndex();
|
||||
int &AllocaIndex = FuncInfo->StaticAllocaMap[AI];
|
||||
int &AllocaIndex = FuncInfo.StaticAllocaMap[AI];
|
||||
int OldIndex = AllocaIndex;
|
||||
MachineFrameInfo &MFI = FuncInfo->MF->getFrameInfo();
|
||||
MachineFrameInfo &MFI = FuncInfo.MF->getFrameInfo();
|
||||
if (MFI.getObjectSize(FixedIndex) != MFI.getObjectSize(OldIndex)) {
|
||||
LLVM_DEBUG(
|
||||
dbgs() << " argument copy elision failed due to bad fixed stack "
|
||||
|
@ -9521,7 +9521,7 @@ static void tryToElideArgumentCopy(
|
|||
}
|
||||
unsigned RequiredAlignment = AI->getAlignment();
|
||||
if (!RequiredAlignment) {
|
||||
RequiredAlignment = FuncInfo->MF->getDataLayout().getABITypeAlignment(
|
||||
RequiredAlignment = FuncInfo.MF->getDataLayout().getABITypeAlignment(
|
||||
AI->getAllocatedType());
|
||||
}
|
||||
if (MFI.getObjectAlignment(FixedIndex) < RequiredAlignment) {
|
||||
|
@ -9587,7 +9587,8 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
|||
// flag to ask the target to give us the memory location of that argument if
|
||||
// available.
|
||||
ArgCopyElisionMapTy ArgCopyElisionCandidates;
|
||||
findArgumentCopyElisionCandidates(DL, FuncInfo, ArgCopyElisionCandidates);
|
||||
findArgumentCopyElisionCandidates(DL, FuncInfo.get(),
|
||||
ArgCopyElisionCandidates);
|
||||
|
||||
// Set up the incoming argument description vector.
|
||||
for (const Argument &Arg : F.args()) {
|
||||
|
@ -9775,7 +9776,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
|
|||
// Elide the copying store if the target loaded this argument from a
|
||||
// suitable fixed stack object.
|
||||
if (Ins[i].Flags.isCopyElisionCandidate()) {
|
||||
tryToElideArgumentCopy(FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
|
||||
tryToElideArgumentCopy(*FuncInfo, Chains, ArgCopyElisionFrameIndexMap,
|
||||
ElidedArgCopyInstrs, ArgCopyElisionCandidates, Arg,
|
||||
InVals[i], ArgHasUses);
|
||||
}
|
||||
|
|
|
@ -311,8 +311,9 @@ SelectionDAGISel::SelectionDAGISel(TargetMachine &tm, CodeGenOpt::Level OL)
|
|||
: MachineFunctionPass(ID), TM(tm), FuncInfo(new FunctionLoweringInfo()),
|
||||
SwiftError(new SwiftErrorValueTracking()),
|
||||
CurDAG(new SelectionDAG(tm, OL)),
|
||||
SDB(new SelectionDAGBuilder(*CurDAG, *FuncInfo, *SwiftError, OL)), AA(),
|
||||
GFI(), OptLevel(OL), DAGSize(0) {
|
||||
SDB(std::make_unique<SelectionDAGBuilder>(*CurDAG, *FuncInfo, *SwiftError,
|
||||
OL)),
|
||||
AA(), GFI(), OptLevel(OL), DAGSize(0) {
|
||||
initializeGCModuleInfoPass(*PassRegistry::getPassRegistry());
|
||||
initializeBranchProbabilityInfoWrapperPassPass(
|
||||
*PassRegistry::getPassRegistry());
|
||||
|
@ -321,9 +322,7 @@ SelectionDAGISel::SelectionDAGISel(TargetMachine &tm, CodeGenOpt::Level OL)
|
|||
}
|
||||
|
||||
SelectionDAGISel::~SelectionDAGISel() {
|
||||
delete SDB;
|
||||
delete CurDAG;
|
||||
delete FuncInfo;
|
||||
delete SwiftError;
|
||||
}
|
||||
|
||||
|
@ -1300,20 +1299,20 @@ bool SelectionDAGISel::PrepareEHLandingPad() {
|
|||
/// side-effect free and is either dead or folded into a generated instruction.
|
||||
/// Return false if it needs to be emitted.
|
||||
static bool isFoldedOrDeadInstruction(const Instruction *I,
|
||||
FunctionLoweringInfo *FuncInfo) {
|
||||
const FunctionLoweringInfo &FuncInfo) {
|
||||
return !I->mayWriteToMemory() && // Side-effecting instructions aren't folded.
|
||||
!I->isTerminator() && // Terminators aren't folded.
|
||||
!isa<DbgInfoIntrinsic>(I) && // Debug instructions aren't folded.
|
||||
!I->isEHPad() && // EH pad instructions aren't folded.
|
||||
!FuncInfo->isExportedInst(I); // Exported instrs must be computed.
|
||||
!isa<DbgInfoIntrinsic>(I) && // Debug instructions aren't folded.
|
||||
!I->isEHPad() && // EH pad instructions aren't folded.
|
||||
!FuncInfo.isExportedInst(I); // Exported instrs must be computed.
|
||||
}
|
||||
|
||||
/// Collect llvm.dbg.declare information. This is done after argument lowering
|
||||
/// in case the declarations refer to arguments.
|
||||
static void processDbgDeclares(FunctionLoweringInfo *FuncInfo) {
|
||||
MachineFunction *MF = FuncInfo->MF;
|
||||
static void processDbgDeclares(FunctionLoweringInfo &FuncInfo) {
|
||||
MachineFunction *MF = FuncInfo.MF;
|
||||
const DataLayout &DL = MF->getDataLayout();
|
||||
for (const BasicBlock &BB : *FuncInfo->Fn) {
|
||||
for (const BasicBlock &BB : *FuncInfo.Fn) {
|
||||
for (const Instruction &I : BB) {
|
||||
const DbgDeclareInst *DI = dyn_cast<DbgDeclareInst>(&I);
|
||||
if (!DI)
|
||||
|
@ -1335,11 +1334,11 @@ static void processDbgDeclares(FunctionLoweringInfo *FuncInfo) {
|
|||
// intrinsic and handle this during isel like dbg.value.
|
||||
int FI = std::numeric_limits<int>::max();
|
||||
if (const auto *AI = dyn_cast<AllocaInst>(Address)) {
|
||||
auto SI = FuncInfo->StaticAllocaMap.find(AI);
|
||||
if (SI != FuncInfo->StaticAllocaMap.end())
|
||||
auto SI = FuncInfo.StaticAllocaMap.find(AI);
|
||||
if (SI != FuncInfo.StaticAllocaMap.end())
|
||||
FI = SI->second;
|
||||
} else if (const auto *Arg = dyn_cast<Argument>(Address))
|
||||
FI = FuncInfo->getArgumentFrameIndex(Arg);
|
||||
FI = FuncInfo.getArgumentFrameIndex(Arg);
|
||||
|
||||
if (FI == std::numeric_limits<int>::max())
|
||||
continue;
|
||||
|
@ -1373,7 +1372,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
|||
FuncInfo->MBB = FuncInfo->MBBMap[&Fn.getEntryBlock()];
|
||||
FuncInfo->InsertPt = FuncInfo->MBB->begin();
|
||||
|
||||
CurDAG->setFunctionLoweringInfo(FuncInfo);
|
||||
CurDAG->setFunctionLoweringInfo(FuncInfo.get());
|
||||
|
||||
if (!FastIS) {
|
||||
LowerArguments(Fn);
|
||||
|
@ -1413,7 +1412,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
|||
if (FastIS && Inserted)
|
||||
FastIS->setLastLocalValue(&*std::prev(FuncInfo->InsertPt));
|
||||
|
||||
processDbgDeclares(FuncInfo);
|
||||
processDbgDeclares(*FuncInfo);
|
||||
|
||||
// Iterate over all basic blocks in the function.
|
||||
StackProtector &SP = getAnalysis<StackProtector>();
|
||||
|
@ -1473,7 +1472,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
|||
const Instruction *Inst = &*std::prev(BI);
|
||||
|
||||
// If we no longer require this instruction, skip it.
|
||||
if (isFoldedOrDeadInstruction(Inst, FuncInfo) ||
|
||||
if (isFoldedOrDeadInstruction(Inst, *FuncInfo) ||
|
||||
ElidedArgCopyInstrs.count(Inst)) {
|
||||
--NumFastIselRemaining;
|
||||
continue;
|
||||
|
@ -1493,7 +1492,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
|||
const Instruction *BeforeInst = Inst;
|
||||
while (BeforeInst != &*Begin) {
|
||||
BeforeInst = &*std::prev(BasicBlock::const_iterator(BeforeInst));
|
||||
if (!isFoldedOrDeadInstruction(BeforeInst, FuncInfo))
|
||||
if (!isFoldedOrDeadInstruction(BeforeInst, *FuncInfo))
|
||||
break;
|
||||
}
|
||||
if (BeforeInst != Inst && isa<LoadInst>(BeforeInst) &&
|
||||
|
|
|
@ -512,13 +512,14 @@ static bool isInt64Immediate(SDValue N, uint64_t &Imm) {
|
|||
return isInt64Immediate(N.getNode(), Imm);
|
||||
}
|
||||
|
||||
static unsigned getBranchHint(unsigned PCC, FunctionLoweringInfo *FuncInfo,
|
||||
static unsigned getBranchHint(unsigned PCC,
|
||||
const FunctionLoweringInfo &FuncInfo,
|
||||
const SDValue &DestMBB) {
|
||||
assert(isa<BasicBlockSDNode>(DestMBB));
|
||||
|
||||
if (!FuncInfo->BPI) return PPC::BR_NO_HINT;
|
||||
if (!FuncInfo.BPI) return PPC::BR_NO_HINT;
|
||||
|
||||
const BasicBlock *BB = FuncInfo->MBB->getBasicBlock();
|
||||
const BasicBlock *BB = FuncInfo.MBB->getBasicBlock();
|
||||
const Instruction *BBTerm = BB->getTerminator();
|
||||
|
||||
if (BBTerm->getNumSuccessors() != 2) return PPC::BR_NO_HINT;
|
||||
|
@ -526,8 +527,8 @@ static unsigned getBranchHint(unsigned PCC, FunctionLoweringInfo *FuncInfo,
|
|||
const BasicBlock *TBB = BBTerm->getSuccessor(0);
|
||||
const BasicBlock *FBB = BBTerm->getSuccessor(1);
|
||||
|
||||
auto TProb = FuncInfo->BPI->getEdgeProbability(BB, TBB);
|
||||
auto FProb = FuncInfo->BPI->getEdgeProbability(BB, FBB);
|
||||
auto TProb = FuncInfo.BPI->getEdgeProbability(BB, TBB);
|
||||
auto FProb = FuncInfo.BPI->getEdgeProbability(BB, FBB);
|
||||
|
||||
// We only want to handle cases which are easy to predict at static time, e.g.
|
||||
// C++ throw statement, that is very likely not taken, or calling never
|
||||
|
@ -547,7 +548,7 @@ static unsigned getBranchHint(unsigned PCC, FunctionLoweringInfo *FuncInfo,
|
|||
if (std::max(TProb, FProb) / Threshold < std::min(TProb, FProb))
|
||||
return PPC::BR_NO_HINT;
|
||||
|
||||
LLVM_DEBUG(dbgs() << "Use branch hint for '" << FuncInfo->Fn->getName()
|
||||
LLVM_DEBUG(dbgs() << "Use branch hint for '" << FuncInfo.Fn->getName()
|
||||
<< "::" << BB->getName() << "'\n"
|
||||
<< " -> " << TBB->getName() << ": " << TProb << "\n"
|
||||
<< " -> " << FBB->getName() << ": " << FProb << "\n");
|
||||
|
@ -5002,7 +5003,7 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
// Prevent PPC::PRED_* from being selected into LI.
|
||||
unsigned PCC = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
|
||||
if (EnableBranchHint)
|
||||
PCC |= getBranchHint(PCC, FuncInfo, N->getOperand(3));
|
||||
PCC |= getBranchHint(PCC, *FuncInfo, N->getOperand(3));
|
||||
|
||||
SDValue Pred = getI32Imm(PCC, dl);
|
||||
SDValue Ops[] = { Pred, N->getOperand(2), N->getOperand(3),
|
||||
|
@ -5045,7 +5046,7 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|||
}
|
||||
|
||||
if (EnableBranchHint)
|
||||
PCC |= getBranchHint(PCC, FuncInfo, N->getOperand(4));
|
||||
PCC |= getBranchHint(PCC, *FuncInfo, N->getOperand(4));
|
||||
|
||||
SDValue CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC, dl);
|
||||
SDValue Ops[] = { getI32Imm(PCC, dl), CondCode,
|
||||
|
|
Loading…
Reference in New Issue