Hi hackers, The nullness of casetest.value can be determined at the JIT compile time. We can emit fewer codes by utilizing this property. The attached patch is trying to fix it.
Best Regards, Xing
From e366f50ec5fff46b537994c0ff4babe6646a97e5 Mon Sep 17 00:00:00 2001 From: Xing Guo <higuox...@gmail.com> Date: Sat, 31 Aug 2024 15:56:43 +0800 Subject: [PATCH v1] JIT: The nullness of casetest.value can be determined at code emitting stage. --- src/backend/jit/llvm/llvmjit_expr.c | 158 +++++++++++----------------- 1 file changed, 62 insertions(+), 96 deletions(-) diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 48ccdb942a..0beef67e90 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -1202,53 +1202,37 @@ llvm_compile_expr(ExprState *state) case EEOP_CASE_TESTVAL: { - LLVMBasicBlockRef b_avail, - b_notavail; - LLVMValueRef v_casevaluep, - v_casevalue; - LLVMValueRef v_casenullp, - v_casenull; - LLVMValueRef v_casevaluenull; - - b_avail = l_bb_before_v(opblocks[opno + 1], - "op.%d.avail", opno); - b_notavail = l_bb_before_v(opblocks[opno + 1], - "op.%d.notavail", opno); - - v_casevaluep = l_ptr_const(op->d.casetest.value, - l_ptr(TypeSizeT)); - v_casenullp = l_ptr_const(op->d.casetest.isnull, - l_ptr(TypeStorageBool)); - - v_casevaluenull = - LLVMBuildICmp(b, LLVMIntEQ, - LLVMBuildPtrToInt(b, v_casevaluep, - TypeSizeT, ""), - l_sizet_const(0), ""); - LLVMBuildCondBr(b, v_casevaluenull, b_notavail, b_avail); - - /* if casetest != NULL */ - LLVMPositionBuilderAtEnd(b, b_avail); - v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); - v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); - LLVMBuildStore(b, v_casevalue, v_resvaluep); - LLVMBuildStore(b, v_casenull, v_resnullp); - LLVMBuildBr(b, opblocks[opno + 1]); + LLVMValueRef v_casevalue, v_casenull; - /* if casetest == NULL */ - LLVMPositionBuilderAtEnd(b, b_notavail); - v_casevalue = - l_load_struct_gep(b, - StructExprContext, - v_econtext, - FIELDNO_EXPRCONTEXT_CASEDATUM, ""); - v_casenull = - l_load_struct_gep(b, - StructExprContext, - v_econtext, - FIELDNO_EXPRCONTEXT_CASENULL, ""); - LLVMBuildStore(b, v_casevalue, v_resvaluep); - LLVMBuildStore(b, v_casenull, v_resnullp); + if (op->d.casetest.value) + { + LLVMValueRef v_casevaluep, v_casenullp; + + v_casevaluep = l_ptr_const(op->d.casetest.value, + l_ptr(TypeSizeT)); + v_casenullp = l_ptr_const(op->d.casetest.isnull, + l_ptr(TypeStorageBool)); + v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); + v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); + + LLVMBuildStore(b, v_casevalue, v_resvaluep); + LLVMBuildStore(b, v_casenull, v_resnullp); + } + else + { + v_casevalue = + l_load_struct_gep(b, + StructExprContext, + v_econtext, + FIELDNO_EXPRCONTEXT_CASEDATUM, ""); + v_casenull = + l_load_struct_gep(b, + StructExprContext, + v_econtext, + FIELDNO_EXPRCONTEXT_CASENULL, ""); + LLVMBuildStore(b, v_casevalue, v_resvaluep); + LLVMBuildStore(b, v_casenull, v_resnullp); + } LLVMBuildBr(b, opblocks[opno + 1]); break; @@ -1832,58 +1816,40 @@ llvm_compile_expr(ExprState *state) case EEOP_DOMAIN_TESTVAL: { - LLVMBasicBlockRef b_avail, - b_notavail; - LLVMValueRef v_casevaluep, - v_casevalue; - LLVMValueRef v_casenullp, - v_casenull; - LLVMValueRef v_casevaluenull; - - b_avail = l_bb_before_v(opblocks[opno + 1], - "op.%d.avail", opno); - b_notavail = l_bb_before_v(opblocks[opno + 1], - "op.%d.notavail", opno); - - v_casevaluep = l_ptr_const(op->d.casetest.value, - l_ptr(TypeSizeT)); - v_casenullp = l_ptr_const(op->d.casetest.isnull, - l_ptr(TypeStorageBool)); - - v_casevaluenull = - LLVMBuildICmp(b, LLVMIntEQ, - LLVMBuildPtrToInt(b, v_casevaluep, - TypeSizeT, ""), - l_sizet_const(0), ""); - LLVMBuildCondBr(b, - v_casevaluenull, - b_notavail, b_avail); - - /* if casetest != NULL */ - LLVMPositionBuilderAtEnd(b, b_avail); - v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); - v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); - LLVMBuildStore(b, v_casevalue, v_resvaluep); - LLVMBuildStore(b, v_casenull, v_resnullp); - LLVMBuildBr(b, opblocks[opno + 1]); + LLVMValueRef v_casevalue, v_casenull; - /* if casetest == NULL */ - LLVMPositionBuilderAtEnd(b, b_notavail); - v_casevalue = - l_load_struct_gep(b, - StructExprContext, - v_econtext, - FIELDNO_EXPRCONTEXT_DOMAINDATUM, - ""); - v_casenull = - l_load_struct_gep(b, - StructExprContext, - v_econtext, - FIELDNO_EXPRCONTEXT_DOMAINNULL, - ""); - LLVMBuildStore(b, v_casevalue, v_resvaluep); - LLVMBuildStore(b, v_casenull, v_resnullp); + if (op->d.casetest.value) + { + LLVMValueRef v_casevaluep, v_casenullp; + v_casevaluep = l_ptr_const(op->d.casetest.value, + l_ptr(TypeSizeT)); + v_casenullp = l_ptr_const(op->d.casetest.isnull, + l_ptr(TypeStorageBool)); + + v_casevalue = l_load(b, TypeSizeT, v_casevaluep, ""); + v_casenull = l_load(b, TypeStorageBool, v_casenullp, ""); + + LLVMBuildStore(b, v_casevalue, v_resvaluep); + LLVMBuildStore(b, v_casenull, v_resnullp); + } + else + { + v_casevalue = + l_load_struct_gep(b, + StructExprContext, + v_econtext, + FIELDNO_EXPRCONTEXT_DOMAINDATUM, + ""); + v_casenull = + l_load_struct_gep(b, + StructExprContext, + v_econtext, + FIELDNO_EXPRCONTEXT_DOMAINNULL, + ""); + LLVMBuildStore(b, v_casevalue, v_resvaluep); + LLVMBuildStore(b, v_casenull, v_resnullp); + } LLVMBuildBr(b, opblocks[opno + 1]); break; } -- 2.46.0