[Beignet] [PATCH] GBE: Fix a bug in encoding MATH instruction
Zhigang Gong
zhigang.gong at linux.intel.com
Mon Jun 24 00:05:06 PDT 2013
Nice catch. I will push it latter.
And, if you have such a unit test case can hit this bug, please
also submit it here. Thanks.
On Mon, Jun 24, 2013 at 10:53:57AM +0800, Ruiling Song wrote:
> For std::vector, a push_back may cause memory relocation if no enough
> memory in the vector pool. And iterator or pointer got previously will
> become invalid after relocation.
>
> Here in GenEncoder::next(), which will call push_back(), memory
> relocation may occur. Then relocation will make 'insn' point to
> invalid memory that does not belong to GenEncoder::store anymore.
> Then, the setting of execution_width will fail.
>
> Signed-off-by: Ruiling Song <ruiling.song at intel.com>
> ---
> backend/src/backend/gen_encoder.cpp | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/backend/src/backend/gen_encoder.cpp b/backend/src/backend/gen_encoder.cpp
> index 3d8afe8..ae981b2 100644
> --- a/backend/src/backend/gen_encoder.cpp
> +++ b/backend/src/backend/gen_encoder.cpp
> @@ -1010,7 +1010,9 @@ namespace gbe
>
> if (function == GEN_MATH_FUNCTION_INT_DIV_QUOTIENT ||
> function == GEN_MATH_FUNCTION_INT_DIV_REMAINDER) {
> - if(insn->header.execution_size == GEN_WIDTH_16) {
> + insn->header.execution_size = GEN_WIDTH_8;
> +
> + if(this->curr.execWidth == 16) {
> GenInstruction *insn2 = this->next(GEN_OPCODE_MATH);
> GenRegister new_dest, new_src0, new_src1;
> new_dest = GenRegister::QnPhysical(dst, 1);
> @@ -1024,7 +1026,6 @@ namespace gbe
> this->setSrc1(insn2, new_src1);
> }
>
> - insn->header.execution_size = GEN_WIDTH_8;
> }
> }
>
> --
> 1.7.9.5
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list