diff options
author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-01-30 16:20:30 +0000 |
---|---|---|
committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2017-01-30 16:20:30 +0000 |
commit | b561cf953ab13c6bbc6e93e46f34336eff381211 (patch) | |
tree | fc351e09e39de5197026a940fb697159db23708a /llvm/lib/Target/Hexagon | |
parent | f8dc2d8c8b0d2c320fc85bd73f3ae96552dafbfd (diff) | |
download | bcm5719-llvm-b561cf953ab13c6bbc6e93e46f34336eff381211.tar.gz bcm5719-llvm-b561cf953ab13c6bbc6e93e46f34336eff381211.zip |
[RDF] Add phis for entry block live-ins (in addition to function live-ins)
llvm-svn: 293491
Diffstat (limited to 'llvm/lib/Target/Hexagon')
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFGraph.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFGraph.h | 16 | ||||
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFLiveness.cpp | 4 |
3 files changed, 22 insertions, 14 deletions
diff --git a/llvm/lib/Target/Hexagon/RDFGraph.cpp b/llvm/lib/Target/Hexagon/RDFGraph.cpp index ee8db96d40f..e5cfc7a96b4 100644 --- a/llvm/lib/Target/Hexagon/RDFGraph.cpp +++ b/llvm/lib/Target/Hexagon/RDFGraph.cpp @@ -764,7 +764,7 @@ void RegisterAggr::print(raw_ostream &OS) const { DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii, const TargetRegisterInfo &tri, const MachineDominatorTree &mdt, const MachineDominanceFrontier &mdf, const TargetOperandInfo &toi) - : MF(mf), TII(tii), TRI(tri), MDT(mdt), MDF(mdf), TOI(toi) { + : MF(mf), TII(tii), TRI(tri), MDT(mdt), MDF(mdf), TOI(toi), LiveIns(TRI) { } // The implementation of the definition stack. @@ -1010,12 +1010,20 @@ void DataFlowGraph::build(unsigned Options) { BlockRefsMap RefM; buildBlockRefs(EA, RefM); - // Add function-entry phi nodes. + // Collect function live-ins and entry block live-ins. MachineRegisterInfo &MRI = MF.getRegInfo(); - for (auto I = MRI.livein_begin(), E = MRI.livein_end(); I != E; ++I) { + MachineBasicBlock &EntryB = *EA.Addr->getCode(); + assert(EntryB.pred_empty() && "Function entry block has predecessors"); + for (auto I = MRI.livein_begin(), E = MRI.livein_end(); I != E; ++I) + LiveIns.insert(RegisterRef(I->first)); + for (auto I : EntryB.liveins()) + LiveIns.insert(RegisterRef(I.PhysReg, I.LaneMask)); + + // Add function-entry phi nodes for the live-in registers. + for (std::pair<RegisterId,LaneBitmask> P : LiveIns) { NodeAddr<PhiNode*> PA = newPhi(EA); - RegisterRef RR = RegisterRef(I->first); uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving; + RegisterRef RR(P.first, P.second); NodeAddr<DefNode*> DA = newDef(PA, RR, PhiFlags); PA.Addr->addMember(DA, *this); } diff --git a/llvm/lib/Target/Hexagon/RDFGraph.h b/llvm/lib/Target/Hexagon/RDFGraph.h index 49d78a8b22b..b3132f69bf2 100644 --- a/llvm/lib/Target/Hexagon/RDFGraph.h +++ b/llvm/lib/Target/Hexagon/RDFGraph.h @@ -763,6 +763,7 @@ namespace rdf { const TargetRegisterInfo &getTRI() const { return TRI; } const MachineDominatorTree &getDT() const { return MDT; } const MachineDominanceFrontier &getDF() const { return MDF; } + const RegisterAggr &getLiveIns() const { return LiveIns; } struct DefStack { DefStack() = default; @@ -957,19 +958,20 @@ namespace rdf { return BlockNodes[BB]; } - NodeAddr<FuncNode*> Func; - NodeAllocator Memory; - // Local map: MachineBasicBlock -> NodeAddr<BlockNode*> - std::map<MachineBasicBlock*,NodeAddr<BlockNode*>> BlockNodes; - // Lane mask map. - LaneMaskIndex LMI; - MachineFunction &MF; const TargetInstrInfo &TII; const TargetRegisterInfo &TRI; const MachineDominatorTree &MDT; const MachineDominanceFrontier &MDF; const TargetOperandInfo &TOI; + + RegisterAggr LiveIns; + NodeAddr<FuncNode*> Func; + NodeAllocator Memory; + // Local map: MachineBasicBlock -> NodeAddr<BlockNode*> + std::map<MachineBasicBlock*,NodeAddr<BlockNode*>> BlockNodes; + // Lane mask map. + LaneMaskIndex LMI; }; // struct DataFlowGraph template <typename Predicate> diff --git a/llvm/lib/Target/Hexagon/RDFLiveness.cpp b/llvm/lib/Target/Hexagon/RDFLiveness.cpp index f0f93285254..4b9dea08173 100644 --- a/llvm/lib/Target/Hexagon/RDFLiveness.cpp +++ b/llvm/lib/Target/Hexagon/RDFLiveness.cpp @@ -684,9 +684,7 @@ void Liveness::computeLiveIns() { traverse(&MF.front(), LiveIn); // Add function live-ins to the live-in set of the function entry block. - auto &EntryIn = LiveMap[&MF.front()]; - for (auto I = MRI.livein_begin(), E = MRI.livein_end(); I != E; ++I) - EntryIn.insert(RegisterRef(I->first)); + LiveMap[&MF.front()].insert(DFG.getLiveIns()); if (Trace) { // Dump the liveness map |