From: Luo Xionghu <xionghu....@intel.com> for conditional/unconditional backward jump, need insert JMPI instruction in block header after LABEL instruction. same for unconditional forward jump if the target is not the fallthrough block.
Signed-off-by: Luo Xionghu <xionghu....@intel.com> --- backend/src/backend/gen_insn_selection.cpp | 18 +++++++++--------- backend/src/backend/gen_insn_selection.hpp | 3 ++- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/backend/src/backend/gen_insn_selection.cpp b/backend/src/backend/gen_insn_selection.cpp index dd21960..eb9e0ad 100644 --- a/backend/src/backend/gen_insn_selection.cpp +++ b/backend/src/backend/gen_insn_selection.cpp @@ -2496,7 +2496,7 @@ namespace gbe this->block->hasBranch = bb.getLastInstruction()->getOpcode() == OP_BRA || bb.getLastInstruction()->getOpcode() == OP_RET; if (!this->block->hasBranch) - this->block->endifOffset = -1; + this->block->needJump = -1; // Build the DAG on the fly uint32_t insnNum = 0; @@ -6764,7 +6764,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp // If jump to next label and the endif offset is -1, then // We don't need to add a jmpi here, as the following IF will do the same // thing if all channels are disabled. - (jip != nextLabel || sel.block->endifOffset != -1)) { + (jip != nextLabel || sel.block->needJump != -1)) { // If it is required, insert a JUMP to bypass the block sel.push(); sel.curr.flag = 0; @@ -7355,7 +7355,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp sel.curr.predicate = GEN_PREDICATE_NONE; if (!sel.block->hasBarrier && !sel.block->removeSimpleIfEndif) sel.ENDIF(GenRegister::immd(0), nextLabel); - sel.block->endifOffset = -1; + sel.block->needJump = -1; sel.pop(); } else { // Update the PcIPs @@ -7371,7 +7371,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp else if(insn.getParent()->needEndif) sel.ENDIF(GenRegister::immd(0), nextLabel); } - sel.block->endifOffset = -1; + sel.block->needJump = -1; if (nextLabel == jip) return; // Branch to the jump target sel.push(); @@ -7379,7 +7379,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp sel.curr.noMask = 1; sel.curr.predicate = GEN_PREDICATE_NONE; // Actually, the origin of this JMPI should be the beginning of next BB. - sel.block->endifOffset -= sel.JMPI(GenRegister::immd(0), jip, ir::LabelIndex(curr->getLabelIndex().value() + 1)); + sel.block->needJump -= sel.JMPI(GenRegister::immd(0), jip, ir::LabelIndex(curr->getLabelIndex().value() + 1)); sel.pop(); } } @@ -7413,7 +7413,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp sel.curr.flagIndex = pred.value(); sel.curr.predicate = GEN_PREDICATE_NORMAL; sel.setBlockIP(ip, dst.value()); - sel.block->endifOffset = -1; + sel.block->needJump = -1; sel.curr.predicate = GEN_PREDICATE_NONE; if (!sel.block->hasBarrier && !sel.block->removeSimpleIfEndif) sel.ENDIF(GenRegister::immd(0), next); @@ -7423,7 +7423,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp else sel.curr.predicate = GEN_PREDICATE_ALIGN1_ANY8H; sel.curr.noMask = 1; - sel.block->endifOffset -= sel.JMPI(GenRegister::immd(0), jip, label); + sel.block->needJump -= sel.JMPI(GenRegister::immd(0), jip, label); sel.pop(); } else { const LabelIndex next = bb.getNextBlock()->getLabelIndex(); @@ -7432,7 +7432,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp sel.curr.subFlag = 1; if(insn.getParent()->needEndif) sel.setBlockIP(ip, dst.value()); - sel.block->endifOffset = -1; + sel.block->needJump = -1; if (!sel.block->hasBarrier && !sel.block->removeSimpleIfEndif) { if(insn.getParent()->needEndif && !insn.getParent()->needIf) sel.ENDIF(GenRegister::immd(0), insn.getParent()->endifLabel, insn.getParent()->endifLabel); @@ -7444,7 +7444,7 @@ extern bool OCL_DEBUGINFO; // first defined by calling BVAR in program.cpp sel.curr.execWidth = 1; sel.curr.noMask = 1; sel.curr.predicate = GEN_PREDICATE_NONE; - sel.block->endifOffset -= sel.JMPI(GenRegister::immd(0), jip, label); + sel.block->needJump -= sel.JMPI(GenRegister::immd(0), jip, label); sel.pop(); } } diff --git a/backend/src/backend/gen_insn_selection.hpp b/backend/src/backend/gen_insn_selection.hpp index 01999a2..61e2ee1 100644 --- a/backend/src/backend/gen_insn_selection.hpp +++ b/backend/src/backend/gen_insn_selection.hpp @@ -259,7 +259,8 @@ namespace gbe /*! Append a new selection instruction at the beginning of the block */ void prepend(SelectionInstruction *insn); ir::LabelIndex endifLabel; - int endifOffset; + /*! need insert Jump instruction in block header after label instruction, -1 means not needed. */ + int needJump; bool hasBarrier; bool hasBranch; bool removeSimpleIfEndif; -- 2.5.0 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/beignet