diff options
author | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2012-04-29 17:36:34 +0200 |
---|---|---|
committer | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2012-04-29 17:55:36 +0200 |
commit | 163b290f886c69a233c71799613eb74fb2668085 (patch) | |
tree | 553b405281dcf4fffecdbe02cb5f465e184ab949 | |
parent | d9baa004ea814bef70c8c90b342aca2ad992415c (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.cpp | 9 |
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: |