Mesa (staging/22.1): ac/llvm: Add LLVM bug workaround to ac_build_mbcnt_add.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jul 28 17:16:52 UTC 2022
Module: Mesa
Branch: staging/22.1
Commit: b4ce0d7113fa3af4f24caa40b31e1a861f59923a
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4ce0d7113fa3af4f24caa40b31e1a861f59923a
Author: Timur Kristóf <timur.kristof at gmail.com>
Date: Thu May 19 23:13:28 2022 +0200
ac/llvm: Add LLVM bug workaround to ac_build_mbcnt_add.
LLVM always believes that this instruction's upper bound is the wave
size, regardless of ac_set_range_metadata and regardless of whether
the add source is used.
As a workaround, emit an extra add instruction.
Cc: mesa-stable
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
Reviewed-by: Qiang Yu <yuq825 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17706>
(cherry picked from commit 1e2663b62c241d6389e3f97cb8e104ccdd8d567e)
---
.pick_status.json | 2 +-
src/amd/llvm/ac_llvm_build.c | 33 ++++++++++++++++++++-------------
2 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/.pick_status.json b/.pick_status.json
index 28415343620..a7e4f84e1d2 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -2389,7 +2389,7 @@
"description": "ac/llvm: Add LLVM bug workaround to ac_build_mbcnt_add.",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"main_sha": null,
"because_sha": null
},
diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c
index e10a546d98b..e4ed7a72357 100644
--- a/src/amd/llvm/ac_llvm_build.c
+++ b/src/amd/llvm/ac_llvm_build.c
@@ -3457,21 +3457,28 @@ LLVMValueRef ac_build_writelane(struct ac_llvm_context *ctx, LLVMValueRef src, L
LLVMValueRef ac_build_mbcnt_add(struct ac_llvm_context *ctx, LLVMValueRef mask, LLVMValueRef add_src)
{
+ LLVMValueRef val;
+
if (ctx->wave_size == 32) {
- LLVMValueRef val = ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.lo", ctx->i32,
- (LLVMValueRef[]){mask, add_src}, 2, AC_FUNC_ATTR_READNONE);
- ac_set_range_metadata(ctx, val, 0, ctx->wave_size);
- return val;
+ val = ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.lo", ctx->i32,
+ (LLVMValueRef[]){mask, ctx->i32_0}, 2, AC_FUNC_ATTR_READNONE);
+ } else {
+ LLVMValueRef mask_vec = LLVMBuildBitCast(ctx->builder, mask, ctx->v2i32, "");
+ LLVMValueRef mask_lo = LLVMBuildExtractElement(ctx->builder, mask_vec, ctx->i32_0, "");
+ LLVMValueRef mask_hi = LLVMBuildExtractElement(ctx->builder, mask_vec, ctx->i32_1, "");
+ val = ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.lo", ctx->i32,
+ (LLVMValueRef[]){mask_lo, ctx->i32_0}, 2, AC_FUNC_ATTR_READNONE);
+ val = ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.hi", ctx->i32, (LLVMValueRef[]){mask_hi, val},
+ 2, AC_FUNC_ATTR_READNONE);
}
- LLVMValueRef mask_vec = LLVMBuildBitCast(ctx->builder, mask, ctx->v2i32, "");
- LLVMValueRef mask_lo = LLVMBuildExtractElement(ctx->builder, mask_vec, ctx->i32_0, "");
- LLVMValueRef mask_hi = LLVMBuildExtractElement(ctx->builder, mask_vec, ctx->i32_1, "");
- LLVMValueRef val =
- ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.lo", ctx->i32,
- (LLVMValueRef[]){mask_lo, add_src}, 2, AC_FUNC_ATTR_READNONE);
- val = ac_build_intrinsic(ctx, "llvm.amdgcn.mbcnt.hi", ctx->i32, (LLVMValueRef[]){mask_hi, val},
- 2, AC_FUNC_ATTR_READNONE);
- ac_set_range_metadata(ctx, val, 0, ctx->wave_size);
+
+ /* Bug workaround. LLVM always believes the upper bound of mbcnt to be the wave size,
+ * regardless of ac_set_range_metadata. Use an extra add instruction to work around it.
+ */
+ if (add_src != NULL && add_src != ctx->i32_0) {
+ return LLVMBuildAdd(ctx->builder, val, add_src, "");
+ }
+
return val;
}
More information about the mesa-commit
mailing list