From acf0f704f91ec826049fd706883397086ae6d324 Mon Sep 17 00:00:00 2001 From: "Vikram S. Adve" Date: Sun, 13 Oct 2002 00:39:22 +0000 Subject: [PATCH] Major bug fix: was not adding CD edges for RETURNs! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4137 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/InstrSched/SchedGraph.cpp | 18 ++++++++++-------- lib/Target/SparcV9/InstrSched/SchedGraph.cpp | 18 ++++++++++-------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/CodeGen/InstrSched/SchedGraph.cpp b/lib/CodeGen/InstrSched/SchedGraph.cpp index 11c627af58e..c3262c09df0 100644 --- a/lib/CodeGen/InstrSched/SchedGraph.cpp +++ b/lib/CodeGen/InstrSched/SchedGraph.cpp @@ -341,15 +341,16 @@ SchedGraph::addCDEdges(const TerminatorInst* term, // Find the first branch instr in the sequence of machine instrs for term // unsigned first = 0; - while (!mii.isBranch(termMvec[first]->getOpCode())) + while (! mii.isBranch(termMvec[first]->getOpCode()) && + ! mii.isReturn(termMvec[first]->getOpCode())) ++first; assert(first < termMvec.size() && - "No branch instructions for BR? Ok, but weird! Delete assertion."); + "No branch instructions for terminator? Ok, but weird!"); if (first == termMvec.size()) return; - + SchedGraphNode* firstBrNode = getGraphNodeForInstr(termMvec[first]); - + // Add CD edges from each instruction in the sequence to the // *last preceding* branch instr. in the sequence // Use a latency of 0 because we only need to prevent out-of-order issue. @@ -357,13 +358,14 @@ SchedGraph::addCDEdges(const TerminatorInst* term, for (unsigned i = termMvec.size(); i > first+1; --i) { SchedGraphNode* toNode = getGraphNodeForInstr(termMvec[i-1]); - assert(toNode && "No node for instr generated for branch?"); + assert(toNode && "No node for instr generated for branch/ret?"); for (unsigned j = i-1; j != 0; --j) - if (mii.isBranch(termMvec[j-1]->getOpCode())) + if (mii.isBranch(termMvec[j-1]->getOpCode()) || + mii.isReturn(termMvec[j-1]->getOpCode())) { SchedGraphNode* brNode = getGraphNodeForInstr(termMvec[j-1]); - assert(brNode && "No node for instr generated for branch?"); + assert(brNode && "No node for instr generated for branch/ret?"); (void) new SchedGraphEdge(brNode, toNode, SchedGraphEdge::CtrlDep, SchedGraphEdge::NonDataDep, 0); break; // only one incoming edge is enough @@ -388,7 +390,7 @@ SchedGraph::addCDEdges(const TerminatorInst* term, const MachineCodeForBasicBlock& mvec = MachineCodeForBasicBlock::get(bb); for (unsigned i=0, N=mvec.size(); i < N; i++) { - if (mvec[i] == termMvec[first]) // reached the first branch + if (mvec[i] == termMvec[first]) // reached the first branch break; SchedGraphNode* fromNode = this->getGraphNodeForInstr(mvec[i]); diff --git a/lib/Target/SparcV9/InstrSched/SchedGraph.cpp b/lib/Target/SparcV9/InstrSched/SchedGraph.cpp index 11c627af58e..c3262c09df0 100644 --- a/lib/Target/SparcV9/InstrSched/SchedGraph.cpp +++ b/lib/Target/SparcV9/InstrSched/SchedGraph.cpp @@ -341,15 +341,16 @@ SchedGraph::addCDEdges(const TerminatorInst* term, // Find the first branch instr in the sequence of machine instrs for term // unsigned first = 0; - while (!mii.isBranch(termMvec[first]->getOpCode())) + while (! mii.isBranch(termMvec[first]->getOpCode()) && + ! mii.isReturn(termMvec[first]->getOpCode())) ++first; assert(first < termMvec.size() && - "No branch instructions for BR? Ok, but weird! Delete assertion."); + "No branch instructions for terminator? Ok, but weird!"); if (first == termMvec.size()) return; - + SchedGraphNode* firstBrNode = getGraphNodeForInstr(termMvec[first]); - + // Add CD edges from each instruction in the sequence to the // *last preceding* branch instr. in the sequence // Use a latency of 0 because we only need to prevent out-of-order issue. @@ -357,13 +358,14 @@ SchedGraph::addCDEdges(const TerminatorInst* term, for (unsigned i = termMvec.size(); i > first+1; --i) { SchedGraphNode* toNode = getGraphNodeForInstr(termMvec[i-1]); - assert(toNode && "No node for instr generated for branch?"); + assert(toNode && "No node for instr generated for branch/ret?"); for (unsigned j = i-1; j != 0; --j) - if (mii.isBranch(termMvec[j-1]->getOpCode())) + if (mii.isBranch(termMvec[j-1]->getOpCode()) || + mii.isReturn(termMvec[j-1]->getOpCode())) { SchedGraphNode* brNode = getGraphNodeForInstr(termMvec[j-1]); - assert(brNode && "No node for instr generated for branch?"); + assert(brNode && "No node for instr generated for branch/ret?"); (void) new SchedGraphEdge(brNode, toNode, SchedGraphEdge::CtrlDep, SchedGraphEdge::NonDataDep, 0); break; // only one incoming edge is enough @@ -388,7 +390,7 @@ SchedGraph::addCDEdges(const TerminatorInst* term, const MachineCodeForBasicBlock& mvec = MachineCodeForBasicBlock::get(bb); for (unsigned i=0, N=mvec.size(); i < N; i++) { - if (mvec[i] == termMvec[first]) // reached the first branch + if (mvec[i] == termMvec[first]) // reached the first branch break; SchedGraphNode* fromNode = this->getGraphNodeForInstr(mvec[i]);