[Beignet] [Patch v2] GBE: refine longjmp checking.
Yang, Rong R
rong.r.yang at intel.com
Thu Oct 8 01:30:41 PDT 2015
This version LGTM, the patchset have pushed, thanks.
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Friday, September 25, 2015 8:50
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [Patch v2] GBE: refine longjmp checking.
>
> v2:
> simplify the logic in function.hpp. Let the user to prepare correct start and
> end point. Fix the incorrect start/end point for one forward jump and one
> backward jump case.
>
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
> backend/src/backend/gen_insn_selection.cpp | 17 +++++++++++++++--
> backend/src/ir/function.hpp | 11 +++++++++++
> 2 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/backend/src/backend/gen_insn_selection.cpp
> b/backend/src/backend/gen_insn_selection.cpp
> index ab00269..0380d79 100644
> --- a/backend/src/backend/gen_insn_selection.cpp
> +++ b/backend/src/backend/gen_insn_selection.cpp
> @@ -1154,7 +1154,19 @@ namespace gbe
> SelectionInstruction *insn = this->appendInsn(SEL_OP_JMPI, 0, 1);
> insn->src(0) = src;
> insn->index = index.value();
> - insn->extra.longjmp = abs(index - origin) > 800;
> + ir::LabelIndex start, end;
> + if (origin.value() < index.value()) {
> + // Forward Jump, need to exclude the target BB. Because we
> + // need to jump to the beginning of it.
> + start = origin;
> + end = ir::LabelIndex(index.value() - 1);
> + } else {
> + start = index;
> + end = origin;
> + }
> + // FIXME, this longjmp check is too hacky. We need to support instruction
> + // insertion at code emission stage in the future.
> + insn->extra.longjmp = ctx.getFunction().getDistance(start, end) >
> + 8000;
> return insn->extra.longjmp ? 2 : 1;
> }
>
> @@ -5150,7 +5162,8 @@ namespace gbe
> sel.curr.execWidth = 1;
> sel.curr.noMask = 1;
> sel.curr.predicate = GEN_PREDICATE_NONE;
> - sel.block->endifOffset -= sel.JMPI(GenRegister::immd(0), jip, curr-
> >getLabelIndex());
> + // 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.pop();
> }
> }
> diff --git a/backend/src/ir/function.hpp b/backend/src/ir/function.hpp index
> b5f4ba2..265fdc3 100644
> --- a/backend/src/ir/function.hpp
> +++ b/backend/src/ir/function.hpp
> @@ -486,6 +486,17 @@ namespace ir {
> /*! Get surface starting address register from bti */
> Register getSurfaceBaseReg(uint8_t bti) const;
> void appendSurface(uint8_t bti, Register reg);
> + /*! Get instruction distance between two BBs include both b0 and b1,
> + and b0 must be less than b1. */
> + INLINE uint32_t getDistance(LabelIndex b0, LabelIndex b1) const {
> + uint32_t insnNum = 0;
> + GBE_ASSERT(b0.value() <= b1.value());
> + for(uint32_t i = b0.value(); i <= b1.value(); i++) {
> + BasicBlock &bb = getBlock(LabelIndex(i));
> + insnNum += bb.size();
> + }
> + return insnNum;
> + }
> /*! Output the control flow graph to .dot file */
> void outputCFG();
> private:
> --
> 1.9.1
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list