<div dir="ltr"><div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>></div><div><br></div><div>Marek<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, May 2, 2019 at 10:12 AM Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com">samuel.pitoiset@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This changes requires LLVM r356755.<br>
<br>
32706 shaders in 16744 tests<br>
Totals:<br>
SGPRS: 1448848 -> 1455984 (0.49 %)<br>
VGPRS: 1016684 -> 1016220 (-0.05 %)<br>
Spilled SGPRs: 25871 -> 25815 (-0.22 %)<br>
Spilled VGPRs: 122 -> 122 (0.00 %)<br>
Scratch size: 11964 -> 11956 (-0.07 %) dwords per thread<br>
Code Size: 55324500 -> 55301152 (-0.04 %) bytes<br>
Max Waves: 235660 -> 235586 (-0.03 %)<br>
<br>
Totals from affected shaders:<br>
SGPRS: 293704 -> 300840 (2.43 %)<br>
VGPRS: 246716 -> 246252 (-0.19 %)<br>
Spilled SGPRs: 159 -> 103 (-35.22 %)<br>
Scratch size: 188 -> 180 (-4.26 %) dwords per thread<br>
Code Size: 8653664 -> 8630316 (-0.27 %) bytes<br>
Max Waves: 60811 -> 60737 (-0.12 %)<br>
<br>
v3: - rebase on top of master<br>
    - remove the restriction for SSBO stores as well<br>
v2: - fix llvm 8<br>
<br>
Signed-off-by: Samuel Pitoiset <<a href="mailto:samuel.pitoiset@gmail.com" target="_blank">samuel.pitoiset@gmail.com</a>><br>
---<br>
<br>
I plan to run benchmarks with that change.<br>
<br>
 src/amd/common/ac_llvm_build.c    | 15 ++++++++-------<br>
 src/amd/common/ac_llvm_build.h    |  1 +<br>
 src/amd/common/ac_nir_to_llvm.c   |  9 ++++++---<br>
 src/amd/vulkan/radv_nir_to_llvm.c |  4 +++-<br>
 4 files changed, 18 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c<br>
index 22b771db774..e191a64310f 100644<br>
--- a/src/amd/common/ac_llvm_build.c<br>
+++ b/src/amd/common/ac_llvm_build.c<br>
@@ -84,6 +84,7 @@ ac_llvm_context_init(struct ac_llvm_context *ctx,<br>
        ctx->v3i32 = LLVMVectorType(ctx->i32, 3);<br>
        ctx->v4i32 = LLVMVectorType(ctx->i32, 4);<br>
        ctx->v2f32 = LLVMVectorType(ctx->f32, 2);<br>
+       ctx->v3f32 = LLVMVectorType(ctx->f32, 3);<br>
        ctx->v4f32 = LLVMVectorType(ctx->f32, 4);<br>
        ctx->v8i32 = LLVMVectorType(ctx->i32, 8);<br>
<br>
@@ -1167,7 +1168,7 @@ ac_build_llvm8_buffer_store_common(struct ac_llvm_context *ctx,<br>
        args[idx++] = voffset ? voffset : ctx->i32_0;<br>
        args[idx++] = soffset ? soffset : ctx->i32_0;<br>
        args[idx++] = LLVMConstInt(ctx->i32, (glc ? 1 : 0) + (slc ? 2 : 0), 0);<br>
-       unsigned func = num_channels == 3 ? 4 : num_channels;<br>
+       unsigned func = HAVE_LLVM < 0x900 && num_channels == 3 ? 4 : num_channels;<br>
        const char *indexing_kind = structurized ? "struct" : "raw";<br>
        char name[256], type_name[8];<br>
<br>
@@ -1225,9 +1226,9 @@ ac_build_buffer_store_dword(struct ac_llvm_context *ctx,<br>
                            bool writeonly_memory,<br>
                            bool swizzle_enable_hint)<br>
 {<br>
-       /* Split 3 channel stores, becase LLVM doesn't support 3-channel<br>
+       /* Split 3 channel stores, because only LLVM 9+ support 3-channel<br>
         * intrinsics. */<br>
-       if (num_channels == 3) {<br>
+       if (num_channels == 3 && HAVE_LLVM < 0x900) {<br>
                LLVMValueRef v[3], v01;<br>
<br>
                for (int i = 0; i < 3; i++) {<br>
@@ -1354,7 +1355,7 @@ ac_build_llvm8_buffer_load_common(struct ac_llvm_context *ctx,<br>
        args[idx++] = voffset ? voffset : ctx->i32_0;<br>
        args[idx++] = soffset ? soffset : ctx->i32_0;<br>
        args[idx++] = LLVMConstInt(ctx->i32, (glc ? 1 : 0) + (slc ? 2 : 0), 0);<br>
-       unsigned func = num_channels == 3 ? 4 : num_channels;<br>
+       unsigned func = HAVE_LLVM < 0x900 && num_channels == 3 ? 4 : num_channels;<br>
        const char *indexing_kind = structurized ? "struct" : "raw";<br>
        char name[256], type_name[8];<br>
<br>
@@ -1420,7 +1421,7 @@ ac_build_buffer_load(struct ac_llvm_context *ctx,<br>
                if (num_channels == 1)<br>
                        return result[0];<br>
<br>
-               if (num_channels == 3)<br>
+               if (num_channels == 3 && HAVE_LLVM < 0x900)<br>
                        result[num_channels++] = LLVMGetUndef(ctx->f32);<br>
                return ac_build_gather_values(ctx, result, num_channels);<br>
        }<br>
@@ -1512,7 +1513,7 @@ ac_build_llvm8_tbuffer_load(struct ac_llvm_context *ctx,<br>
        args[idx++] = soffset ? soffset : ctx->i32_0;<br>
        args[idx++] = LLVMConstInt(ctx->i32, dfmt | (nfmt << 4), 0);<br>
        args[idx++] = LLVMConstInt(ctx->i32, (glc ? 1 : 0) + (slc ? 2 : 0), 0);<br>
-       unsigned func = num_channels == 3 ? 4 : num_channels;<br>
+       unsigned func = HAVE_LLVM < 0x900 && num_channels == 3 ? 4 : num_channels;<br>
        const char *indexing_kind = structurized ? "struct" : "raw";<br>
        char name[256], type_name[8];<br>
<br>
@@ -1698,7 +1699,7 @@ ac_build_llvm8_tbuffer_store(struct ac_llvm_context *ctx,<br>
        args[idx++] = soffset ? soffset : ctx->i32_0;<br>
        args[idx++] = LLVMConstInt(ctx->i32, dfmt | (nfmt << 4), 0);<br>
        args[idx++] = LLVMConstInt(ctx->i32, (glc ? 1 : 0) + (slc ? 2 : 0), 0);<br>
-       unsigned func = num_channels == 3 ? 4 : num_channels;<br>
+       unsigned func = HAVE_LLVM < 0x900 && num_channels == 3 ? 4 : num_channels;<br>
        const char *indexing_kind = structurized ? "struct" : "raw";<br>
        char name[256], type_name[8];<br>
<br>
diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h<br>
index 98f856106d6..19db808a9a8 100644<br>
--- a/src/amd/common/ac_llvm_build.h<br>
+++ b/src/amd/common/ac_llvm_build.h<br>
@@ -71,6 +71,7 @@ struct ac_llvm_context {<br>
        LLVMTypeRef v3i32;<br>
        LLVMTypeRef v4i32;<br>
        LLVMTypeRef v2f32;<br>
+       LLVMTypeRef v3f32;<br>
        LLVMTypeRef v4f32;<br>
        LLVMTypeRef v8i32;<br>
<br>
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c<br>
index c92eaaca31d..d0bfeb3efa9 100644<br>
--- a/src/amd/common/ac_nir_to_llvm.c<br>
+++ b/src/amd/common/ac_nir_to_llvm.c<br>
@@ -1575,9 +1575,9 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,<br>
<br>
                u_bit_scan_consecutive_range(&writemask, &start, &count);<br>
<br>
-               /* Due to an LLVM limitation, split 3-element writes<br>
-                * into a 2-element and a 1-element write. */<br>
-               if (count == 3) {<br>
+               /* Due to an LLVM limitation with LLVM < 9, split 3-element<br>
+                * writes into a 2-element and a 1-element write. */<br>
+               if (count == 3 && (elem_size_bytes != 4 || HAVE_LLVM < 0x900)) {<br>
                        writemask |= 1 << (start + 2);<br>
                        count = 2;<br>
                }<br>
@@ -1619,6 +1619,9 @@ static void visit_store_ssbo(struct ac_nir_context *ctx,<br>
                        case 16: /* v4f32 */<br>
                                data_type = ctx->ac.v4f32;<br>
                                break;<br>
+                       case 12: /* v3f32 */<br>
+                               data_type = ctx->ac.v3f32;<br>
+                               break;<br>
                        case 8: /* v2f32 */<br>
                                data_type = ctx->ac.v2f32;<br>
                                break;<br>
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c<br>
index b4a19aa2e5d..c40ea004831 100644<br>
--- a/src/amd/vulkan/radv_nir_to_llvm.c<br>
+++ b/src/amd/vulkan/radv_nir_to_llvm.c<br>
@@ -2748,7 +2748,9 @@ radv_emit_stream_output(struct radv_shader_context *ctx,<br>
                /* fall through */<br>
        case 4: /* as v4i32 */<br>
                vdata = ac_build_gather_values(&ctx->ac, out,<br>
-                                              util_next_power_of_two(num_comps));<br>
+                                              HAVE_LLVM < 0x900 ?<br>
+                                              util_next_power_of_two(num_comps) :<br>
+                                              num_comps);<br>
                break;<br>
        }<br>
<br>
-- <br>
2.21.0<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/mailman/listinfo/mesa-dev</a></blockquote></div>