summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>2012-04-29 17:36:34 +0200
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>2012-04-29 17:55:36 +0200
commit163b290f886c69a233c71799613eb74fb2668085 (patch)
tree553b405281dcf4fffecdbe02cb5f465e184ab949
parentd9baa004ea814bef70c8c90b342aca2ad992415c (diff)
nv50/ir/tgsi: fix handling of early RET
We have to actually emit RET, too, of course, not just the PRERET.
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp9
1 files changed, 5 insertions, 4 deletions
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 8bd784fa47..82e23602ca 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: