diff options
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp index 7dff08a5ccc..db03281a4d4 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp @@ -3465,10 +3465,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; - setPosition(pos, true); + BasicBlock *root = BasicBlock::get(func->cfg.getRoot()); + if (root->getEntry() == NULL || root->getEntry()->op != OP_PRERET) { + BasicBlock *pos = getBB(); + setPosition(root, false); + mkFlow(OP_PRERET, leave, CC_ALWAYS, NULL)->fixed = 1; + setPosition(pos, true); + } } mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); |