nvc0/ir: skip back edges when determining latest sched value
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 28 Feb 2013 21:08:36 +0000 (22:08 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 12 Mar 2013 11:55:36 +0000 (12:55 +0100)
src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp

index 7fd9b86884b637d5913ffb034dddd40e79a6678e..04081cf11776e129161279fe0d87da53e5f00677 100644 (file)
@@ -2623,15 +2623,16 @@ SchedDataCalculator::visit(BasicBlock *bb)
    score = &scoreBoards.at(bb->getId());
 
    for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) {
+      // back branches will wait until all target dependencies are satisfied
+      if (ei.getType() == Graph::Edge::BACK) // sched would be uninitialized
+         continue;
       BasicBlock *in = BasicBlock::get(ei.getNode());
       if (in->getExit()) {
          if (prevData != 0x04)
             prevData = in->getExit()->sched;
          prevOp = in->getExit()->op;
       }
-      if (ei.getType() != Graph::Edge::BACK)
-         score->setMax(&scoreBoards.at(in->getId()));
-      // back branches will wait until all target dependencies are satisfied
+      score->setMax(&scoreBoards.at(in->getId()));
    }
    if (bb->cfg.incidentCount() > 1)
       prevOp = OP_NOP;