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);
346 LLVMBasicBlockRef b_fetch;
347 LLVMValueRef v_nvalid;
348 LLVMValueRef l_jit_deform = NULL;
351 b_fetch = l_bb_before_v(opblocks[opno + 1],
352 "op.%d.fetch", opno);
364 v_slot = v_innerslot;
366 v_slot = v_outerslot;
385 LLVMBuildICmp(
b, LLVMIntUGE, v_nvalid,
388 opblocks[opno + 1], b_fetch);
390 LLVMPositionBuilderAtEnd(
b, b_fetch);
398 if (tts_ops && desc && (context->base.flags &
PGJIT_DEFORM))
407 deform_endtime, deform_starttime);
412 LLVMValueRef params[1];
423 LLVMValueRef params[2];
434 LLVMBuildBr(
b, opblocks[opno + 1]);
446 LLVMValueRef v_attnum;
447 LLVMValueRef v_values;
448 LLVMValueRef v_nulls;
452 v_values = v_innervalues;
453 v_nulls = v_innernulls;
457 v_values = v_outervalues;
458 v_nulls = v_outernulls;
462 v_values = v_scanvalues;
463 v_nulls = v_scannulls;
467 v_values = v_oldvalues;
468 v_nulls = v_oldnulls;
472 v_values = v_newvalues;
473 v_nulls = v_newnulls;
476 v_attnum = l_int32_const(lc, op->
d.
var.
attnum);
479 LLVMBuildStore(
b,
value, v_resvaluep);
480 LLVMBuildStore(
b, isnull, v_resnullp);
482 LLVMBuildBr(
b, opblocks[opno + 1]);
495 v_slot = v_innerslot;
497 v_slot = v_outerslot;
506 v_state, op, v_econtext, v_slot);
508 LLVMBuildBr(
b, opblocks[opno + 1]);
514 v_state, op, v_econtext);
515 LLVMBuildBr(
b, opblocks[opno + 1]);
524 LLVMValueRef v_value;
525 LLVMValueRef v_isnull;
526 LLVMValueRef v_rvaluep;
527 LLVMValueRef v_risnullp;
528 LLVMValueRef v_attnum;
529 LLVMValueRef v_resultnum;
530 LLVMValueRef v_values;
531 LLVMValueRef v_nulls;
535 v_values = v_innervalues;
536 v_nulls = v_innernulls;
540 v_values = v_outervalues;
541 v_nulls = v_outernulls;
545 v_values = v_scanvalues;
546 v_nulls = v_scannulls;
550 v_values = v_oldvalues;
551 v_nulls = v_oldnulls;
555 v_values = v_newvalues;
556 v_nulls = v_newnulls;
561 v_value = l_load_gep1(
b,
TypeSizeT, v_values, v_attnum,
"");
569 &v_resultnum, 1,
"");
570 v_risnullp = l_gep(
b,
573 &v_resultnum, 1,
"");
576 LLVMBuildStore(
b, v_value, v_rvaluep);
577 LLVMBuildStore(
b, v_isnull, v_risnullp);
579 LLVMBuildBr(
b, opblocks[opno + 1]);
586 LLVMValueRef v_value,
588 LLVMValueRef v_rvaluep,
590 LLVMValueRef v_resultnum;
594 v_value = l_load(
b,
TypeSizeT, v_tmpvaluep,
"");
598 v_resultnum = l_int32_const(lc, resultnum);
600 l_gep(
b,
TypeSizeT, v_resultvalues, &v_resultnum, 1,
"");
605 LLVMBuildStore(
b, v_isnull, v_risnullp);
610 LLVMBasicBlockRef b_notnull;
611 LLVMValueRef v_params[1];
613 b_notnull = l_bb_before_v(opblocks[opno + 1],
614 "op.%d.assign_tmp.notnull", opno);
618 LLVMBuildICmp(
b, LLVMIntEQ, v_isnull,
619 l_sbool_const(0),
""),
620 b_notnull, opblocks[opno + 1]);
623 LLVMPositionBuilderAtEnd(
b, b_notnull);
624 v_params[0] = v_value;
628 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
638 LLVMBuildStore(
b, v_value, v_rvaluep);
640 LLVMBuildBr(
b, opblocks[opno + 1]);
646 LLVMValueRef v_constvalue,
652 LLVMBuildStore(
b, v_constvalue, v_resvaluep);
653 LLVMBuildStore(
b, v_constnull, v_resnullp);
655 LLVMBuildBr(
b, opblocks[opno + 1]);
663 LLVMValueRef v_fcinfo_isnull;
664 LLVMValueRef v_retval;
668 LLVMBasicBlockRef b_nonull;
669 LLVMBasicBlockRef *b_checkargnulls;
670 LLVMValueRef v_fcinfo;
676 b_nonull = l_bb_before_v(opblocks[opno + 1],
677 "b.%d.no-null-args", opno);
681 elog(
ERROR,
"argumentless strict functions are pointless");
690 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
695 for (
int argno = 0; argno < op->
d.
func.
nargs; argno++)
696 b_checkargnulls[argno] =
697 l_bb_before_v(b_nonull,
"b.%d.isnull.%d", opno,
701 LLVMBuildBr(
b, b_checkargnulls[0]);
704 for (
int argno = 0; argno < op->
d.
func.
nargs; argno++)
706 LLVMValueRef v_argisnull;
707 LLVMBasicBlockRef b_argnotnull;
709 LLVMPositionBuilderAtEnd(
b, b_checkargnulls[argno]);
716 b_argnotnull = b_nonull;
718 b_argnotnull = b_checkargnulls[argno + 1];
721 v_argisnull = l_funcnull(
b, v_fcinfo, argno);
723 LLVMBuildICmp(
b, LLVMIntEQ,
731 LLVMPositionBuilderAtEnd(
b, b_nonull);
736 LLVMBuildStore(
b, v_retval, v_resvaluep);
737 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
739 LLVMBuildBr(
b, opblocks[opno + 1]);
745 v_state, op, v_econtext);
746 LLVMBuildBr(
b, opblocks[opno + 1]);
752 v_state, op, v_econtext);
753 LLVMBuildBr(
b, opblocks[opno + 1]);
765 LLVMValueRef v_boolvalue;
766 LLVMValueRef v_boolnull;
767 LLVMValueRef v_boolanynullp,
769 LLVMBasicBlockRef b_boolisnull;
770 LLVMBasicBlockRef b_boolcheckfalse;
771 LLVMBasicBlockRef b_boolisfalse;
772 LLVMBasicBlockRef b_boolcont;
773 LLVMBasicBlockRef b_boolisanynull;
775 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
776 "b.%d.boolisnull", opno);
777 b_boolcheckfalse = l_bb_before_v(opblocks[opno + 1],
778 "b.%d.boolcheckfalse", opno);
779 b_boolisfalse = l_bb_before_v(opblocks[opno + 1],
780 "b.%d.boolisfalse", opno);
781 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
782 "b.%d.boolisanynull", opno);
783 b_boolcont = l_bb_before_v(opblocks[opno + 1],
784 "b.%d.boolcont", opno);
790 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
793 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
797 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
798 l_sbool_const(1),
""),
803 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
805 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
807 LLVMBuildBr(
b, b_boolcont);
810 LLVMPositionBuilderAtEnd(
b, b_boolcheckfalse);
812 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
813 l_sizet_const(0),
""),
821 LLVMPositionBuilderAtEnd(
b, b_boolisfalse);
827 LLVMPositionBuilderAtEnd(
b, b_boolcont);
833 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
834 l_sbool_const(0),
""),
835 opblocks[opno + 1], b_boolisanynull);
837 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
839 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
841 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
843 LLVMBuildBr(
b, opblocks[opno + 1]);
856 LLVMValueRef v_boolvalue;
857 LLVMValueRef v_boolnull;
858 LLVMValueRef v_boolanynullp,
861 LLVMBasicBlockRef b_boolisnull;
862 LLVMBasicBlockRef b_boolchecktrue;
863 LLVMBasicBlockRef b_boolistrue;
864 LLVMBasicBlockRef b_boolcont;
865 LLVMBasicBlockRef b_boolisanynull;
867 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
868 "b.%d.boolisnull", opno);
869 b_boolchecktrue = l_bb_before_v(opblocks[opno + 1],
870 "b.%d.boolchecktrue", opno);
871 b_boolistrue = l_bb_before_v(opblocks[opno + 1],
872 "b.%d.boolistrue", opno);
873 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
874 "b.%d.boolisanynull", opno);
875 b_boolcont = l_bb_before_v(opblocks[opno + 1],
876 "b.%d.boolcont", opno);
882 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
884 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
887 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
888 l_sbool_const(1),
""),
893 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
895 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
897 LLVMBuildBr(
b, b_boolcont);
900 LLVMPositionBuilderAtEnd(
b, b_boolchecktrue);
902 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
903 l_sizet_const(1),
""),
911 LLVMPositionBuilderAtEnd(
b, b_boolistrue);
917 LLVMPositionBuilderAtEnd(
b, b_boolcont);
923 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
924 l_sbool_const(0),
""),
925 opblocks[opno + 1], b_boolisanynull);
927 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
929 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
931 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
933 LLVMBuildBr(
b, opblocks[opno + 1]);
939 LLVMValueRef v_boolvalue;
940 LLVMValueRef v_negbool;
943 v_boolvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
944 v_negbool = LLVMBuildZExt(
b,
945 LLVMBuildICmp(
b, LLVMIntEQ,
956 LLVMBuildStore(
b, v_negbool, v_resvaluep);
958 LLVMBuildBr(
b, opblocks[opno + 1]);
964 LLVMValueRef v_resnull;
965 LLVMValueRef v_resvalue;
966 LLVMValueRef v_nullorfalse;
967 LLVMBasicBlockRef b_qualfail;
969 b_qualfail = l_bb_before_v(opblocks[opno + 1],
970 "op.%d.qualfail", opno);
972 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
977 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
978 l_sbool_const(1),
""),
979 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
980 l_sizet_const(0),
""),
989 LLVMPositionBuilderAtEnd(
b, b_qualfail);
991 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
993 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1007 LLVMValueRef v_resnull;
1014 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1015 l_sbool_const(1),
""),
1017 opblocks[opno + 1]);
1023 LLVMValueRef v_resnull;
1030 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1031 l_sbool_const(0),
""),
1033 opblocks[opno + 1]);
1040 LLVMValueRef v_resnull;
1041 LLVMValueRef v_resvalue;
1042 LLVMValueRef v_nullorfalse;
1046 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
1051 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1052 l_sbool_const(1),
""),
1053 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
1054 l_sizet_const(0),
""),
1060 opblocks[opno + 1]);
1067 LLVMValueRef v_resvalue;
1071 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1072 l_sbool_const(1),
""),
1076 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
1077 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1079 LLVMBuildBr(
b, opblocks[opno + 1]);
1086 LLVMValueRef v_resvalue;
1090 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1091 l_sbool_const(1),
""),
1095 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
1096 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1098 LLVMBuildBr(
b, opblocks[opno + 1]);
1104 v_state, op, v_econtext);
1105 LLVMBuildBr(
b, opblocks[opno + 1]);
1110 v_state, op, v_econtext);
1111 LLVMBuildBr(
b, opblocks[opno + 1]);
1119 LLVMBasicBlockRef b_isnull,
1123 b_isnull = l_bb_before_v(opblocks[opno + 1],
1124 "op.%d.isnull", opno);
1125 b_notnull = l_bb_before_v(opblocks[opno + 1],
1126 "op.%d.isnotnull", opno);
1130 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1131 l_sbool_const(1),
""),
1132 b_isnull, b_notnull);
1135 LLVMPositionBuilderAtEnd(
b, b_isnull);
1138 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1143 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1147 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1150 LLVMBuildBr(
b, opblocks[opno + 1]);
1152 LLVMPositionBuilderAtEnd(
b, b_notnull);
1164 LLVMValueRef v_value =
1167 v_value = LLVMBuildZExt(
b,
1168 LLVMBuildICmp(
b, LLVMIntEQ,
1173 LLVMBuildStore(
b, v_value, v_resvaluep);
1175 LLVMBuildBr(
b, opblocks[opno + 1]);
1181 v_state, op, v_econtext);
1182 LLVMBuildBr(
b, opblocks[opno + 1]);
1187 v_state, op, v_econtext);
1188 LLVMBuildBr(
b, opblocks[opno + 1]);
1193 LLVMValueRef v_func;
1194 LLVMValueRef v_params[3];
1199 v_params[0] = v_state;
1201 v_params[2] = v_econtext;
1207 LLVMBuildBr(
b, opblocks[opno + 1]);
1213 v_state, op, v_econtext);
1214 LLVMBuildBr(
b, opblocks[opno + 1]);
1220 LLVMValueRef v_func;
1221 LLVMValueRef v_params[3];
1227 v_params[0] = v_state;
1229 v_params[2] = v_econtext;
1237 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
1238 l_sbool_const(1),
""),
1240 opblocks[jumpdone]);
1248 LLVMValueRef v_func;
1249 LLVMValueRef v_params[3];
1254 v_params[0] = v_state;
1256 v_params[2] = v_econtext;
1262 LLVMBuildBr(
b, opblocks[opno + 1]);
1268 LLVMValueRef v_casevaluep,
1270 LLVMValueRef v_casenullp,
1278 v_casevalue = l_load(
b,
TypeSizeT, v_casevaluep,
"");
1280 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1281 LLVMBuildStore(
b, v_casenull, v_resnullp);
1283 LLVMBuildBr(
b, opblocks[opno + 1]);
1289 LLVMValueRef v_casevalue;
1290 LLVMValueRef v_casenull;
1293 l_load_struct_gep(
b,
1298 l_load_struct_gep(
b,
1302 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1303 LLVMBuildStore(
b, v_casenull, v_resnullp);
1305 LLVMBuildBr(
b, opblocks[opno + 1]);
1311 LLVMBasicBlockRef b_notnull;
1312 LLVMValueRef v_params[1];
1314 LLVMValueRef v_nullp;
1315 LLVMValueRef v_valuep;
1316 LLVMValueRef v_null;
1317 LLVMValueRef v_value;
1319 b_notnull = l_bb_before_v(opblocks[opno + 1],
1320 "op.%d.readonly.notnull", opno);
1328 LLVMBuildStore(
b, v_null, v_resnullp);
1332 LLVMBuildICmp(
b, LLVMIntEQ, v_null,
1333 l_sbool_const(1),
""),
1334 opblocks[opno + 1], b_notnull);
1337 LLVMPositionBuilderAtEnd(
b, b_notnull);
1342 v_value = l_load(
b,
TypeSizeT, v_valuep,
"");
1344 v_params[0] = v_value;
1348 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1350 LLVMBuildStore(
b, v_ret, v_resvaluep);
1352 LLVMBuildBr(
b, opblocks[opno + 1]);
1360 LLVMValueRef v_fn_out,
1362 LLVMValueRef v_fcinfo_out,
1364 LLVMValueRef v_fcinfo_in_isnullp;
1365 LLVMValueRef v_retval;
1366 LLVMValueRef v_resvalue;
1367 LLVMValueRef v_resnull;
1369 LLVMValueRef v_output_skip;
1370 LLVMValueRef v_output;
1372 LLVMBasicBlockRef b_skipoutput;
1373 LLVMBasicBlockRef b_calloutput;
1374 LLVMBasicBlockRef b_input;
1375 LLVMBasicBlockRef b_inputcall;
1380 b_skipoutput = l_bb_before_v(opblocks[opno + 1],
1381 "op.%d.skipoutputnull", opno);
1382 b_calloutput = l_bb_before_v(opblocks[opno + 1],
1383 "op.%d.calloutput", opno);
1384 b_input = l_bb_before_v(opblocks[opno + 1],
1385 "op.%d.input", opno);
1386 b_inputcall = l_bb_before_v(opblocks[opno + 1],
1387 "op.%d.inputcall", opno);
1394 v_fcinfo_in_isnullp =
1399 "v_fcinfo_in_isnull");
1404 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1405 l_sbool_const(1),
""),
1409 LLVMPositionBuilderAtEnd(
b, b_skipoutput);
1410 v_output_skip = l_sizet_const(0);
1411 LLVMBuildBr(
b, b_input);
1413 LLVMPositionBuilderAtEnd(
b, b_calloutput);
1414 v_resvalue = l_load(
b,
TypeSizeT, v_resvaluep,
"");
1419 l_funcvaluep(
b, v_fcinfo_out, 0));
1422 l_funcnullp(
b, v_fcinfo_out, 0));
1424 v_output = l_call(
b,
1426 v_fn_out, &v_fcinfo_out,
1427 1,
"funccall_coerce_out");
1428 LLVMBuildBr(
b, b_input);
1431 LLVMPositionBuilderAtEnd(
b, b_input);
1435 LLVMValueRef incoming_values[2];
1436 LLVMBasicBlockRef incoming_blocks[2];
1438 incoming_values[0] = v_output_skip;
1439 incoming_blocks[0] = b_skipoutput;
1441 incoming_values[1] = v_output;
1442 incoming_blocks[1] = b_calloutput;
1444 v_output = LLVMBuildPhi(
b,
TypeSizeT,
"output");
1445 LLVMAddIncoming(v_output,
1446 incoming_values, incoming_blocks,
1457 LLVMBuildICmp(
b, LLVMIntEQ, v_output,
1458 l_sizet_const(0),
""),
1464 LLVMBuildBr(
b, b_inputcall);
1467 LLVMPositionBuilderAtEnd(
b, b_inputcall);
1470 LLVMBuildStore(
b, v_output,
1471 l_funcvaluep(
b, v_fcinfo_in, 0));
1472 LLVMBuildStore(
b, v_resnull,
1473 l_funcnullp(
b, v_fcinfo_in, 0));
1479 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_in_isnullp);
1481 v_retval = l_call(
b,
1483 v_fn_in, &v_fcinfo_in, 1,
1484 "funccall_iocoerce_in");
1486 LLVMBuildStore(
b, v_retval, v_resvaluep);
1488 LLVMBuildBr(
b, opblocks[opno + 1]);
1495 LLVMBuildBr(
b, opblocks[opno + 1]);
1503 LLVMValueRef v_fcinfo;
1504 LLVMValueRef v_fcinfo_isnull;
1506 LLVMValueRef v_argnull0,
1508 LLVMValueRef v_argnull1,
1511 LLVMValueRef v_anyargisnull;
1512 LLVMValueRef v_bothargisnull;
1514 LLVMValueRef v_result;
1516 LLVMBasicBlockRef b_noargnull;
1517 LLVMBasicBlockRef b_checkbothargnull;
1518 LLVMBasicBlockRef b_bothargnull;
1519 LLVMBasicBlockRef b_anyargnull;
1521 b_noargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.noargnull", opno);
1522 b_checkbothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.checkbothargnull", opno);
1523 b_bothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.bothargnull", opno);
1524 b_anyargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.anyargnull", opno);
1529 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1530 v_argisnull0 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1531 l_sbool_const(1),
"");
1532 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1533 v_argisnull1 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1534 l_sbool_const(1),
"");
1536 v_anyargisnull = LLVMBuildOr(
b, v_argisnull0, v_argisnull1,
"");
1537 v_bothargisnull = LLVMBuildAnd(
b, v_argisnull0, v_argisnull1,
"");
1544 LLVMBuildCondBr(
b, v_anyargisnull, b_checkbothargnull,
1550 LLVMPositionBuilderAtEnd(
b, b_checkbothargnull);
1551 LLVMBuildCondBr(
b, v_bothargisnull, b_bothargnull,
1556 LLVMPositionBuilderAtEnd(
b, b_bothargnull);
1557 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1559 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1561 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1563 LLVMBuildBr(
b, opblocks[opno + 1]);
1566 LLVMPositionBuilderAtEnd(
b, b_anyargnull);
1567 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1569 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1571 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1572 LLVMBuildBr(
b, opblocks[opno + 1]);
1575 LLVMPositionBuilderAtEnd(
b, b_noargnull);
1585 LLVMBuildICmp(
b, LLVMIntEQ,
1587 l_sizet_const(0),
""),
1591 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1592 LLVMBuildStore(
b, v_result, v_resvaluep);
1594 LLVMBuildBr(
b, opblocks[opno + 1]);
1602 LLVMValueRef v_fcinfo;
1603 LLVMValueRef v_fcinfo_isnull;
1604 LLVMValueRef v_argnull0;
1605 LLVMValueRef v_argnull1;
1606 LLVMValueRef v_anyargisnull;
1607 LLVMValueRef v_arg0;
1608 LLVMBasicBlockRef b_hasnull;
1609 LLVMBasicBlockRef b_nonull;
1610 LLVMBasicBlockRef b_argsequal;
1611 LLVMValueRef v_retval;
1612 LLVMValueRef v_argsequal;
1614 b_hasnull = l_bb_before_v(opblocks[opno + 1],
1615 "b.%d.null-args", opno);
1616 b_nonull = l_bb_before_v(opblocks[opno + 1],
1617 "b.%d.no-null-args", opno);
1618 b_argsequal = l_bb_before_v(opblocks[opno + 1],
1619 "b.%d.argsequal", opno);
1624 v_arg0 = l_funcvalue(
b, v_fcinfo, 0);
1627 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1628 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1632 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1633 l_sbool_const(1),
""),
1634 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1635 l_sbool_const(1),
""),
1638 LLVMBuildCondBr(
b, v_anyargisnull, b_hasnull, b_nonull);
1641 LLVMPositionBuilderAtEnd(
b, b_hasnull);
1642 LLVMBuildStore(
b, v_argnull0, v_resnullp);
1643 LLVMBuildStore(
b, v_arg0, v_resvaluep);
1644 LLVMBuildBr(
b, opblocks[opno + 1]);
1647 LLVMPositionBuilderAtEnd(
b, b_nonull);
1659 LLVMValueRef v_params[1];
1660 LLVMValueRef v_arg0_ro;
1662 v_params[0] = v_arg0;
1666 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1668 LLVMBuildStore(
b, v_arg0_ro,
1669 l_funcvaluep(
b, v_fcinfo, 0));
1672 v_retval =
BuildV1Call(context,
b, mod, fcinfo, &v_fcinfo_isnull);
1679 v_argsequal = LLVMBuildAnd(
b,
1680 LLVMBuildICmp(
b, LLVMIntEQ,
1684 LLVMBuildICmp(
b, LLVMIntEQ,
1689 LLVMBuildCondBr(
b, v_argsequal, b_argsequal, b_hasnull);
1692 LLVMPositionBuilderAtEnd(
b, b_argsequal);
1693 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1694 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1696 LLVMBuildBr(
b, opblocks[opno + 1]);
1703 LLVMBuildBr(
b, opblocks[opno + 1]);
1709 LLVMBuildBr(
b, opblocks[opno + 1]);
1715 LLVMBuildBr(
b, opblocks[opno + 1]);
1720 LLVMBasicBlockRef b_isnull;
1721 LLVMValueRef v_flagsp;
1722 LLVMValueRef v_flags;
1723 LLVMValueRef v_nullflag;
1725 b_isnull = l_bb_before_v(opblocks[opno + 1],
1726 "op.%d.row.isnull", opno);
1732 v_flagsp = l_struct_gep(
b,
1742 LLVMBuildICmp(
b, LLVMIntEQ,
1743 LLVMBuildAnd(
b, v_flags,
1745 l_sbool_const(0),
""),
1746 opblocks[opno + 1], b_isnull);
1748 LLVMPositionBuilderAtEnd(
b, b_isnull);
1750 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1751 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1760 LLVMBuildBr(
b, opblocks[opno + 1]);
1765 v_state, op, v_econtext);
1766 LLVMBuildBr(
b, opblocks[opno + 1]);
1772 LLVMBuildBr(
b, opblocks[opno + 1]);
1778 LLVMValueRef v_fcinfo_isnull;
1779 LLVMBasicBlockRef b_null;
1780 LLVMBasicBlockRef b_compare;
1781 LLVMBasicBlockRef b_compare_result;
1783 LLVMValueRef v_retval;
1785 b_null = l_bb_before_v(opblocks[opno + 1],
1786 "op.%d.row-null", opno);
1787 b_compare = l_bb_before_v(opblocks[opno + 1],
1788 "op.%d.row-compare", opno);
1790 l_bb_before_v(opblocks[opno + 1],
1791 "op.%d.row-compare-result",
1800 LLVMValueRef v_fcinfo;
1801 LLVMValueRef v_argnull0;
1802 LLVMValueRef v_argnull1;
1803 LLVMValueRef v_anyargisnull;
1805 v_fcinfo = l_ptr_const(fcinfo,
1808 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1809 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1818 LLVMBuildICmp(
b, LLVMIntEQ,
1820 l_sbool_const(1),
""),
1823 LLVMBuildCondBr(
b, v_anyargisnull, b_null, b_compare);
1827 LLVMBuildBr(
b, b_compare);
1831 LLVMPositionBuilderAtEnd(
b, b_compare);
1836 LLVMBuildStore(
b, v_retval, v_resvaluep);
1849 LLVMPositionBuilderAtEnd(
b, b_compare_result);
1856 l_sizet_const(0),
""),
1864 LLVMPositionBuilderAtEnd(
b, b_null);
1865 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1875 LLVMValueRef v_cmpresult;
1876 LLVMValueRef v_result;
1877 LLVMIntPredicate predicate;
1887 LLVMInt32TypeInContext(lc),
"");
1892 predicate = LLVMIntSLT;
1895 predicate = LLVMIntSLE;
1898 predicate = LLVMIntSGT;
1901 predicate = LLVMIntSGE;
1910 v_result = LLVMBuildICmp(
b,
1913 l_int32_const(lc, 0),
1915 v_result = LLVMBuildZExt(
b, v_result,
TypeSizeT,
"");
1917 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1918 LLVMBuildStore(
b, v_result, v_resvaluep);
1920 LLVMBuildBr(
b, opblocks[opno + 1]);
1927 LLVMBuildBr(
b, opblocks[opno + 1]);
1932 v_state, op, v_econtext);
1933 LLVMBuildBr(
b, opblocks[opno + 1]);
1938 v_state, op, v_econtext);
1939 LLVMBuildBr(
b, opblocks[opno + 1]);
1944 v_state, op, v_econtext);
1945 LLVMBuildBr(
b, opblocks[opno + 1]);
1950 LLVMValueRef v_casevaluep,
1952 LLVMValueRef v_casenullp,
1960 v_casevalue = l_load(
b,
TypeSizeT, v_casevaluep,
"");
1962 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1963 LLVMBuildStore(
b, v_casenull, v_resnullp);
1965 LLVMBuildBr(
b, opblocks[opno + 1]);
1971 LLVMValueRef v_casevalue;
1972 LLVMValueRef v_casenull;
1975 l_load_struct_gep(
b,
1981 l_load_struct_gep(
b,
1986 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1987 LLVMBuildStore(
b, v_casenull, v_resnullp);
1989 LLVMBuildBr(
b, opblocks[opno + 1]);
1996 LLVMBuildBr(
b, opblocks[opno + 1]);
2002 LLVMBuildBr(
b, opblocks[opno + 1]);
2007 LLVMValueRef v_initvalue;
2011 LLVMBuildStore(
b, v_initvalue, v_resvaluep);
2012 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2013 LLVMBuildBr(
b, opblocks[opno + 1]);
2023 LLVMValueRef v_fcinfo;
2024 LLVMValueRef v_fcinfo_isnull;
2025 LLVMValueRef v_retval;
2026 LLVMBasicBlockRef b_checkargnull;
2027 LLVMBasicBlockRef b_ifnotnull;
2028 LLVMBasicBlockRef b_ifnullblock;
2029 LLVMValueRef v_argisnull;
2030 LLVMValueRef v_prevhash = NULL;
2043 LLVMValueRef v_tmp1;
2044 LLVMValueRef v_tmp2;
2054 v_prevhash = l_load(
b,
TypeSizeT, tmp,
"prevhash");
2060 v_tmp1 = LLVMBuildShl(
b, v_prevhash, l_sizet_const(1),
2062 v_tmp1 = LLVMBuildAnd(
b, v_tmp1,
2063 l_sizet_const(0xffffffff),
"");
2064 v_tmp2 = LLVMBuildLShr(
b, v_prevhash,
2065 l_sizet_const(31),
"");
2066 v_prevhash = LLVMBuildOr(
b, v_tmp1, v_tmp2,
2074 b_ifnotnull = l_bb_before_v(opblocks[opno + 1],
2079 if (fcinfo->
nargs != 1)
2080 elog(
ERROR,
"incorrect number of function arguments");
2082 v_fcinfo = l_ptr_const(fcinfo,
2085 b_checkargnull = l_bb_before_v(b_ifnotnull,
2086 "b.%d.isnull.0", opno);
2088 LLVMBuildBr(
b, b_checkargnull);
2097 b_ifnullblock = l_bb_before_v(b_ifnotnull,
2101 LLVMPositionBuilderAtEnd(
b, b_ifnullblock);
2107 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
2108 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
2113 b_ifnullblock = l_bb_before_v(b_ifnotnull,
2117 LLVMPositionBuilderAtEnd(
b, b_ifnullblock);
2120 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2124 Assert(v_prevhash != NULL);
2130 LLVMBuildStore(
b, v_prevhash, v_resvaluep);
2140 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
2143 LLVMBuildBr(
b, opblocks[opno + 1]);
2146 LLVMPositionBuilderAtEnd(
b, b_checkargnull);
2149 v_argisnull = l_funcnull(
b, v_fcinfo, 0);
2159 LLVMPositionBuilderAtEnd(
b, b_ifnotnull);
2168 LLVMValueRef v_tmp1;
2169 LLVMValueRef v_tmp2;
2179 v_prevhash = l_load(
b,
TypeSizeT, tmp,
"prevhash");
2185 v_tmp1 = LLVMBuildShl(
b, v_prevhash, l_sizet_const(1),
2187 v_tmp1 = LLVMBuildAnd(
b, v_tmp1,
2188 l_sizet_const(0xffffffff),
"");
2189 v_tmp2 = LLVMBuildLShr(
b, v_prevhash,
2190 l_sizet_const(31),
"");
2191 v_prevhash = LLVMBuildOr(
b, v_tmp1, v_tmp2,
2205 v_retval = LLVMBuildXor(
b, v_prevhash, v_retval,
2208 LLVMBuildStore(
b, v_retval, v_resvaluep);
2209 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
2211 LLVMBuildBr(
b, opblocks[opno + 1]);
2217 v_state, op, v_econtext);
2218 LLVMBuildBr(
b, opblocks[opno + 1]);
2224 LLVMBuildBr(
b, opblocks[opno + 1]);
2229 v_state, op, v_econtext);
2230 LLVMBuildBr(
b, opblocks[opno + 1]);
2236 LLVMBuildBr(
b, opblocks[opno + 1]);
2241 v_state, op, v_econtext);
2242 LLVMBuildBr(
b, opblocks[opno + 1]);
2248 LLVMBuildBr(
b, opblocks[opno + 1]);
2261 v_state, op, v_econtext);
2273 LLVMValueRef v_jump_empty;
2274 LLVMValueRef v_jump_error;
2275 LLVMValueRef v_jump_coercion;
2276 LLVMValueRef v_switch;
2277 LLVMBasicBlockRef b_done,
2283 l_bb_before_v(opblocks[opno + 1],
2284 "op.%d.jsonexpr_empty", opno);
2286 l_bb_before_v(opblocks[opno + 1],
2287 "op.%d.jsonexpr_error", opno);
2289 l_bb_before_v(opblocks[opno + 1],
2290 "op.%d.jsonexpr_coercion", opno);
2292 l_bb_before_v(opblocks[opno + 1],
2293 "op.%d.jsonexpr_done", opno);
2295 v_switch = LLVMBuildSwitch(
b,
2302 v_jump_empty = l_int32_const(lc, jsestate->
jump_empty);
2303 LLVMAddCase(v_switch, v_jump_empty, b_empty);
2306 LLVMPositionBuilderAtEnd(
b, b_empty);
2310 LLVMBuildUnreachable(
b);
2315 v_jump_error = l_int32_const(lc, jsestate->
jump_error);
2316 LLVMAddCase(v_switch, v_jump_error, b_error);
2319 LLVMPositionBuilderAtEnd(
b, b_error);
2323 LLVMBuildUnreachable(
b);
2329 LLVMAddCase(v_switch, v_jump_coercion, b_coercion);
2332 LLVMPositionBuilderAtEnd(
b, b_coercion);
2336 LLVMBuildUnreachable(
b);
2338 LLVMPositionBuilderAtEnd(
b, b_done);
2341 LLVMBuildBr(
b, opblocks[jsestate->
jump_end]);
2347 v_state, op, v_econtext);
2349 LLVMBuildBr(
b, opblocks[opno + 1]);
2356 LLVMBuildBr(
b, opblocks[opno + 1]);
2361 LLVMValueRef v_aggno;
2372 LLVMBuildStore(
b,
value, v_resvaluep);
2373 LLVMBuildStore(
b, isnull, v_resnullp);
2375 LLVMBuildBr(
b, opblocks[opno + 1]);
2382 LLVMBuildBr(
b, opblocks[opno + 1]);
2388 LLVMValueRef v_wfuncnop;
2389 LLVMValueRef v_wfuncno;
2398 v_wfuncnop = l_ptr_const(&wfunc->
wfuncno,
2399 l_ptr(LLVMInt32TypeInContext(lc)));
2400 v_wfuncno = l_load(
b, LLVMInt32TypeInContext(lc), v_wfuncnop,
"v_wfuncno");
2408 LLVMBuildStore(
b,
value, v_resvaluep);
2409 LLVMBuildStore(
b, isnull, v_resnullp);
2411 LLVMBuildBr(
b, opblocks[opno + 1]);
2417 v_state, op, v_econtext);
2418 LLVMBuildBr(
b, opblocks[opno + 1]);
2423 v_state, op, v_econtext);
2424 LLVMBuildBr(
b, opblocks[opno + 1]);
2433 LLVMValueRef v_retval;
2434 LLVMValueRef v_fcinfo_isnull;
2435 LLVMValueRef v_tmpcontext;
2436 LLVMValueRef v_oldcontext;
2440 LLVMValueRef v_fcinfo;
2441 LLVMValueRef v_argnull0;
2442 LLVMBasicBlockRef b_deserialize;
2444 b_deserialize = l_bb_before_v(opblocks[opno + 1],
2445 "op.%d.deserialize", opno);
2447 v_fcinfo = l_ptr_const(fcinfo,
2449 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
2459 LLVMPositionBuilderAtEnd(
b, b_deserialize);
2468 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2471 l_mcxt_switch(mod,
b, v_oldcontext);
2473 LLVMBuildStore(
b, v_retval, v_resvaluep);
2474 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
2476 LLVMBuildBr(
b, opblocks[opno + 1]);
2488 LLVMValueRef v_argsp;
2489 LLVMValueRef v_nullsp;
2490 LLVMBasicBlockRef *b_checknulls;
2499 b_checknulls =
palloc(
sizeof(LLVMBasicBlockRef *) * nargs);
2500 for (
int argno = 0; argno < nargs; argno++)
2502 b_checknulls[argno] =
2503 l_bb_before_v(opblocks[opno + 1],
2504 "op.%d.check-null.%d",
2508 LLVMBuildBr(
b, b_checknulls[0]);
2511 for (
int argno = 0; argno < nargs; argno++)
2513 LLVMValueRef v_argno = l_int32_const(lc, argno);
2514 LLVMValueRef v_argisnull;
2515 LLVMBasicBlockRef b_argnotnull;
2517 LLVMPositionBuilderAtEnd(
b, b_checknulls[argno]);
2519 if (argno + 1 == nargs)
2520 b_argnotnull = opblocks[opno + 1];
2522 b_argnotnull = b_checknulls[argno + 1];
2528 LLVMValueRef v_argn;
2541 l_sbool_const(1),
""),
2552 LLVMValueRef v_aggstatep;
2553 LLVMValueRef v_allpergroupsp;
2554 LLVMValueRef v_pergroup_allaggs;
2555 LLVMValueRef v_setoff;
2563 v_aggstatep = LLVMBuildBitCast(
b, v_parent,
2566 v_allpergroupsp = l_load_struct_gep(
b,
2570 "aggstate.all_pergroups");
2575 v_allpergroupsp, v_setoff,
"");
2578 LLVMBuildICmp(
b, LLVMIntEQ,
2579 LLVMBuildPtrToInt(
b, v_pergroup_allaggs,
TypeSizeT,
""),
2580 l_sizet_const(0),
""),
2582 opblocks[opno + 1]);
2597 LLVMValueRef v_aggstatep;
2598 LLVMValueRef v_fcinfo;
2599 LLVMValueRef v_fcinfo_isnull;
2601 LLVMValueRef v_transvaluep;
2602 LLVMValueRef v_transnullp;
2604 LLVMValueRef v_setoff;
2605 LLVMValueRef v_transno;
2607 LLVMValueRef v_aggcontext;
2609 LLVMValueRef v_allpergroupsp;
2610 LLVMValueRef v_current_setp;
2611 LLVMValueRef v_current_pertransp;
2612 LLVMValueRef v_curaggcontext;
2614 LLVMValueRef v_pertransp;
2616 LLVMValueRef v_pergroupp;
2618 LLVMValueRef v_retval;
2620 LLVMValueRef v_tmpcontext;
2621 LLVMValueRef v_oldcontext;
2630 v_pertransp = l_ptr_const(pertrans,
2638 l_load_struct_gep(
b,
2642 "aggstate.all_pergroups");
2649 v_allpergroupsp, v_setoff,
""),
2656 LLVMValueRef v_notransvalue;
2657 LLVMBasicBlockRef b_init;
2658 LLVMBasicBlockRef b_no_init;
2661 l_load_struct_gep(
b,
2667 b_init = l_bb_before_v(opblocks[opno + 1],
2668 "op.%d.inittrans", opno);
2669 b_no_init = l_bb_before_v(opblocks[opno + 1],
2670 "op.%d.no_inittrans", opno);
2673 LLVMBuildICmp(
b, LLVMIntEQ, v_notransvalue,
2674 l_sbool_const(1),
""),
2680 LLVMValueRef params[4];
2682 LLVMPositionBuilderAtEnd(
b, b_init);
2687 params[0] = v_aggstatep;
2688 params[1] = v_pertransp;
2689 params[2] = v_pergroupp;
2690 params[3] = v_aggcontext;
2698 LLVMBuildBr(
b, opblocks[opno + 1]);
2701 LLVMPositionBuilderAtEnd(
b, b_no_init);
2709 LLVMValueRef v_transnull;
2710 LLVMBasicBlockRef b_strictpass;
2712 b_strictpass = l_bb_before_v(opblocks[opno + 1],
2713 "op.%d.strictpass", opno);
2715 l_load_struct_gep(
b,
2722 LLVMBuildICmp(
b, LLVMIntEQ, v_transnull,
2723 l_sbool_const(1),
""),
2727 LLVMPositionBuilderAtEnd(
b, b_strictpass);
2731 v_fcinfo = l_ptr_const(fcinfo,
2741 "aggstate.current_set");
2747 "aggstate.curaggcontext");
2748 v_current_pertransp =
2753 "aggstate.curpertrans");
2756 LLVMBuildStore(
b, v_aggcontext, v_curaggcontext);
2759 LLVMBuildStore(
b, v_pertransp, v_current_pertransp);
2765 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2785 l_funcvaluep(
b, v_fcinfo, 0));
2788 l_funcnullp(
b, v_fcinfo, 0));
2807 LLVMBasicBlockRef b_call;
2808 LLVMBasicBlockRef b_nocall;
2810 LLVMValueRef v_transvalue;
2811 LLVMValueRef v_transnull;
2812 LLVMValueRef v_newval;
2813 LLVMValueRef params[6];
2815 b_call = l_bb_before_v(opblocks[opno + 1],
2816 "op.%d.transcall", opno);
2817 b_nocall = l_bb_before_v(opblocks[opno + 1],
2818 "op.%d.transnocall", opno);
2820 v_transvalue = l_load(
b,
TypeSizeT, v_transvaluep,
"");
2828 LLVMBuildICmp(
b, LLVMIntEQ,
2834 LLVMPositionBuilderAtEnd(
b, b_call);
2836 params[0] = v_aggstatep;
2837 params[1] = v_pertransp;
2838 params[2] = v_retval;
2839 params[3] = LLVMBuildTrunc(
b, v_fcinfo_isnull,
2841 params[4] = v_transvalue;
2842 params[5] = LLVMBuildTrunc(
b, v_transnull,
2854 LLVMBuildStore(
b, v_newval, v_transvaluep);
2855 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2857 l_mcxt_switch(mod,
b, v_oldcontext);
2858 LLVMBuildBr(
b, opblocks[opno + 1]);
2861 LLVMPositionBuilderAtEnd(
b, b_nocall);
2865 LLVMBuildStore(
b, v_retval, v_transvaluep);
2866 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2868 l_mcxt_switch(mod,
b, v_oldcontext);
2870 LLVMBuildBr(
b, opblocks[opno + 1]);
2880 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctSingle");
2881 LLVMValueRef v_args[2];
2891 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2892 l_sbool_const(1),
""),
2894 opblocks[jumpdistinct]);
2904 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctMulti");
2905 LLVMValueRef v_args[2];
2915 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2916 l_sbool_const(1),
""),
2918 opblocks[jumpdistinct]);
2924 v_state, op, v_econtext);
2925 LLVMBuildBr(
b, opblocks[opno + 1]);
2930 v_state, op, v_econtext);
2931 LLVMBuildBr(
b, opblocks[opno + 1]);
2940 LLVMDisposeBuilder(
b);
2956 state->evalfunc_private = cstate;
2963 endtime, starttime);
2991 state->evalfunc = func;
2993 return func(
state, econtext, isNull);
2999 LLVMValueRef *v_fcinfo_isnull)
3003 LLVMValueRef v_fcinfo_isnullp;
3004 LLVMValueRef v_retval;
3005 LLVMValueRef v_fcinfo;
3007 lc = LLVMGetModuleContext(mod);
3012 v_fcinfo_isnullp = l_struct_gep(
b,
3017 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_isnullp);
3021 if (v_fcinfo_isnull)
3030 LLVMValueRef params[2];
3033 params[1] = l_ptr_const(fcinfo->
args, l_ptr(LLVMInt8TypeInContext(lc)));
3036 params[0] = l_int64_const(lc,
sizeof(fcinfo->
isnull));
3037 params[1] = l_ptr_const(&fcinfo->
isnull, l_ptr(LLVMInt8TypeInContext(lc)));
3050 int nargs, LLVMValueRef *v_args)
3053 LLVMValueRef *params;
3058 if (LLVMCountParams(v_fn) != (nargs + 2))
3059 elog(
ERROR,
"parameter mismatch: %s expects %d passed %d",
3060 funcname, LLVMCountParams(v_fn), nargs + 2);
3062 params =
palloc(
sizeof(LLVMValueRef) * (2 + nargs));
3064 params[argno++] = v_state;
3067 for (
int i = 0;
i < nargs;
i++)
3068 params[argno++] = v_args[
i];
3082 LLVMTypeRef param_types[2];
3086 const char *nm =
"llvm.lifetime.end.p0";
3088 fn = LLVMGetNamedFunction(mod, nm);
3092 lc = LLVMGetModuleContext(mod);
3093 param_types[0] = LLVMInt64TypeInContext(lc);
3094 param_types[1] = l_ptr(LLVMInt8TypeInContext(lc));
3096 sig = LLVMFunctionType(LLVMVoidTypeInContext(lc), param_types,
3098 fn = LLVMAddFunction(mod, nm,
sig);
3100 LLVMSetFunctionCallConv(
fn, LLVMCCallConv);
#define Assert(condition)
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
@ 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
#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