summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiang Yu <yuq825@gmail.com>2022-11-18 16:37:19 +0800
committerDylan Baker <dylan.c.baker@intel.com>2022-11-21 10:05:07 -0800
commit9fdfe7751cec5f0f69238d39d56c1f8c2acf3f5b (patch)
treeb9fc365ceb34b44342a6b54111191a124abbce49
parentcba4b07aa0febbf9033d5156952d9a4e211d1773 (diff)
downloadmesa-9fdfe7751cec5f0f69238d39d56c1f8c2acf3f5b.tar.gz
ac/llvm: fix 16bit varying llvm compile error
Found when 16bit vec3 varying with llvm14 (not found when llvm15), one 32bit vec4 slot is filled like this: vec3[0] | undef vec3[1] | undef vec3[2] | undef undef | undef LLVM error is for the elements with undef: %287 = insertelement float %280, half %279, i64 0 After this change, we get: %287 = insertelement <2 x half> %280, half %279, i64 0 Fixes: 279eea5bda2 ("amd/llvm: Transition to LLVM "opaque pointers"") Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Signed-off-by: Qiang Yu <yuq825@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19848> (cherry picked from commit e3b1f26a2b83538eb175be28b2e785bbe626bf5f)
-rw-r--r--.pick_status.json2
-rw-r--r--src/amd/llvm/ac_nir_to_llvm.c9
2 files changed, 10 insertions, 1 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 81cf82505e0..7463c3ee44f 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -265,7 +265,7 @@
"description": "ac/llvm: fix 16bit varying llvm compile error",
"nominated": true,
"nomination_type": 1,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": "279eea5bda2444fdce21744b972dad5016f0f366"
},
diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index 8d208f51396..9d3d60603a6 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -2410,7 +2410,16 @@ static void visit_store_output(struct ac_nir_context *ctx, nir_intrinsic_instr *
* using read-modify-write.
*/
index = LLVMConstInt(ctx->ac.i32, nir_intrinsic_io_semantics(instr).high_16bits, 0);
+
+#if LLVM_VERSION_MAJOR <= 14
+ /* To work around old LLVM bug which won't change the output type to
+ * LLVMBuildLoad2 type argument.
+ */
+ output = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.f32, output_addr, "");
+ output = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.v2f16, "");
+#else
output = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.v2f16, output_addr, "");
+#endif
output = LLVMBuildInsertElement(ctx->ac.builder, output, value, index, "");
value = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.f32, "");
}