radeonsi: Set datalayout on the llvm module
authorTom Stellard <thomas.stellard@amd.com>
Thu, 15 Dec 2016 15:25:49 +0000 (15:25 +0000)
committerTom Stellard <thomas.stellard@amd.com>
Tue, 31 Jan 2017 20:39:30 +0000 (20:39 +0000)
This prevents LLVM from using sext instructions for local memory offsets
and allows the backend to fold immediate offsets into the instruction.

This also prevents some incorrect code generation for ptrtoint and
inttoptr instructions.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader_tgsi_setup.c

index 4f355e584902f34fda2ee8139509c9c6f34298af..205686a771a95d6841383b653d33d596a90070d1 100644 (file)
@@ -1256,6 +1256,8 @@ void si_llvm_context_init(struct si_shader_context *ctx,
                          const struct tgsi_token *tokens)
 {
        struct lp_type type;
+       LLVMTargetDataRef data_layout = LLVMCreateTargetDataLayout(tm);
+       char *data_layout_str = LLVMCopyStringRepOfTargetData(data_layout);
 
        /* Initialize the gallivm object:
         * We are only using the module, context, and builder fields of this struct.
@@ -1273,6 +1275,10 @@ void si_llvm_context_init(struct si_shader_context *ctx,
                                                ctx->gallivm.context);
        LLVMSetTarget(ctx->gallivm.module, "amdgcn--");
 
+       LLVMSetDataLayout(ctx->gallivm.module, data_layout_str);
+       LLVMDisposeTargetData(data_layout);
+       LLVMDisposeMessage(data_layout_str);
+
        bool unsafe_fpmath = (sscreen->b.debug_flags & DBG_UNSAFE_MATH) != 0;
        ctx->gallivm.builder = lp_create_builder(ctx->gallivm.context,
                                                 unsafe_fpmath);