18#include <llvm-c/Core.h>
19#include <llvm-c/Target.h>
57static LLVMValueRef
BuildV1Call(LLVMJitContext *context, LLVMBuilderRef
b,
59 LLVMValueRef *v_fcinfo_isnull);
64 int natts, LLVMValueRef *v_args);
68#define build_EvalXFunc(b, mod, funcname, v_state, op, ...) \
69 build_EvalXFuncInt(b, mod, funcname, v_state, op, \
70 lengthof(((LLVMValueRef[]){__VA_ARGS__})), \
71 ((LLVMValueRef[]){__VA_ARGS__}))
83 LLVMJitContext *context = NULL;
89 LLVMBasicBlockRef entry;
90 LLVMBasicBlockRef *opblocks;
94 LLVMValueRef v_econtext;
95 LLVMValueRef v_parent;
98 LLVMValueRef v_isnullp;
101 LLVMValueRef v_tmpvaluep;
102 LLVMValueRef v_tmpisnullp;
105 LLVMValueRef v_innerslot;
106 LLVMValueRef v_outerslot;
107 LLVMValueRef v_scanslot;
108 LLVMValueRef v_oldslot;
109 LLVMValueRef v_newslot;
110 LLVMValueRef v_resultslot;
113 LLVMValueRef v_innervalues;
114 LLVMValueRef v_innernulls;
115 LLVMValueRef v_outervalues;
116 LLVMValueRef v_outernulls;
117 LLVMValueRef v_scanvalues;
118 LLVMValueRef v_scannulls;
119 LLVMValueRef v_oldvalues;
120 LLVMValueRef v_oldnulls;
121 LLVMValueRef v_newvalues;
122 LLVMValueRef v_newnulls;
123 LLVMValueRef v_resultvalues;
124 LLVMValueRef v_resultnulls;
127 LLVMValueRef v_aggvalues;
128 LLVMValueRef v_aggnulls;
145 context = (LLVMJitContext *) parent->
state->
es_jit;
155 lc = LLVMGetModuleContext(mod);
157 b = LLVMCreateBuilderInContext(lc);
162 eval_fn = LLVMAddFunction(mod,
funcname,
164 LLVMSetLinkage(eval_fn, LLVMExternalLinkage);
165 LLVMSetVisibility(eval_fn, LLVMDefaultVisibility);
168 entry = LLVMAppendBasicBlockInContext(lc, eval_fn,
"entry");
171 v_state = LLVMGetParam(eval_fn, 0);
172 v_econtext = LLVMGetParam(eval_fn, 1);
173 v_isnullp = LLVMGetParam(eval_fn, 2);
175 LLVMPositionBuilderAtEnd(
b, entry);
177 v_tmpvaluep = l_struct_gep(
b,
182 v_tmpisnullp = l_struct_gep(
b,
187 v_parent = l_load_struct_gep(
b,
194 v_scanslot = l_load_struct_gep(
b,
199 v_innerslot = l_load_struct_gep(
b,
204 v_outerslot = l_load_struct_gep(
b,
209 v_oldslot = l_load_struct_gep(
b,
214 v_newslot = l_load_struct_gep(
b,
219 v_resultslot = l_load_struct_gep(
b,
226 v_scanvalues = l_load_struct_gep(
b,
231 v_scannulls = l_load_struct_gep(
b,
236 v_innervalues = l_load_struct_gep(
b,
241 v_innernulls = l_load_struct_gep(
b,
246 v_outervalues = l_load_struct_gep(
b,
251 v_outernulls = l_load_struct_gep(
b,
256 v_oldvalues = l_load_struct_gep(
b,
261 v_oldnulls = l_load_struct_gep(
b,
266 v_newvalues = l_load_struct_gep(
b,
271 v_newnulls = l_load_struct_gep(
b,
276 v_resultvalues = l_load_struct_gep(
b,
281 v_resultnulls = l_load_struct_gep(
b,
288 v_aggvalues = l_load_struct_gep(
b,
292 "v.econtext.aggvalues");
293 v_aggnulls = l_load_struct_gep(
b,
297 "v.econtext.aggnulls");
300 opblocks =
palloc(
sizeof(LLVMBasicBlockRef) *
state->steps_len);
301 for (
int opno = 0; opno <
state->steps_len; opno++)
302 opblocks[opno] = l_bb_append_v(eval_fn,
"b.op.%d.start", opno);
305 LLVMBuildBr(
b, opblocks[0]);
307 for (
int opno = 0; opno <
state->steps_len; opno++)
311 LLVMValueRef v_resvaluep;
312 LLVMValueRef v_resnullp;
314 LLVMPositionBuilderAtEnd(
b, opblocks[opno]);
316 op = &
state->steps[opno];
326 LLVMValueRef v_tmpisnull;
327 LLVMValueRef v_tmpvalue;
329 v_tmpvalue = l_load(
b,
TypeSizeT, v_tmpvaluep,
"");
332 LLVMBuildStore(
b, v_tmpisnull, v_isnullp);
334 LLVMBuildRet(
b, v_tmpvalue);
339 LLVMBuildRet(
b, l_sizet_const(0));
350 LLVMBasicBlockRef b_fetch;
351 LLVMValueRef v_nvalid;
352 LLVMValueRef l_jit_deform = NULL;
355 b_fetch = l_bb_before_v(opblocks[opno + 1],
356 "op.%d.fetch", opno);
368 v_slot = v_innerslot;
370 v_slot = v_outerslot;
389 LLVMBuildICmp(
b, LLVMIntUGE, v_nvalid,
392 opblocks[opno + 1], b_fetch);
394 LLVMPositionBuilderAtEnd(
b, b_fetch);
402 if (tts_ops && desc && (context->base.flags &
PGJIT_DEFORM))
411 deform_endtime, deform_starttime);
416 LLVMValueRef params[1];
427 LLVMValueRef params[2];
438 LLVMBuildBr(
b, opblocks[opno + 1]);
450 LLVMValueRef v_attnum;
451 LLVMValueRef v_values;
452 LLVMValueRef v_nulls;
456 v_values = v_innervalues;
457 v_nulls = v_innernulls;
461 v_values = v_outervalues;
462 v_nulls = v_outernulls;
466 v_values = v_scanvalues;
467 v_nulls = v_scannulls;
471 v_values = v_oldvalues;
472 v_nulls = v_oldnulls;
476 v_values = v_newvalues;
477 v_nulls = v_newnulls;
480 v_attnum = l_int32_const(lc, op->
d.
var.
attnum);
483 LLVMBuildStore(
b,
value, v_resvaluep);
484 LLVMBuildStore(
b, isnull, v_resnullp);
486 LLVMBuildBr(
b, opblocks[opno + 1]);
499 v_slot = v_innerslot;
501 v_slot = v_outerslot;
510 v_state, op, v_econtext, v_slot);
512 LLVMBuildBr(
b, opblocks[opno + 1]);
518 v_state, op, v_econtext);
519 LLVMBuildBr(
b, opblocks[opno + 1]);
528 LLVMValueRef v_value;
529 LLVMValueRef v_isnull;
530 LLVMValueRef v_rvaluep;
531 LLVMValueRef v_risnullp;
532 LLVMValueRef v_attnum;
533 LLVMValueRef v_resultnum;
534 LLVMValueRef v_values;
535 LLVMValueRef v_nulls;
539 v_values = v_innervalues;
540 v_nulls = v_innernulls;
544 v_values = v_outervalues;
545 v_nulls = v_outernulls;
549 v_values = v_scanvalues;
550 v_nulls = v_scannulls;
554 v_values = v_oldvalues;
555 v_nulls = v_oldnulls;
559 v_values = v_newvalues;
560 v_nulls = v_newnulls;
565 v_value = l_load_gep1(
b,
TypeSizeT, v_values, v_attnum,
"");
573 &v_resultnum, 1,
"");
574 v_risnullp = l_gep(
b,
577 &v_resultnum, 1,
"");
580 LLVMBuildStore(
b, v_value, v_rvaluep);
581 LLVMBuildStore(
b, v_isnull, v_risnullp);
583 LLVMBuildBr(
b, opblocks[opno + 1]);
590 LLVMValueRef v_value,
592 LLVMValueRef v_rvaluep,
594 LLVMValueRef v_resultnum;
598 v_value = l_load(
b,
TypeSizeT, v_tmpvaluep,
"");
602 v_resultnum = l_int32_const(lc, resultnum);
604 l_gep(
b,
TypeSizeT, v_resultvalues, &v_resultnum, 1,
"");
609 LLVMBuildStore(
b, v_isnull, v_risnullp);
614 LLVMBasicBlockRef b_notnull;
615 LLVMValueRef v_params[1];
617 b_notnull = l_bb_before_v(opblocks[opno + 1],
618 "op.%d.assign_tmp.notnull", opno);
622 LLVMBuildICmp(
b, LLVMIntEQ, v_isnull,
623 l_sbool_const(0),
""),
624 b_notnull, opblocks[opno + 1]);
627 LLVMPositionBuilderAtEnd(
b, b_notnull);
628 v_params[0] = v_value;
632 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
642 LLVMBuildStore(
b, v_value, v_rvaluep);
644 LLVMBuildBr(
b, opblocks[opno + 1]);
650 LLVMValueRef v_constvalue,
656 LLVMBuildStore(
b, v_constvalue, v_resvaluep);
657 LLVMBuildStore(
b, v_constnull, v_resnullp);
659 LLVMBuildBr(
b, opblocks[opno + 1]);
669 LLVMValueRef v_fcinfo_isnull;
670 LLVMValueRef v_retval;
676 LLVMBasicBlockRef b_nonull;
677 LLVMBasicBlockRef *b_checkargnulls;
678 LLVMValueRef v_fcinfo;
684 b_nonull = l_bb_before_v(opblocks[opno + 1],
685 "b.%d.no-null-args", opno);
689 elog(
ERROR,
"argumentless strict functions are pointless");
698 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
703 for (
int argno = 0; argno < op->
d.
func.
nargs; argno++)
704 b_checkargnulls[argno] =
705 l_bb_before_v(b_nonull,
"b.%d.isnull.%d", opno,
709 LLVMBuildBr(
b, b_checkargnulls[0]);
712 for (
int argno = 0; argno < op->
d.
func.
nargs; argno++)
714 LLVMValueRef v_argisnull;
715 LLVMBasicBlockRef b_argnotnull;
717 LLVMPositionBuilderAtEnd(
b, b_checkargnulls[argno]);
724 b_argnotnull = b_nonull;
726 b_argnotnull = b_checkargnulls[argno + 1];
729 v_argisnull = l_funcnull(
b, v_fcinfo, argno);
731 LLVMBuildICmp(
b, LLVMIntEQ,
739 LLVMPositionBuilderAtEnd(
b, b_nonull);
744 LLVMBuildStore(
b, v_retval, v_resvaluep);
745 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
747 LLVMBuildBr(
b, opblocks[opno + 1]);
753 v_state, op, v_econtext);
754 LLVMBuildBr(
b, opblocks[opno + 1]);
760 v_state, op, v_econtext);
761 LLVMBuildBr(
b, opblocks[opno + 1]);
773 LLVMValueRef v_boolvalue;
774 LLVMValueRef v_boolnull;
775 LLVMValueRef v_boolanynullp,
777 LLVMBasicBlockRef b_boolisnull;
778 LLVMBasicBlockRef b_boolcheckfalse;
779 LLVMBasicBlockRef b_boolisfalse;
780 LLVMBasicBlockRef b_boolcont;
781 LLVMBasicBlockRef b_boolisanynull;
783 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
784 "b.%d.boolisnull", opno);
785 b_boolcheckfalse = l_bb_before_v(opblocks[opno + 1],
786 "b.%d.boolcheckfalse", opno);
787 b_boolisfalse = l_bb_before_v(opblocks[opno + 1],
788 "b.%d.boolisfalse", opno);
789 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
790 "b.%d.boolisanynull", opno);
791 b_boolcont = l_bb_before_v(opblocks[opno + 1],
792 "b.%d.boolcont", opno);
798 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
801 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
805 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
806 l_sbool_const(1),
""),
811 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
813 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
815 LLVMBuildBr(
b, b_boolcont);
818 LLVMPositionBuilderAtEnd(
b, b_boolcheckfalse);
820 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
821 l_sizet_const(0),
""),
829 LLVMPositionBuilderAtEnd(
b, b_boolisfalse);
835 LLVMPositionBuilderAtEnd(
b, b_boolcont);
841 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
842 l_sbool_const(0),
""),
843 opblocks[opno + 1], b_boolisanynull);
845 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
847 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
849 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
851 LLVMBuildBr(
b, opblocks[opno + 1]);
864 LLVMValueRef v_boolvalue;
865 LLVMValueRef v_boolnull;
866 LLVMValueRef v_boolanynullp,
869 LLVMBasicBlockRef b_boolisnull;
870 LLVMBasicBlockRef b_boolchecktrue;
871 LLVMBasicBlockRef b_boolistrue;
872 LLVMBasicBlockRef b_boolcont;
873 LLVMBasicBlockRef b_boolisanynull;
875 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
876 "b.%d.boolisnull", opno);
877 b_boolchecktrue = l_bb_before_v(opblocks[opno + 1],
878 "b.%d.boolchecktrue", opno);
879 b_boolistrue = l_bb_before_v(opblocks[opno + 1],
880 "b.%d.boolistrue", opno);
881 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
882 "b.%d.boolisanynull", opno);
883 b_boolcont = l_bb_before_v(opblocks[opno + 1],
884 "b.%d.boolcont", opno);
890 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
892 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
895 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
896 l_sbool_const(1),
""),
901 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
903 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
905 LLVMBuildBr(
b, b_boolcont);
908 LLVMPositionBuilderAtEnd(
b, b_boolchecktrue);
910 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
911 l_sizet_const(1),
""),
919 LLVMPositionBuilderAtEnd(
b, b_boolistrue);
925 LLVMPositionBuilderAtEnd(
b, b_boolcont);
931 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
932 l_sbool_const(0),
""),
933 opblocks[opno + 1], b_boolisanynull);
935 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
937 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
939 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
941 LLVMBuildBr(
b, opblocks[opno + 1]);
947 LLVMValueRef v_boolvalue;
948 LLVMValueRef v_negbool;
951 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
952 v_negbool = LLVMBuildZExt(
b,
953 LLVMBuildICmp(
b, LLVMIntEQ,
964 LLVMBuildStore(
b, v_negbool, v_resvaluep);
966 LLVMBuildBr(
b, opblocks[opno + 1]);
972 LLVMValueRef v_resnull;
973 LLVMValueRef v_resvalue;
974 LLVMValueRef v_nullorfalse;
975 LLVMBasicBlockRef b_qualfail;
977 b_qualfail = l_bb_before_v(opblocks[opno + 1],
978 "op.%d.qualfail", opno);
980 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
985 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
986 l_sbool_const(1),
""),
987 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
988 l_sizet_const(0),
""),
997 LLVMPositionBuilderAtEnd(
b, b_qualfail);
999 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1001 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1015 LLVMValueRef v_resnull;
1022 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1023 l_sbool_const(1),
""),
1025 opblocks[opno + 1]);
1031 LLVMValueRef v_resnull;
1038 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1039 l_sbool_const(0),
""),
1041 opblocks[opno + 1]);
1048 LLVMValueRef v_resnull;
1049 LLVMValueRef v_resvalue;
1050 LLVMValueRef v_nullorfalse;
1054 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
1059 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1060 l_sbool_const(1),
""),
1061 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
1062 l_sizet_const(0),
""),
1068 opblocks[opno + 1]);
1075 LLVMValueRef v_resvalue;
1079 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1080 l_sbool_const(1),
""),
1084 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
1085 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1087 LLVMBuildBr(
b, opblocks[opno + 1]);
1094 LLVMValueRef v_resvalue;
1098 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1099 l_sbool_const(1),
""),
1103 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
1104 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1106 LLVMBuildBr(
b, opblocks[opno + 1]);
1112 v_state, op, v_econtext);
1113 LLVMBuildBr(
b, opblocks[opno + 1]);
1118 v_state, op, v_econtext);
1119 LLVMBuildBr(
b, opblocks[opno + 1]);
1127 LLVMBasicBlockRef b_isnull,
1131 b_isnull = l_bb_before_v(opblocks[opno + 1],
1132 "op.%d.isnull", opno);
1133 b_notnull = l_bb_before_v(opblocks[opno + 1],
1134 "op.%d.isnotnull", opno);
1138 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1139 l_sbool_const(1),
""),
1140 b_isnull, b_notnull);
1143 LLVMPositionBuilderAtEnd(
b, b_isnull);
1146 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1151 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1155 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1158 LLVMBuildBr(
b, opblocks[opno + 1]);
1160 LLVMPositionBuilderAtEnd(
b, b_notnull);
1172 LLVMValueRef v_value =
1175 v_value = LLVMBuildZExt(
b,
1176 LLVMBuildICmp(
b, LLVMIntEQ,
1181 LLVMBuildStore(
b, v_value, v_resvaluep);
1183 LLVMBuildBr(
b, opblocks[opno + 1]);
1189 v_state, op, v_econtext);
1190 LLVMBuildBr(
b, opblocks[opno + 1]);
1195 v_state, op, v_econtext);
1196 LLVMBuildBr(
b, opblocks[opno + 1]);
1201 LLVMValueRef v_func;
1202 LLVMValueRef v_params[3];
1207 v_params[0] = v_state;
1209 v_params[2] = v_econtext;
1215 LLVMBuildBr(
b, opblocks[opno + 1]);
1221 v_state, op, v_econtext);
1222 LLVMBuildBr(
b, opblocks[opno + 1]);
1228 LLVMValueRef v_func;
1229 LLVMValueRef v_params[3];
1235 v_params[0] = v_state;
1237 v_params[2] = v_econtext;
1245 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
1246 l_sbool_const(1),
""),
1248 opblocks[jumpdone]);
1256 LLVMValueRef v_func;
1257 LLVMValueRef v_params[3];
1262 v_params[0] = v_state;
1264 v_params[2] = v_econtext;
1270 LLVMBuildBr(
b, opblocks[opno + 1]);
1276 LLVMValueRef v_casevaluep,
1278 LLVMValueRef v_casenullp,
1286 v_casevalue = l_load(
b,
TypeSizeT, v_casevaluep,
"");
1288 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1289 LLVMBuildStore(
b, v_casenull, v_resnullp);
1291 LLVMBuildBr(
b, opblocks[opno + 1]);
1297 LLVMValueRef v_casevalue;
1298 LLVMValueRef v_casenull;
1301 l_load_struct_gep(
b,
1306 l_load_struct_gep(
b,
1310 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1311 LLVMBuildStore(
b, v_casenull, v_resnullp);
1313 LLVMBuildBr(
b, opblocks[opno + 1]);
1319 LLVMBasicBlockRef b_notnull;
1320 LLVMValueRef v_params[1];
1322 LLVMValueRef v_nullp;
1323 LLVMValueRef v_valuep;
1324 LLVMValueRef v_null;
1325 LLVMValueRef v_value;
1327 b_notnull = l_bb_before_v(opblocks[opno + 1],
1328 "op.%d.readonly.notnull", opno);
1336 LLVMBuildStore(
b, v_null, v_resnullp);
1340 LLVMBuildICmp(
b, LLVMIntEQ, v_null,
1341 l_sbool_const(1),
""),
1342 opblocks[opno + 1], b_notnull);
1345 LLVMPositionBuilderAtEnd(
b, b_notnull);
1350 v_value = l_load(
b,
TypeSizeT, v_valuep,
"");
1352 v_params[0] = v_value;
1356 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1358 LLVMBuildStore(
b, v_ret, v_resvaluep);
1360 LLVMBuildBr(
b, opblocks[opno + 1]);
1368 LLVMValueRef v_fn_out,
1370 LLVMValueRef v_fcinfo_out,
1372 LLVMValueRef v_fcinfo_in_isnullp;
1373 LLVMValueRef v_retval;
1374 LLVMValueRef v_resvalue;
1375 LLVMValueRef v_resnull;
1377 LLVMValueRef v_output_skip;
1378 LLVMValueRef v_output;
1380 LLVMBasicBlockRef b_skipoutput;
1381 LLVMBasicBlockRef b_calloutput;
1382 LLVMBasicBlockRef b_input;
1383 LLVMBasicBlockRef b_inputcall;
1388 b_skipoutput = l_bb_before_v(opblocks[opno + 1],
1389 "op.%d.skipoutputnull", opno);
1390 b_calloutput = l_bb_before_v(opblocks[opno + 1],
1391 "op.%d.calloutput", opno);
1392 b_input = l_bb_before_v(opblocks[opno + 1],
1393 "op.%d.input", opno);
1394 b_inputcall = l_bb_before_v(opblocks[opno + 1],
1395 "op.%d.inputcall", opno);
1402 v_fcinfo_in_isnullp =
1407 "v_fcinfo_in_isnull");
1412 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1413 l_sbool_const(1),
""),
1417 LLVMPositionBuilderAtEnd(
b, b_skipoutput);
1418 v_output_skip = l_sizet_const(0);
1419 LLVMBuildBr(
b, b_input);
1421 LLVMPositionBuilderAtEnd(
b, b_calloutput);
1422 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
1427 l_funcvaluep(
b, v_fcinfo_out, 0));
1430 l_funcnullp(
b, v_fcinfo_out, 0));
1432 v_output = l_call(
b,
1434 v_fn_out, &v_fcinfo_out,
1435 1,
"funccall_coerce_out");
1436 LLVMBuildBr(
b, b_input);
1439 LLVMPositionBuilderAtEnd(
b, b_input);
1443 LLVMValueRef incoming_values[2];
1444 LLVMBasicBlockRef incoming_blocks[2];
1446 incoming_values[0] = v_output_skip;
1447 incoming_blocks[0] = b_skipoutput;
1449 incoming_values[1] = v_output;
1450 incoming_blocks[1] = b_calloutput;
1452 v_output = LLVMBuildPhi(
b,
TypeSizeT,
"output");
1453 LLVMAddIncoming(v_output,
1454 incoming_values, incoming_blocks,
1465 LLVMBuildICmp(
b, LLVMIntEQ, v_output,
1466 l_sizet_const(0),
""),
1472 LLVMBuildBr(
b, b_inputcall);
1475 LLVMPositionBuilderAtEnd(
b, b_inputcall);
1478 LLVMBuildStore(
b, v_output,
1479 l_funcvaluep(
b, v_fcinfo_in, 0));
1480 LLVMBuildStore(
b, v_resnull,
1481 l_funcnullp(
b, v_fcinfo_in, 0));
1487 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_in_isnullp);
1489 v_retval = l_call(
b,
1491 v_fn_in, &v_fcinfo_in, 1,
1492 "funccall_iocoerce_in");
1494 LLVMBuildStore(
b, v_retval, v_resvaluep);
1496 LLVMBuildBr(
b, opblocks[opno + 1]);
1503 LLVMBuildBr(
b, opblocks[opno + 1]);
1511 LLVMValueRef v_fcinfo;
1512 LLVMValueRef v_fcinfo_isnull;
1514 LLVMValueRef v_argnull0,
1516 LLVMValueRef v_argnull1,
1519 LLVMValueRef v_anyargisnull;
1520 LLVMValueRef v_bothargisnull;
1522 LLVMValueRef v_result;
1524 LLVMBasicBlockRef b_noargnull;
1525 LLVMBasicBlockRef b_checkbothargnull;
1526 LLVMBasicBlockRef b_bothargnull;
1527 LLVMBasicBlockRef b_anyargnull;
1529 b_noargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.noargnull", opno);
1530 b_checkbothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.checkbothargnull", opno);
1531 b_bothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.bothargnull", opno);
1532 b_anyargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.anyargnull", opno);
1537 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1538 v_argisnull0 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1539 l_sbool_const(1),
"");
1540 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1541 v_argisnull1 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1542 l_sbool_const(1),
"");
1544 v_anyargisnull = LLVMBuildOr(
b, v_argisnull0, v_argisnull1,
"");
1545 v_bothargisnull = LLVMBuildAnd(
b, v_argisnull0, v_argisnull1,
"");
1552 LLVMBuildCondBr(
b, v_anyargisnull, b_checkbothargnull,
1558 LLVMPositionBuilderAtEnd(
b, b_checkbothargnull);
1559 LLVMBuildCondBr(
b, v_bothargisnull, b_bothargnull,
1564 LLVMPositionBuilderAtEnd(
b, b_bothargnull);
1565 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1567 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1569 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1571 LLVMBuildBr(
b, opblocks[opno + 1]);
1574 LLVMPositionBuilderAtEnd(
b, b_anyargnull);
1575 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1577 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1579 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1580 LLVMBuildBr(
b, opblocks[opno + 1]);
1583 LLVMPositionBuilderAtEnd(
b, b_noargnull);
1593 LLVMBuildICmp(
b, LLVMIntEQ,
1595 l_sizet_const(0),
""),
1599 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1600 LLVMBuildStore(
b, v_result, v_resvaluep);
1602 LLVMBuildBr(
b, opblocks[opno + 1]);
1610 LLVMValueRef v_fcinfo;
1611 LLVMValueRef v_fcinfo_isnull;
1612 LLVMValueRef v_argnull0;
1613 LLVMValueRef v_argnull1;
1614 LLVMValueRef v_anyargisnull;
1615 LLVMValueRef v_arg0;
1616 LLVMBasicBlockRef b_hasnull;
1617 LLVMBasicBlockRef b_nonull;
1618 LLVMBasicBlockRef b_argsequal;
1619 LLVMValueRef v_retval;
1620 LLVMValueRef v_argsequal;
1622 b_hasnull = l_bb_before_v(opblocks[opno + 1],
1623 "b.%d.null-args", opno);
1624 b_nonull = l_bb_before_v(opblocks[opno + 1],
1625 "b.%d.no-null-args", opno);
1626 b_argsequal = l_bb_before_v(opblocks[opno + 1],
1627 "b.%d.argsequal", opno);
1632 v_arg0 = l_funcvalue(
b, v_fcinfo, 0);
1635 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1636 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1640 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1641 l_sbool_const(1),
""),
1642 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1643 l_sbool_const(1),
""),
1646 LLVMBuildCondBr(
b, v_anyargisnull, b_hasnull, b_nonull);
1649 LLVMPositionBuilderAtEnd(
b, b_hasnull);
1650 LLVMBuildStore(
b, v_argnull0, v_resnullp);
1651 LLVMBuildStore(
b, v_arg0, v_resvaluep);
1652 LLVMBuildBr(
b, opblocks[opno + 1]);
1655 LLVMPositionBuilderAtEnd(
b, b_nonull);
1667 LLVMValueRef v_params[1];
1668 LLVMValueRef v_arg0_ro;
1670 v_params[0] = v_arg0;
1674 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1676 LLVMBuildStore(
b, v_arg0_ro,
1677 l_funcvaluep(
b, v_fcinfo, 0));
1680 v_retval =
BuildV1Call(context,
b, mod, fcinfo, &v_fcinfo_isnull);
1687 v_argsequal = LLVMBuildAnd(
b,
1688 LLVMBuildICmp(
b, LLVMIntEQ,
1692 LLVMBuildICmp(
b, LLVMIntEQ,
1697 LLVMBuildCondBr(
b, v_argsequal, b_argsequal, b_hasnull);
1700 LLVMPositionBuilderAtEnd(
b, b_argsequal);
1701 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1702 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1704 LLVMBuildBr(
b, opblocks[opno + 1]);
1711 LLVMBuildBr(
b, opblocks[opno + 1]);
1717 LLVMBuildBr(
b, opblocks[opno + 1]);
1723 LLVMBuildBr(
b, opblocks[opno + 1]);
1728 LLVMBasicBlockRef b_isnull;
1729 LLVMValueRef v_flagsp;
1730 LLVMValueRef v_flags;
1731 LLVMValueRef v_nullflag;
1733 b_isnull = l_bb_before_v(opblocks[opno + 1],
1734 "op.%d.row.isnull", opno);
1740 v_flagsp = l_struct_gep(
b,
1750 LLVMBuildICmp(
b, LLVMIntEQ,
1751 LLVMBuildAnd(
b, v_flags,
1753 l_sbool_const(0),
""),
1754 opblocks[opno + 1], b_isnull);
1756 LLVMPositionBuilderAtEnd(
b, b_isnull);
1758 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1759 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1768 LLVMBuildBr(
b, opblocks[opno + 1]);
1773 v_state, op, v_econtext);
1774 LLVMBuildBr(
b, opblocks[opno + 1]);
1780 LLVMBuildBr(
b, opblocks[opno + 1]);
1786 LLVMValueRef v_fcinfo_isnull;
1787 LLVMBasicBlockRef b_null;
1788 LLVMBasicBlockRef b_compare;
1789 LLVMBasicBlockRef b_compare_result;
1791 LLVMValueRef v_retval;
1793 b_null = l_bb_before_v(opblocks[opno + 1],
1794 "op.%d.row-null", opno);
1795 b_compare = l_bb_before_v(opblocks[opno + 1],
1796 "op.%d.row-compare", opno);
1798 l_bb_before_v(opblocks[opno + 1],
1799 "op.%d.row-compare-result",
1808 LLVMValueRef v_fcinfo;
1809 LLVMValueRef v_argnull0;
1810 LLVMValueRef v_argnull1;
1811 LLVMValueRef v_anyargisnull;
1813 v_fcinfo = l_ptr_const(fcinfo,
1816 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1817 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1826 LLVMBuildICmp(
b, LLVMIntEQ,
1828 l_sbool_const(1),
""),
1831 LLVMBuildCondBr(
b, v_anyargisnull, b_null, b_compare);
1835 LLVMBuildBr(
b, b_compare);
1839 LLVMPositionBuilderAtEnd(
b, b_compare);
1844 LLVMBuildStore(
b, v_retval, v_resvaluep);
1857 LLVMPositionBuilderAtEnd(
b, b_compare_result);
1864 l_sizet_const(0),
""),
1872 LLVMPositionBuilderAtEnd(
b, b_null);
1873 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1883 LLVMValueRef v_cmpresult;
1884 LLVMValueRef v_result;
1885 LLVMIntPredicate predicate;
1895 LLVMInt32TypeInContext(lc),
"");
1900 predicate = LLVMIntSLT;
1903 predicate = LLVMIntSLE;
1906 predicate = LLVMIntSGT;
1909 predicate = LLVMIntSGE;
1918 v_result = LLVMBuildICmp(
b,
1921 l_int32_const(lc, 0),
1923 v_result = LLVMBuildZExt(
b, v_result,
TypeSizeT,
"");
1925 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1926 LLVMBuildStore(
b, v_result, v_resvaluep);
1928 LLVMBuildBr(
b, opblocks[opno + 1]);
1935 LLVMBuildBr(
b, opblocks[opno + 1]);
1940 v_state, op, v_econtext);
1941 LLVMBuildBr(
b, opblocks[opno + 1]);
1946 v_state, op, v_econtext);
1947 LLVMBuildBr(
b, opblocks[opno + 1]);
1952 v_state, op, v_econtext);
1953 LLVMBuildBr(
b, opblocks[opno + 1]);
1958 LLVMValueRef v_casevaluep,
1960 LLVMValueRef v_casenullp,
1968 v_casevalue = l_load(
b,
TypeSizeT, v_casevaluep,
"");
1970 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1971 LLVMBuildStore(
b, v_casenull, v_resnullp);
1973 LLVMBuildBr(
b, opblocks[opno + 1]);
1979 LLVMValueRef v_casevalue;
1980 LLVMValueRef v_casenull;
1983 l_load_struct_gep(
b,
1989 l_load_struct_gep(
b,
1994 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1995 LLVMBuildStore(
b, v_casenull, v_resnullp);
1997 LLVMBuildBr(
b, opblocks[opno + 1]);
2004 LLVMBuildBr(
b, opblocks[opno + 1]);
2010 LLVMBuildBr(
b, opblocks[opno + 1]);
2015 LLVMValueRef v_initvalue;
2019 LLVMBuildStore(
b, v_initvalue, v_resvaluep);
2020 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2021 LLVMBuildBr(
b, opblocks[opno + 1]);
2031 LLVMValueRef v_fcinfo;
2032 LLVMValueRef v_fcinfo_isnull;
2033 LLVMValueRef v_retval;
2034 LLVMBasicBlockRef b_checkargnull;
2035 LLVMBasicBlockRef b_ifnotnull;
2036 LLVMBasicBlockRef b_ifnullblock;
2037 LLVMValueRef v_argisnull;
2038 LLVMValueRef v_prevhash = NULL;
2051 LLVMValueRef v_tmp1;
2052 LLVMValueRef v_tmp2;
2062 v_prevhash = l_load(
b,
TypeSizeT, tmp,
"prevhash");
2068 v_tmp1 = LLVMBuildShl(
b, v_prevhash, l_sizet_const(1),
2070 v_tmp1 = LLVMBuildAnd(
b, v_tmp1,
2071 l_sizet_const(0xffffffff),
"");
2072 v_tmp2 = LLVMBuildLShr(
b, v_prevhash,
2073 l_sizet_const(31),
"");
2074 v_prevhash = LLVMBuildOr(
b, v_tmp1, v_tmp2,
2082 b_ifnotnull = l_bb_before_v(opblocks[opno + 1],
2087 if (fcinfo->
nargs != 1)
2088 elog(
ERROR,
"incorrect number of function arguments");
2090 v_fcinfo = l_ptr_const(fcinfo,
2093 b_checkargnull = l_bb_before_v(b_ifnotnull,
2094 "b.%d.isnull.0", opno);
2096 LLVMBuildBr(
b, b_checkargnull);
2105 b_ifnullblock = l_bb_before_v(b_ifnotnull,
2109 LLVMPositionBuilderAtEnd(
b, b_ifnullblock);
2115 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
2116 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
2121 b_ifnullblock = l_bb_before_v(b_ifnotnull,
2125 LLVMPositionBuilderAtEnd(
b, b_ifnullblock);
2128 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2132 Assert(v_prevhash != NULL);
2138 LLVMBuildStore(
b, v_prevhash, v_resvaluep);
2148 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
2151 LLVMBuildBr(
b, opblocks[opno + 1]);
2154 LLVMPositionBuilderAtEnd(
b, b_checkargnull);
2157 v_argisnull = l_funcnull(
b, v_fcinfo, 0);
2167 LLVMPositionBuilderAtEnd(
b, b_ifnotnull);
2176 LLVMValueRef v_tmp1;
2177 LLVMValueRef v_tmp2;
2187 v_prevhash = l_load(
b,
TypeSizeT, tmp,
"prevhash");
2193 v_tmp1 = LLVMBuildShl(
b, v_prevhash, l_sizet_const(1),
2195 v_tmp1 = LLVMBuildAnd(
b, v_tmp1,
2196 l_sizet_const(0xffffffff),
"");
2197 v_tmp2 = LLVMBuildLShr(
b, v_prevhash,
2198 l_sizet_const(31),
"");
2199 v_prevhash = LLVMBuildOr(
b, v_tmp1, v_tmp2,
2213 v_retval = LLVMBuildXor(
b, v_prevhash, v_retval,
2216 LLVMBuildStore(
b, v_retval, v_resvaluep);
2217 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2219 LLVMBuildBr(
b, opblocks[opno + 1]);
2225 v_state, op, v_econtext);
2226 LLVMBuildBr(
b, opblocks[opno + 1]);
2232 LLVMBuildBr(
b, opblocks[opno + 1]);
2237 v_state, op, v_econtext);
2238 LLVMBuildBr(
b, opblocks[opno + 1]);
2244 LLVMBuildBr(
b, opblocks[opno + 1]);
2249 v_state, op, v_econtext);
2250 LLVMBuildBr(
b, opblocks[opno + 1]);
2256 LLVMBuildBr(
b, opblocks[opno + 1]);
2269 v_state, op, v_econtext);
2281 LLVMValueRef v_jump_empty;
2282 LLVMValueRef v_jump_error;
2283 LLVMValueRef v_jump_coercion;
2284 LLVMValueRef v_switch;
2285 LLVMBasicBlockRef b_done,
2291 l_bb_before_v(opblocks[opno + 1],
2292 "op.%d.jsonexpr_empty", opno);
2294 l_bb_before_v(opblocks[opno + 1],
2295 "op.%d.jsonexpr_error", opno);
2297 l_bb_before_v(opblocks[opno + 1],
2298 "op.%d.jsonexpr_coercion", opno);
2300 l_bb_before_v(opblocks[opno + 1],
2301 "op.%d.jsonexpr_done", opno);
2303 v_switch = LLVMBuildSwitch(
b,
2310 v_jump_empty = l_int32_const(lc, jsestate->
jump_empty);
2311 LLVMAddCase(v_switch, v_jump_empty, b_empty);
2314 LLVMPositionBuilderAtEnd(
b, b_empty);
2318 LLVMBuildUnreachable(
b);
2323 v_jump_error = l_int32_const(lc, jsestate->
jump_error);
2324 LLVMAddCase(v_switch, v_jump_error, b_error);
2327 LLVMPositionBuilderAtEnd(
b, b_error);
2331 LLVMBuildUnreachable(
b);
2337 LLVMAddCase(v_switch, v_jump_coercion, b_coercion);
2340 LLVMPositionBuilderAtEnd(
b, b_coercion);
2344 LLVMBuildUnreachable(
b);
2346 LLVMPositionBuilderAtEnd(
b, b_done);
2349 LLVMBuildBr(
b, opblocks[jsestate->
jump_end]);
2355 v_state, op, v_econtext);
2357 LLVMBuildBr(
b, opblocks[opno + 1]);
2364 LLVMBuildBr(
b, opblocks[opno + 1]);
2369 LLVMValueRef v_aggno;
2380 LLVMBuildStore(
b,
value, v_resvaluep);
2381 LLVMBuildStore(
b, isnull, v_resnullp);
2383 LLVMBuildBr(
b, opblocks[opno + 1]);
2390 LLVMBuildBr(
b, opblocks[opno + 1]);
2396 LLVMValueRef v_wfuncnop;
2397 LLVMValueRef v_wfuncno;
2406 v_wfuncnop = l_ptr_const(&wfunc->
wfuncno,
2407 l_ptr(LLVMInt32TypeInContext(lc)));
2408 v_wfuncno = l_load(
b, LLVMInt32TypeInContext(lc), v_wfuncnop,
"v_wfuncno");
2416 LLVMBuildStore(
b,
value, v_resvaluep);
2417 LLVMBuildStore(
b, isnull, v_resnullp);
2419 LLVMBuildBr(
b, opblocks[opno + 1]);
2425 v_state, op, v_econtext);
2426 LLVMBuildBr(
b, opblocks[opno + 1]);
2431 v_state, op, v_econtext);
2432 LLVMBuildBr(
b, opblocks[opno + 1]);
2441 LLVMValueRef v_retval;
2442 LLVMValueRef v_fcinfo_isnull;
2443 LLVMValueRef v_tmpcontext;
2444 LLVMValueRef v_oldcontext;
2448 LLVMValueRef v_fcinfo;
2449 LLVMValueRef v_argnull0;
2450 LLVMBasicBlockRef b_deserialize;
2452 b_deserialize = l_bb_before_v(opblocks[opno + 1],
2453 "op.%d.deserialize", opno);
2455 v_fcinfo = l_ptr_const(fcinfo,
2457 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
2467 LLVMPositionBuilderAtEnd(
b, b_deserialize);
2476 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2479 l_mcxt_switch(mod,
b, v_oldcontext);
2481 LLVMBuildStore(
b, v_retval, v_resvaluep);
2482 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
2484 LLVMBuildBr(
b, opblocks[opno + 1]);
2497 LLVMValueRef v_argsp;
2498 LLVMValueRef v_nullsp;
2499 LLVMBasicBlockRef *b_checknulls;
2508 b_checknulls =
palloc(
sizeof(LLVMBasicBlockRef *) * nargs);
2509 for (
int argno = 0; argno < nargs; argno++)
2511 b_checknulls[argno] =
2512 l_bb_before_v(opblocks[opno + 1],
2513 "op.%d.check-null.%d",
2517 LLVMBuildBr(
b, b_checknulls[0]);
2520 for (
int argno = 0; argno < nargs; argno++)
2522 LLVMValueRef v_argno = l_int32_const(lc, argno);
2523 LLVMValueRef v_argisnull;
2524 LLVMBasicBlockRef b_argnotnull;
2526 LLVMPositionBuilderAtEnd(
b, b_checknulls[argno]);
2528 if (argno + 1 == nargs)
2529 b_argnotnull = opblocks[opno + 1];
2531 b_argnotnull = b_checknulls[argno + 1];
2537 LLVMValueRef v_argn;
2550 l_sbool_const(1),
""),
2561 LLVMValueRef v_aggstatep;
2562 LLVMValueRef v_allpergroupsp;
2563 LLVMValueRef v_pergroup_allaggs;
2564 LLVMValueRef v_setoff;
2572 v_aggstatep = LLVMBuildBitCast(
b, v_parent,
2575 v_allpergroupsp = l_load_struct_gep(
b,
2579 "aggstate.all_pergroups");
2584 v_allpergroupsp, v_setoff,
"");
2587 LLVMBuildICmp(
b, LLVMIntEQ,
2588 LLVMBuildPtrToInt(
b, v_pergroup_allaggs,
TypeSizeT,
""),
2589 l_sizet_const(0),
""),
2591 opblocks[opno + 1]);
2606 LLVMValueRef v_aggstatep;
2607 LLVMValueRef v_fcinfo;
2608 LLVMValueRef v_fcinfo_isnull;
2610 LLVMValueRef v_transvaluep;
2611 LLVMValueRef v_transnullp;
2613 LLVMValueRef v_setoff;
2614 LLVMValueRef v_transno;
2616 LLVMValueRef v_aggcontext;
2618 LLVMValueRef v_allpergroupsp;
2619 LLVMValueRef v_current_setp;
2620 LLVMValueRef v_current_pertransp;
2621 LLVMValueRef v_curaggcontext;
2623 LLVMValueRef v_pertransp;
2625 LLVMValueRef v_pergroupp;
2627 LLVMValueRef v_retval;
2629 LLVMValueRef v_tmpcontext;
2630 LLVMValueRef v_oldcontext;
2639 v_pertransp = l_ptr_const(pertrans,
2647 l_load_struct_gep(
b,
2651 "aggstate.all_pergroups");
2658 v_allpergroupsp, v_setoff,
""),
2665 LLVMValueRef v_notransvalue;
2666 LLVMBasicBlockRef b_init;
2667 LLVMBasicBlockRef b_no_init;
2670 l_load_struct_gep(
b,
2676 b_init = l_bb_before_v(opblocks[opno + 1],
2677 "op.%d.inittrans", opno);
2678 b_no_init = l_bb_before_v(opblocks[opno + 1],
2679 "op.%d.no_inittrans", opno);
2682 LLVMBuildICmp(
b, LLVMIntEQ, v_notransvalue,
2683 l_sbool_const(1),
""),
2689 LLVMValueRef params[4];
2691 LLVMPositionBuilderAtEnd(
b, b_init);
2696 params[0] = v_aggstatep;
2697 params[1] = v_pertransp;
2698 params[2] = v_pergroupp;
2699 params[3] = v_aggcontext;
2707 LLVMBuildBr(
b, opblocks[opno + 1]);
2710 LLVMPositionBuilderAtEnd(
b, b_no_init);
2718 LLVMValueRef v_transnull;
2719 LLVMBasicBlockRef b_strictpass;
2721 b_strictpass = l_bb_before_v(opblocks[opno + 1],
2722 "op.%d.strictpass", opno);
2724 l_load_struct_gep(
b,
2731 LLVMBuildICmp(
b, LLVMIntEQ, v_transnull,
2732 l_sbool_const(1),
""),
2736 LLVMPositionBuilderAtEnd(
b, b_strictpass);
2740 v_fcinfo = l_ptr_const(fcinfo,
2750 "aggstate.current_set");
2756 "aggstate.curaggcontext");
2757 v_current_pertransp =
2762 "aggstate.curpertrans");
2765 LLVMBuildStore(
b, v_aggcontext, v_curaggcontext);
2768 LLVMBuildStore(
b, v_pertransp, v_current_pertransp);
2774 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2794 l_funcvaluep(
b, v_fcinfo, 0));
2797 l_funcnullp(
b, v_fcinfo, 0));
2816 LLVMBasicBlockRef b_call;
2817 LLVMBasicBlockRef b_nocall;
2819 LLVMValueRef v_transvalue;
2820 LLVMValueRef v_transnull;
2821 LLVMValueRef v_newval;
2822 LLVMValueRef params[6];
2824 b_call = l_bb_before_v(opblocks[opno + 1],
2825 "op.%d.transcall", opno);
2826 b_nocall = l_bb_before_v(opblocks[opno + 1],
2827 "op.%d.transnocall", opno);
2829 v_transvalue = l_load(
b,
TypeSizeT, v_transvaluep,
"");
2837 LLVMBuildICmp(
b, LLVMIntEQ,
2843 LLVMPositionBuilderAtEnd(
b, b_call);
2845 params[0] = v_aggstatep;
2846 params[1] = v_pertransp;
2847 params[2] = v_retval;
2848 params[3] = LLVMBuildTrunc(
b, v_fcinfo_isnull,
2850 params[4] = v_transvalue;
2851 params[5] = LLVMBuildTrunc(
b, v_transnull,
2863 LLVMBuildStore(
b, v_newval, v_transvaluep);
2864 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2866 l_mcxt_switch(mod,
b, v_oldcontext);
2867 LLVMBuildBr(
b, opblocks[opno + 1]);
2870 LLVMPositionBuilderAtEnd(
b, b_nocall);
2874 LLVMBuildStore(
b, v_retval, v_transvaluep);
2875 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2877 l_mcxt_switch(mod,
b, v_oldcontext);
2879 LLVMBuildBr(
b, opblocks[opno + 1]);
2889 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctSingle");
2890 LLVMValueRef v_args[2];
2900 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2901 l_sbool_const(1),
""),
2903 opblocks[jumpdistinct]);
2913 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctMulti");
2914 LLVMValueRef v_args[2];
2924 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2925 l_sbool_const(1),
""),
2927 opblocks[jumpdistinct]);
2933 v_state, op, v_econtext);
2934 LLVMBuildBr(
b, opblocks[opno + 1]);
2939 v_state, op, v_econtext);
2940 LLVMBuildBr(
b, opblocks[opno + 1]);
2949 LLVMDisposeBuilder(
b);
2965 state->evalfunc_private = cstate;
2972 endtime, starttime);
3000 state->evalfunc = func;
3002 return func(
state, econtext, isNull);
3008 LLVMValueRef *v_fcinfo_isnull)
3012 LLVMValueRef v_fcinfo_isnullp;
3013 LLVMValueRef v_retval;
3014 LLVMValueRef v_fcinfo;
3016 lc = LLVMGetModuleContext(mod);
3021 v_fcinfo_isnullp = l_struct_gep(
b,
3026 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_isnullp);
3030 if (v_fcinfo_isnull)
3039 LLVMValueRef params[2];
3042 params[1] = l_ptr_const(fcinfo->
args, l_ptr(LLVMInt8TypeInContext(lc)));
3045 params[0] = l_int64_const(lc,
sizeof(fcinfo->
isnull));
3046 params[1] = l_ptr_const(&fcinfo->
isnull, l_ptr(LLVMInt8TypeInContext(lc)));
3059 int nargs, LLVMValueRef *v_args)
3062 LLVMValueRef *params;
3067 if (LLVMCountParams(v_fn) != (nargs + 2))
3068 elog(
ERROR,
"parameter mismatch: %s expects %d passed %d",
3069 funcname, LLVMCountParams(v_fn), nargs + 2);
3071 params =
palloc(
sizeof(LLVMValueRef) * (2 + nargs));
3073 params[argno++] = v_state;
3076 for (
int i = 0;
i < nargs;
i++)
3077 params[argno++] = v_args[
i];
3091 LLVMTypeRef param_types[2];
3095 const char *nm =
"llvm.lifetime.end.p0";
3097 fn = LLVMGetNamedFunction(mod, nm);
3101 lc = LLVMGetModuleContext(mod);
3102 param_types[0] = LLVMInt64TypeInContext(lc);
3103 param_types[1] = l_ptr(LLVMInt8TypeInContext(lc));
3105 sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), param_types,
3107 fn = LLVMAddFunction(mod, nm,
sig);
3109 LLVMSetFunctionCallConv(
fn, LLVMCCallConv);
void CheckExprStillValid(ExprState *state, ExprContext *econtext)
ExprEvalOp ExecEvalStepOp(ExprState *state, ExprEvalStep *op)
@ EEOP_FUNCEXPR_STRICT_FUSAGE
@ EEOP_HASHDATUM_NEXT32_STRICT
@ EEOP_JSONEXPR_COERCION_FINISH
@ EEOP_HASHDATUM_FIRST_STRICT
@ EEOP_AGG_PLAIN_PERGROUP_NULLCHECK
@ EEOP_AGG_STRICT_DESERIALIZE
@ EEOP_BOOLTEST_IS_NOT_FALSE
@ EEOP_AGG_PLAIN_TRANS_BYREF
@ EEOP_AGG_PRESORTED_DISTINCT_MULTI
@ EEOP_AGG_PLAIN_TRANS_BYVAL
@ EEOP_NULLTEST_ROWISNOTNULL
@ EEOP_ASSIGN_TMP_MAKE_RO
@ EEOP_BOOL_OR_STEP_FIRST
@ EEOP_AGG_STRICT_INPUT_CHECK_NULLS
@ EEOP_AGG_STRICT_INPUT_CHECK_ARGS_1
@ EEOP_AGG_STRICT_INPUT_CHECK_ARGS
@ EEOP_NULLTEST_ROWISNULL
@ EEOP_NULLTEST_ISNOTNULL
@ EEOP_MERGE_SUPPORT_FUNC
@ EEOP_AGG_PRESORTED_DISTINCT_SINGLE
@ EEOP_BOOL_AND_STEP_FIRST
@ EEOP_DOMAIN_TESTVAL_EXT
@ EEOP_BOOL_AND_STEP_LAST
@ EEOP_AGG_ORDERED_TRANS_DATUM
@ EEOP_HASHDATUM_SET_INITVAL
@ EEOP_AGG_PLAIN_TRANS_STRICT_BYREF
@ EEOP_BOOLTEST_IS_NOT_TRUE
@ EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYVAL
@ EEOP_AGG_PLAIN_TRANS_STRICT_BYVAL
@ EEOP_AGG_PLAIN_TRANS_INIT_STRICT_BYREF
@ EEOP_HASHED_SCALARARRAYOP
@ EEOP_AGG_ORDERED_TRANS_TUPLE
const TupleTableSlotOps TTSOpsVirtual
#define FIELDNO_EXPRSTATE_RESULTSLOT
#define FIELDNO_EXPRCONTEXT_CASENULL
#define FIELDNO_EXPRCONTEXT_INNERTUPLE
#define FIELDNO_EXPRSTATE_FLAGS
#define FIELDNO_EXPRCONTEXT_DOMAINNULL
#define FIELDNO_EXPRCONTEXT_DOMAINDATUM
#define FIELDNO_EXPRCONTEXT_CASEDATUM
#define FIELDNO_EXPRCONTEXT_OLDTUPLE
#define FIELDNO_AGGSTATE_CURPERTRANS
#define FIELDNO_EXPRSTATE_RESNULL
#define FIELDNO_EXPRCONTEXT_NEWTUPLE
#define FIELDNO_EXPRCONTEXT_AGGNULLS
#define FIELDNO_EXPRSTATE_RESVALUE
#define FIELDNO_AGGSTATE_CURRENT_SET
#define FIELDNO_EXPRCONTEXT_AGGVALUES
#define FIELDNO_EXPRCONTEXT_OUTERTUPLE
#define FIELDNO_AGGSTATE_ALL_PERGROUPS
#define FIELDNO_EXPRSTATE_PARENT
#define FIELDNO_EXPRCONTEXT_SCANTUPLE
#define FIELDNO_AGGSTATE_CURAGGCONTEXT
Datum(* ExprStateEvalFunc)(struct ExprState *expression, struct ExprContext *econtext, bool *isNull)
#define FIELDNO_FUNCTIONCALLINFODATA_ISNULL
Assert(PointerIsAligned(start, uint64))
#define INSTR_TIME_SET_CURRENT(t)
#define INSTR_TIME_ACCUM_DIFF(x, y, z)
LLVMTypeRef StructFunctionCallInfoData
LLVMJitContext * llvm_create_context(int jitFlags)
LLVMTypeRef StructExprState
LLVMTypeRef StructExprEvalStep
LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname)
LLVMTypeRef TypeParamBool
LLVMTypeRef StructMemoryContextData
LLVMTypeRef StructAggStatePerGroupData
LLVMTypeRef llvm_pg_var_type(const char *varname)
LLVMValueRef llvm_function_reference(LLVMJitContext *context, LLVMBuilderRef builder, LLVMModuleRef mod, FunctionCallInfo fcinfo)
char * llvm_expand_funcname(struct LLVMJitContext *context, const char *basename)
LLVMTypeRef llvm_pg_var_func_type(const char *varname)
LLVMTypeRef StructTupleTableSlot
LLVMTypeRef TypeStorageBool
LLVMModuleRef llvm_mutable_module(LLVMJitContext *context)
LLVMTypeRef StructAggState
LLVMValueRef AttributeTemplate
LLVMTypeRef StructExprContext
void * llvm_get_function(LLVMJitContext *context, const char *funcname)
LLVMTypeRef StructNullableDatum
LLVMValueRef ExecEvalSubroutineTemplate
LLVMValueRef ExecEvalBoolSubroutineTemplate
LLVMTypeRef StructAggStatePerTransData
void llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
void llvm_enter_fatal_on_oom(void)
void llvm_leave_fatal_on_oom(void)
static Datum ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define build_EvalXFunc(b, mod, funcname, v_state, op,...)
bool llvm_compile_expr(ExprState *state)
struct CompiledExprState CompiledExprState
static LLVMValueRef build_EvalXFuncInt(LLVMBuilderRef b, LLVMModuleRef mod, const char *funcname, LLVMValueRef v_state, ExprEvalStep *op, int natts, LLVMValueRef *v_args)
static LLVMValueRef create_LifetimeEnd(LLVMModuleRef mod)
static LLVMValueRef BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMModuleRef mod, FunctionCallInfo fcinfo, LLVMValueRef *v_fcinfo_isnull)
LLVMTypeRef LLVMGetFunctionType(LLVMValueRef r)
void pfree(void *pointer)
void * palloc0(Size size)
#define FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUE
#define FIELDNO_AGGSTATEPERGROUPDATA_TRANSVALUEISNULL
#define FIELDNO_AGGSTATEPERGROUPDATA_NOTRANSVALUE
#define castNode(_type_, nodeptr)
#define FIELDNO_NULLABLE_DATUM_ISNULL
FunctionCallInfo transfn_fcinfo
struct JitContext * es_jit
MemoryContext ecxt_per_tuple_memory
struct ExprEvalStep::@55::@66 jump
WindowFuncExprState * wfstate
ExecEvalBoolSubroutine subscriptfunc
struct ExprEvalStep::@55::@60 assign_tmp
struct ExprEvalStep::@55::@71 make_readonly
struct ExprEvalStep::@55::@57 var
AggStatePerTrans pertrans
struct ExprEvalStep::@55::@78 rowcompare_step
struct ExprEvalStep::@55::@83 sbsref_subscript
struct JsonExprState * jsestate
struct ExprEvalStep::@55::@84 sbsref
struct ExprEvalStep::@55::@69 cparam
ExecEvalSubroutine paramfunc
FunctionCallInfo fcinfo_data_in
struct ExprEvalStep::@55::@103 jsonexpr
struct ExprEvalStep::@55::@86 hashdatum_initvalue
const TupleTableSlotOps * kind
struct ExprEvalStep::@55::@99 agg_plain_pergroup_nullcheck
struct ExprEvalStep::@55::@62 constval
FunctionCallInfo fcinfo_data
struct ExprEvalStep::@55::@93 aggref
struct ExprEvalStep::@55::@97 agg_deserialize
struct ExprEvalStep::@55::@95 window_func
struct ExprEvalStep::@55::@61 returningexpr
struct ExprEvalStep::@55::@72 iocoerce
union ExprEvalStep::@55 d
struct ExprEvalStep::@55::@98 agg_strict_input_check
struct ExprEvalStep::@55::@79 rowcompare_final
struct ExprEvalStep::@55::@70 casetest
struct ExprEvalStep::@55::@100 agg_presorted_distinctcheck
struct ExprEvalStep::@55::@65 qualexpr
struct ExprEvalStep::@55::@101 agg_trans
FunctionCallInfo fcinfo_data_out
struct ExprEvalStep::@55::@87 hashdatum
struct ExprEvalStep::@55::@63 func
struct ExprEvalStep::@55::@64 boolexpr
struct ExprEvalStep::@55::@56 fetch
struct ExprEvalStep::@55::@59 assign_var
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
static void * fn(void *arg)
#define FIELDNO_TUPLETABLESLOT_ISNULL
#define FIELDNO_TUPLETABLESLOT_VALUES
#define FIELDNO_TUPLETABLESLOT_NVALID