[Beignet] [PATCH V2] GBE: add legalize pass to handle wide integers

Zhigang Gong zhigang.gong at linux.intel.com
Fri Oct 10 23:01:57 PDT 2014


On Sat, Oct 11, 2014 at 02:09:37PM +0800, Ruiling Song wrote:
> This legalize pass will break wider integers like i128/i256/... into shorter ones.
> The problem is how to choose the shorter type? From my observation,
> wide integer type always comes from shorter ones through 'zext' on small type
> or 'bitcast' on vectors, so we simply choose the type where it comes from.
> Then we can split wide integer operations into operations on shorter interger.
> 
> v2:
>   add an assert on the wide integer bit-width, should be power of 2.
>   use rpo_iterator to make sure traverse Value def before its use.
> 
> Signed-off-by: Ruiling Song <ruiling.song at intel.com>
> ---
>  backend/src/CMakeLists.txt            |    1 +
>  backend/src/llvm/llvm_gen_backend.hpp |    3 +
>  backend/src/llvm/llvm_legalize.cpp    |  565 +++++++++++++++++++++++++++++++++
>  backend/src/llvm/llvm_to_gen.cpp      |    1 +
>  4 files changed, 570 insertions(+)
>  create mode 100644 backend/src/llvm/llvm_legalize.cpp
> 
> +
> +    for (Value *v : processed) {
> +      if (isa<Instruction>(v)) {
> +        dyn_cast<Instruction>(v)->eraseFromParent();

segfault at the above line when run utest builtin_ilogb_float16:
  builtin_ilogb_float16()While deleting: i512 %uret.sroa.0.44.insert.ext.i
  Use still stuck around after Def is destroyed:  %uret.sroa.0.44.insert.ext.i = zext i32 %conv.i.i40.i to i512

The root cause should be that the instructions in processed set may use valuses in the same
set. When erase the def before the use, it trigger this assert.


> +      }
> +    }
> +
> +    processed.clear();
> +    valueMap.clear();
> +    return changed;
> +  }
> +



More information about the Beignet mailing list