diff options
Diffstat (limited to 'src/backend/jit/llvm/llvmjit_expr.c')
-rw-r--r-- | src/backend/jit/llvm/llvmjit_expr.c | 146 |
1 files changed, 39 insertions, 107 deletions
diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c index 70b55dd202e..351f6ec7e1a 100644 --- a/src/backend/jit/llvm/llvmjit_expr.c +++ b/src/backend/jit/llvm/llvmjit_expr.c @@ -570,7 +570,6 @@ llvm_compile_expr(ExprState *state) LLVMBasicBlockRef b_nonull; int argno; LLVMValueRef v_fcinfo; - LLVMValueRef v_argnullp; LLVMBasicBlockRef *b_checkargnulls; /* @@ -587,12 +586,6 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - v_argnullp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - /* * set resnull to true, if the function is actually * called, it'll be reset @@ -624,8 +617,7 @@ llvm_compile_expr(ExprState *state) b_argnotnull = b_checkargnulls[argno + 1]; /* and finally load & check NULLness of arg */ - v_argisnull = l_load_struct_gep(b, v_argnullp, - argno, ""); + v_argisnull = l_funcnull(b, v_fcinfo, argno); LLVMBuildCondBr(b, LLVMBuildICmp(b, LLVMIntEQ, v_argisnull, @@ -1276,10 +1268,6 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_fn_addr_out, v_fn_addr_in; LLVMValueRef v_fcinfo_in_isnullp; - LLVMValueRef v_in_argp, - v_out_argp; - LLVMValueRef v_in_argnullp, - v_out_argnullp; LLVMValueRef v_retval; LLVMValueRef v_resvalue; LLVMValueRef v_resnull; @@ -1313,22 +1301,6 @@ llvm_compile_expr(ExprState *state) LLVMBuildStructGEP(b, v_fcinfo_in, FIELDNO_FUNCTIONCALLINFODATA_ISNULL, "v_fcinfo_in_isnull"); - v_out_argnullp = - LLVMBuildStructGEP(b, v_fcinfo_out, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_fcinfo_out_argnullp"); - v_in_argnullp = - LLVMBuildStructGEP(b, v_fcinfo_in, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_fcinfo_in_argnullp"); - v_out_argp = - LLVMBuildStructGEP(b, v_fcinfo_out, - FIELDNO_FUNCTIONCALLINFODATA_ARG, - "v_fcinfo_out_argp"); - v_in_argp = - LLVMBuildStructGEP(b, v_fcinfo_in, - FIELDNO_FUNCTIONCALLINFODATA_ARG, - "v_fcinfo_in_argp"); /* output functions are not called on nulls */ v_resnull = LLVMBuildLoad(b, v_resnullp, ""); @@ -1348,11 +1320,10 @@ llvm_compile_expr(ExprState *state) /* set arg[0] */ LLVMBuildStore(b, v_resvalue, - LLVMBuildStructGEP(b, v_out_argp, 0, "")); + l_funcvaluep(b, v_fcinfo_out, 0)); LLVMBuildStore(b, l_sbool_const(0), - LLVMBuildStructGEP(b, v_out_argnullp, - 0, "")); + l_funcnullp(b, v_fcinfo_out, 0)); /* and call output function (can never return NULL) */ v_output = LLVMBuildCall(b, v_fn_addr_out, &v_fcinfo_out, 1, "funccall_coerce_out"); @@ -1399,9 +1370,9 @@ llvm_compile_expr(ExprState *state) /* set arguments */ /* arg0: output */ LLVMBuildStore(b, v_output, - LLVMBuildStructGEP(b, v_in_argp, 0, "")); + l_funcvaluep(b, v_fcinfo_in, 0)); LLVMBuildStore(b, v_resnull, - LLVMBuildStructGEP(b, v_in_argnullp, 0, "")); + l_funcnullp(b, v_fcinfo_in, 0)); /* arg1: ioparam: preset in execExpr.c */ /* arg2: typmod: preset in execExpr.c */ @@ -1426,7 +1397,6 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_fcinfo; LLVMValueRef v_fcinfo_isnull; - LLVMValueRef v_argnullp; LLVMValueRef v_argnull0, v_argisnull0; LLVMValueRef v_argnull1, @@ -1449,18 +1419,11 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - v_argnullp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - - /* load argnull[0|1] for both arguments */ - v_argnull0 = l_load_struct_gep(b, v_argnullp, 0, ""); + /* load args[0|1].isnull for both arguments */ + v_argnull0 = l_funcnull(b, v_fcinfo, 0); v_argisnull0 = LLVMBuildICmp(b, LLVMIntEQ, v_argnull0, l_sbool_const(1), ""); - - v_argnull1 = l_load_struct_gep(b, v_argnullp, 1, ""); + v_argnull1 = l_funcnull(b, v_fcinfo, 1); v_argisnull1 = LLVMBuildICmp(b, LLVMIntEQ, v_argnull1, l_sbool_const(1), ""); @@ -1532,11 +1495,9 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_fcinfo; LLVMValueRef v_fcinfo_isnull; - LLVMValueRef v_argnullp; LLVMValueRef v_argnull0; LLVMValueRef v_argnull1; LLVMValueRef v_anyargisnull; - LLVMValueRef v_argp; LLVMValueRef v_arg0; LLVMBasicBlockRef b_hasnull; LLVMBasicBlockRef b_nonull; @@ -1553,21 +1514,9 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - v_argnullp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - - v_argp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARG, - "v_argp"); - /* if either argument is NULL they can't be equal */ - v_argnull0 = l_load_struct_gep(b, v_argnullp, 0, ""); - v_argnull1 = l_load_struct_gep(b, v_argnullp, 1, ""); + v_argnull0 = l_funcnull(b, v_fcinfo, 0); + v_argnull1 = l_funcnull(b, v_fcinfo, 1); v_anyargisnull = LLVMBuildOr(b, @@ -1581,7 +1530,7 @@ llvm_compile_expr(ExprState *state) /* one (or both) of the arguments are null, return arg[0] */ LLVMPositionBuilderAtEnd(b, b_hasnull); - v_arg0 = l_load_struct_gep(b, v_argp, 0, ""); + v_arg0 = l_funcvalue(b, v_fcinfo, 0); LLVMBuildStore(b, v_argnull0, v_resnullp); LLVMBuildStore(b, v_arg0, v_resvaluep); LLVMBuildBr(b, opblocks[i + 1]); @@ -1680,7 +1629,6 @@ llvm_compile_expr(ExprState *state) if (op->d.rowcompare_step.finfo->fn_strict) { LLVMValueRef v_fcinfo; - LLVMValueRef v_argnullp; LLVMValueRef v_argnull0; LLVMValueRef v_argnull1; LLVMValueRef v_anyargisnull; @@ -1688,13 +1636,8 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - v_argnullp = - LLVMBuildStructGEP(b, v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - - v_argnull0 = l_load_struct_gep(b, v_argnullp, 0, ""); - v_argnull1 = l_load_struct_gep(b, v_argnullp, 1, ""); + v_argnull0 = l_funcnull(b, v_fcinfo, 0); + v_argnull1 = l_funcnull(b, v_fcinfo, 1); v_anyargisnull = LLVMBuildOr(b, @@ -2021,7 +1964,6 @@ llvm_compile_expr(ExprState *state) { FunctionCallInfo fcinfo = op->d.agg_deserialize.fcinfo_data; LLVMValueRef v_fcinfo; - LLVMValueRef v_argnullp; LLVMValueRef v_argnull0; LLVMBasicBlockRef b_deserialize; @@ -2030,14 +1972,7 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - - v_argnullp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - v_argnull0 = - l_load_struct_gep(b, v_argnullp, 0, "v_argnull0"); + v_argnull0 = l_funcnull(b, v_fcinfo, 0); LLVMBuildCondBr(b, LLVMBuildICmp(b, @@ -2079,20 +2014,24 @@ llvm_compile_expr(ExprState *state) break; } - case EEOP_AGG_STRICT_INPUT_CHECK: + case EEOP_AGG_STRICT_INPUT_CHECK_NULLS: + case EEOP_AGG_STRICT_INPUT_CHECK_ARGS: { int nargs = op->d.agg_strict_input_check.nargs; + NullableDatum *args = op->d.agg_strict_input_check.args; bool *nulls = op->d.agg_strict_input_check.nulls; int jumpnull; int argno; - LLVMValueRef v_nullp; + LLVMValueRef v_argsp; + LLVMValueRef v_nullsp; LLVMBasicBlockRef *b_checknulls; Assert(nargs > 0); jumpnull = op->d.agg_strict_input_check.jumpnull; - v_nullp = l_ptr_const(nulls, l_ptr(TypeStorageBool)); + v_argsp = l_ptr_const(args, l_ptr(StructNullableDatum)); + v_nullsp = l_ptr_const(nulls, l_ptr(TypeStorageBool)); /* create blocks for checking args */ b_checknulls = palloc(sizeof(LLVMBasicBlockRef *) * nargs); @@ -2120,7 +2059,18 @@ llvm_compile_expr(ExprState *state) else b_argnotnull = b_checknulls[argno + 1]; - v_argisnull = l_load_gep1(b, v_nullp, v_argno, ""); + if (opcode == EEOP_AGG_STRICT_INPUT_CHECK_NULLS) + v_argisnull = l_load_gep1(b, v_nullsp, v_argno, ""); + else + { + LLVMValueRef v_argn; + + v_argn = LLVMBuildGEP(b, v_argsp, &v_argno, 1, ""); + v_argisnull = + l_load_struct_gep(b, v_argn, + FIELDNO_NULLABLE_DATUM_ISNULL, + ""); + } LLVMBuildCondBr(b, LLVMBuildICmp(b, @@ -2291,8 +2241,6 @@ llvm_compile_expr(ExprState *state) LLVMValueRef v_aggstatep; LLVMValueRef v_fcinfo; LLVMValueRef v_fcinfo_isnull; - LLVMValueRef v_argp, - v_argnullp; LLVMValueRef v_transvaluep; LLVMValueRef v_transnullp; @@ -2319,7 +2267,7 @@ llvm_compile_expr(ExprState *state) aggstate = op->d.agg_trans.aggstate; pertrans = op->d.agg_trans.pertrans; - fcinfo = &pertrans->transfn_fcinfo; + fcinfo = pertrans->transfn_fcinfo; v_aggstatep = l_ptr_const(aggstate, l_ptr(StructAggState)); @@ -2344,18 +2292,6 @@ llvm_compile_expr(ExprState *state) v_fcinfo = l_ptr_const(fcinfo, l_ptr(StructFunctionCallInfoData)); - - v_argnullp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARGNULL, - "v_argnullp"); - v_argp = - LLVMBuildStructGEP(b, - v_fcinfo, - FIELDNO_FUNCTIONCALLINFODATA_ARG, - "v_argp"); - v_aggcontext = l_ptr_const(op->d.agg_trans.aggcontext, l_ptr(StructExprContext)); @@ -2387,7 +2323,7 @@ llvm_compile_expr(ExprState *state) l_ptr(StructMemoryContextData)); v_oldcontext = l_mcxt_switch(mod, b, v_tmpcontext); - /* store transvalue in fcinfo->arg/argnull[0] */ + /* store transvalue in fcinfo->args[0] */ v_transvaluep = LLVMBuildStructGEP(b, v_pergroupp, FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUE, @@ -2399,10 +2335,10 @@ llvm_compile_expr(ExprState *state) LLVMBuildStore(b, LLVMBuildLoad(b, v_transvaluep, "transvalue"), - LLVMBuildStructGEP(b, v_argp, 0, "")); + l_funcvaluep(b, v_fcinfo, 0)); LLVMBuildStore(b, LLVMBuildLoad(b, v_transnullp, "transnull"), - LLVMBuildStructGEP(b, v_argnullp, 0, "")); + l_funcnullp(b, v_fcinfo, 0)); /* and invoke transition function */ v_retval = BuildV1Call(context, b, mod, fcinfo, @@ -2589,12 +2525,8 @@ BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMValueRef v_lifetime = create_LifetimeEnd(mod); LLVMValueRef params[2]; - params[0] = l_int64_const(sizeof(fcinfo->arg)); - params[1] = l_ptr_const(fcinfo->arg, l_ptr(LLVMInt8Type())); - LLVMBuildCall(b, v_lifetime, params, lengthof(params), ""); - - params[0] = l_int64_const(sizeof(fcinfo->argnull)); - params[1] = l_ptr_const(fcinfo->argnull, l_ptr(LLVMInt8Type())); + params[0] = l_int64_const(sizeof(NullableDatum) * fcinfo->nargs); + params[1] = l_ptr_const(fcinfo->args, l_ptr(LLVMInt8Type())); LLVMBuildCall(b, v_lifetime, params, lengthof(params), ""); params[0] = l_int64_const(sizeof(fcinfo->isnull)); |