From b561cf953ab13c6bbc6e93e46f34336eff381211 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Mon, 30 Jan 2017 16:20:30 +0000 Subject: [RDF] Add phis for entry block live-ins (in addition to function live-ins) llvm-svn: 293491 --- llvm/lib/Target/Hexagon/RDFGraph.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Target/Hexagon/RDFGraph.cpp') 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 P : LiveIns) { NodeAddr PA = newPhi(EA); - RegisterRef RR = RegisterRef(I->first); uint16_t PhiFlags = NodeAttrs::PhiRef | NodeAttrs::Preserving; + RegisterRef RR(P.first, P.second); NodeAddr DA = newDef(PA, RR, PhiFlags); PA.Addr->addMember(DA, *this); } -- cgit v1.2.3