diff options
author | Marek Olšák <[email protected]> | 2017-10-04 04:51:39 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-10-24 14:56:34 +0200 |
commit | 1ff9e27cbdd1fe770f18e5316c6f32a867e39095 (patch) | |
tree | a5b282c567496845ba6986e22e52ac046fa0cbcf /src/amd/common | |
parent | f0a2bbd1a4a0caf85d91469e61d01a126cfc2a36 (diff) |
ac: replace ac_build_kill with ac_build_kill_if_false
This will be a new LLVM intrinsic and will also work nicely with
llvm.amdgcn.wqm.vote.
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/amd/common')
-rw-r--r-- | src/amd/common/ac_llvm_build.c | 19 | ||||
-rw-r--r-- | src/amd/common/ac_llvm_build.h | 2 | ||||
-rw-r--r-- | src/amd/common/ac_nir_to_llvm.c | 16 |
3 files changed, 11 insertions, 26 deletions
diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index 4d8f42d572c..5bd04663216 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1405,20 +1405,13 @@ LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx, AC_FUNC_ATTR_LEGACY); } -/** - * KILL, AKA discard in GLSL. - * - * \param value kill if value < 0.0 or value == NULL. - */ -void ac_build_kill(struct ac_llvm_context *ctx, LLVMValueRef value) +void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1) { - if (value) { - ac_build_intrinsic(ctx, "llvm.AMDGPU.kill", ctx->voidt, - &value, 1, AC_FUNC_ATTR_LEGACY); - } else { - ac_build_intrinsic(ctx, "llvm.AMDGPU.kilp", ctx->voidt, - NULL, 0, AC_FUNC_ATTR_LEGACY); - } + LLVMValueRef value = LLVMBuildSelect(ctx->builder, i1, + LLVMConstReal(ctx->f32, 1), + LLVMConstReal(ctx->f32, -1), ""); + ac_build_intrinsic(ctx, "llvm.AMDGPU.kill", ctx->voidt, + &value, 1, AC_FUNC_ATTR_LEGACY); } LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index aa2a2899ab4..8f7a9abb76c 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -265,7 +265,7 @@ LLVMValueRef ac_build_image_opcode(struct ac_llvm_context *ctx, struct ac_image_args *a); LLVMValueRef ac_build_cvt_pkrtz_f16(struct ac_llvm_context *ctx, LLVMValueRef args[2]); -void ac_build_kill(struct ac_llvm_context *ctx, LLVMValueRef value); +void ac_build_kill_if_false(struct ac_llvm_context *ctx, LLVMValueRef i1); LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, LLVMValueRef offset, LLVMValueRef width, bool is_signed); diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 2e50e50b129..4f7e8449725 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3779,14 +3779,10 @@ static void emit_discard_if(struct ac_nir_context *ctx, { LLVMValueRef cond; - cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntNE, + cond = LLVMBuildICmp(ctx->ac.builder, LLVMIntEQ, get_src(ctx, instr->src[0]), ctx->ac.i32_0, ""); - - cond = LLVMBuildSelect(ctx->ac.builder, cond, - LLVMConstReal(ctx->ac.f32, -1.0f), - ctx->ac.f32_0, ""); - ac_build_kill(&ctx->ac, cond); + ac_build_kill_if_false(&ctx->ac, cond); } static LLVMValueRef @@ -4021,7 +4017,7 @@ visit_emit_vertex(struct nir_to_llvm_context *ctx, const nir_intrinsic_instr *instr) { LLVMValueRef gs_next_vertex; - LLVMValueRef can_emit, kill; + LLVMValueRef can_emit; int idx; assert(instr->const_index[0] == 0); @@ -4037,11 +4033,7 @@ visit_emit_vertex(struct nir_to_llvm_context *ctx, */ can_emit = LLVMBuildICmp(ctx->builder, LLVMIntULT, gs_next_vertex, LLVMConstInt(ctx->i32, ctx->gs_max_out_vertices, false), ""); - - kill = LLVMBuildSelect(ctx->builder, can_emit, - LLVMConstReal(ctx->f32, 1.0f), - LLVMConstReal(ctx->f32, -1.0f), ""); - ac_build_kill(&ctx->ac, kill); + ac_build_kill_if_false(&ctx->ac, can_emit); /* loop num outputs */ idx = 0; |