From e366f50ec5fff46b537994c0ff4babe6646a97e5 Mon Sep 17 00:00:00 2001
From: Xing Guo <higuoxing@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

