From: Christoph Bumiller Date: Sun, 29 Apr 2012 15:36:34 +0000 (+0200) Subject: nv50/ir/tgsi: fix handling of early RET X-Git-Tag: 062012170305~564 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=163b290f886c69a233c71799613eb74fb2668085;p=profile%2Fivi%2Fmesa.git nv50/ir/tgsi: fix handling of early RET We have to actually emit RET, too, of course, not just the PRERET. --- diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp index 8bd784f..82e2360 100644 --- a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp @@ -2196,12 +2196,13 @@ Converter::handleInstruction(const struct tgsi_full_instruction *insn) if (!isEndOfSubroutine(ip + 1)) { // insert a PRERET at the entry if this is an early return // (only needed for sharing code in the epilogue) + BasicBlock *pos = getBB(); + setPosition(BasicBlock::get(func->cfg.getRoot()), false); mkFlow(OP_PRERET, leave, CC_ALWAYS, NULL)->fixed = 1; - bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); - } else { - mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; - bb->cfg.attach(&leave->cfg, Graph::Edge::TREE); + setPosition(pos, true); } + mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; + bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); } break; case TGSI_OPCODE_END: