18 #include <llvm-c/Core.h>
19 #include <llvm-c/Target.h>
57 static 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;
88 LLVMBasicBlockRef entry;
89 LLVMBasicBlockRef *opblocks;
93 LLVMValueRef v_econtext;
94 LLVMValueRef v_parent;
97 LLVMValueRef v_isnullp;
100 LLVMValueRef v_tmpvaluep;
101 LLVMValueRef v_tmpisnullp;
104 LLVMValueRef v_innerslot;
105 LLVMValueRef v_outerslot;
106 LLVMValueRef v_scanslot;
107 LLVMValueRef v_resultslot;
110 LLVMValueRef v_innervalues;
111 LLVMValueRef v_innernulls;
112 LLVMValueRef v_outervalues;
113 LLVMValueRef v_outernulls;
114 LLVMValueRef v_scanvalues;
115 LLVMValueRef v_scannulls;
116 LLVMValueRef v_resultvalues;
117 LLVMValueRef v_resultnulls;
120 LLVMValueRef v_aggvalues;
121 LLVMValueRef v_aggnulls;
138 context = (LLVMJitContext *) parent->
state->
es_jit;
149 b = LLVMCreateBuilder();
154 eval_fn = LLVMAddFunction(mod,
funcname,
156 LLVMSetLinkage(eval_fn, LLVMExternalLinkage);
157 LLVMSetVisibility(eval_fn, LLVMDefaultVisibility);
160 entry = LLVMAppendBasicBlock(eval_fn,
"entry");
163 v_state = LLVMGetParam(eval_fn, 0);
164 v_econtext = LLVMGetParam(eval_fn, 1);
165 v_isnullp = LLVMGetParam(eval_fn, 2);
167 LLVMPositionBuilderAtEnd(
b, entry);
169 v_tmpvaluep = LLVMBuildStructGEP(
b, v_state,
172 v_tmpisnullp = LLVMBuildStructGEP(
b, v_state,
175 v_parent = l_load_struct_gep(
b, v_state,
180 v_scanslot = l_load_struct_gep(
b, v_econtext,
183 v_innerslot = l_load_struct_gep(
b, v_econtext,
186 v_outerslot = l_load_struct_gep(
b, v_econtext,
189 v_resultslot = l_load_struct_gep(
b, v_state,
194 v_scanvalues = l_load_struct_gep(
b, v_scanslot,
197 v_scannulls = l_load_struct_gep(
b, v_scanslot,
200 v_innervalues = l_load_struct_gep(
b, v_innerslot,
203 v_innernulls = l_load_struct_gep(
b, v_innerslot,
206 v_outervalues = l_load_struct_gep(
b, v_outerslot,
209 v_outernulls = l_load_struct_gep(
b, v_outerslot,
212 v_resultvalues = l_load_struct_gep(
b, v_resultslot,
215 v_resultnulls = l_load_struct_gep(
b, v_resultslot,
220 v_aggvalues = l_load_struct_gep(
b, v_econtext,
222 "v.econtext.aggvalues");
223 v_aggnulls = l_load_struct_gep(
b, v_econtext,
225 "v.econtext.aggnulls");
228 opblocks =
palloc(
sizeof(LLVMBasicBlockRef) *
state->steps_len);
229 for (
int opno = 0; opno <
state->steps_len; opno++)
230 opblocks[opno] = l_bb_append_v(eval_fn,
"b.op.%d.start", opno);
233 LLVMBuildBr(
b, opblocks[0]);
235 for (
int opno = 0; opno <
state->steps_len; opno++)
239 LLVMValueRef v_resvaluep;
240 LLVMValueRef v_resnullp;
242 LLVMPositionBuilderAtEnd(
b, opblocks[opno]);
244 op = &
state->steps[opno];
254 LLVMValueRef v_tmpisnull;
255 LLVMValueRef v_tmpvalue;
257 v_tmpvalue = LLVMBuildLoad(
b, v_tmpvaluep,
"");
258 v_tmpisnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
260 LLVMBuildStore(
b, v_tmpisnull, v_isnullp);
262 LLVMBuildRet(
b, v_tmpvalue);
272 LLVMBasicBlockRef b_fetch;
273 LLVMValueRef v_nvalid;
274 LLVMValueRef l_jit_deform = NULL;
277 b_fetch = l_bb_before_v(opblocks[opno + 1],
278 "op.%d.fetch", opno);
280 if (op->
d.
fetch.known_desc)
281 desc = op->
d.
fetch.known_desc;
284 tts_ops = op->
d.
fetch.kind;
290 v_slot = v_innerslot;
292 v_slot = v_outerslot;
301 l_load_struct_gep(
b, v_slot,
305 LLVMBuildICmp(
b, LLVMIntUGE, v_nvalid,
306 l_int16_const(op->
d.
fetch.last_var),
308 opblocks[opno + 1], b_fetch);
310 LLVMPositionBuilderAtEnd(
b, b_fetch);
318 if (tts_ops && desc && (context->base.flags &
PGJIT_DEFORM))
327 deform_endtime, deform_starttime);
332 LLVMValueRef params[1];
336 LLVMBuildCall(
b, l_jit_deform,
341 LLVMValueRef params[2];
344 params[1] = l_int32_const(op->
d.
fetch.last_var);
351 LLVMBuildBr(
b, opblocks[opno + 1]);
361 LLVMValueRef v_attnum;
362 LLVMValueRef v_values;
363 LLVMValueRef v_nulls;
367 v_values = v_innervalues;
368 v_nulls = v_innernulls;
372 v_values = v_outervalues;
373 v_nulls = v_outernulls;
377 v_values = v_scanvalues;
378 v_nulls = v_scannulls;
381 v_attnum = l_int32_const(op->
d.
var.attnum);
382 value = l_load_gep1(
b, v_values, v_attnum,
"");
383 isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
384 LLVMBuildStore(
b,
value, v_resvaluep);
385 LLVMBuildStore(
b, isnull, v_resnullp);
387 LLVMBuildBr(
b, opblocks[opno + 1]);
398 v_slot = v_innerslot;
400 v_slot = v_outerslot;
405 v_state, op, v_econtext, v_slot);
407 LLVMBuildBr(
b, opblocks[opno + 1]);
413 v_state, op, v_econtext);
414 LLVMBuildBr(
b, opblocks[opno + 1]);
421 LLVMValueRef v_value;
422 LLVMValueRef v_isnull;
423 LLVMValueRef v_rvaluep;
424 LLVMValueRef v_risnullp;
425 LLVMValueRef v_attnum;
426 LLVMValueRef v_resultnum;
427 LLVMValueRef v_values;
428 LLVMValueRef v_nulls;
432 v_values = v_innervalues;
433 v_nulls = v_innernulls;
437 v_values = v_outervalues;
438 v_nulls = v_outernulls;
442 v_values = v_scanvalues;
443 v_nulls = v_scannulls;
448 v_value = l_load_gep1(
b, v_values, v_attnum,
"");
449 v_isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
452 v_resultnum = l_int32_const(op->
d.
assign_var.resultnum);
453 v_rvaluep = LLVMBuildGEP(
b, v_resultvalues,
454 &v_resultnum, 1,
"");
455 v_risnullp = LLVMBuildGEP(
b, v_resultnulls,
456 &v_resultnum, 1,
"");
459 LLVMBuildStore(
b, v_value, v_rvaluep);
460 LLVMBuildStore(
b, v_isnull, v_risnullp);
462 LLVMBuildBr(
b, opblocks[opno + 1]);
469 LLVMValueRef v_value,
471 LLVMValueRef v_rvaluep,
473 LLVMValueRef v_resultnum;
477 v_value = LLVMBuildLoad(
b, v_tmpvaluep,
"");
478 v_isnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
481 v_resultnum = l_int32_const(resultnum);
483 LLVMBuildGEP(
b, v_resultvalues, &v_resultnum, 1,
"");
485 LLVMBuildGEP(
b, v_resultnulls, &v_resultnum, 1,
"");
488 LLVMBuildStore(
b, v_isnull, v_risnullp);
493 LLVMBasicBlockRef b_notnull;
494 LLVMValueRef v_params[1];
496 b_notnull = l_bb_before_v(opblocks[opno + 1],
497 "op.%d.assign_tmp.notnull", opno);
501 LLVMBuildICmp(
b, LLVMIntEQ, v_isnull,
502 l_sbool_const(0),
""),
503 b_notnull, opblocks[opno + 1]);
506 LLVMPositionBuilderAtEnd(
b, b_notnull);
507 v_params[0] = v_value;
510 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
520 LLVMBuildStore(
b, v_value, v_rvaluep);
522 LLVMBuildBr(
b, opblocks[opno + 1]);
528 LLVMValueRef v_constvalue,
531 v_constvalue = l_sizet_const(op->
d.
constval.value);
532 v_constnull = l_sbool_const(op->
d.
constval.isnull);
534 LLVMBuildStore(
b, v_constvalue, v_resvaluep);
535 LLVMBuildStore(
b, v_constnull, v_resnullp);
537 LLVMBuildBr(
b, opblocks[opno + 1]);
545 LLVMValueRef v_fcinfo_isnull;
546 LLVMValueRef v_retval;
550 LLVMBasicBlockRef b_nonull;
551 LLVMBasicBlockRef *b_checkargnulls;
552 LLVMValueRef v_fcinfo;
558 b_nonull = l_bb_before_v(opblocks[opno + 1],
559 "b.%d.no-null-args", opno);
562 if (op->
d.
func.nargs == 0)
563 elog(
ERROR,
"argumentless strict functions are pointless");
572 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
576 palloc(
sizeof(LLVMBasicBlockRef *) * op->
d.
func.nargs);
577 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
578 b_checkargnulls[argno] =
579 l_bb_before_v(b_nonull,
"b.%d.isnull.%d", opno,
583 LLVMBuildBr(
b, b_checkargnulls[0]);
586 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
588 LLVMValueRef v_argisnull;
589 LLVMBasicBlockRef b_argnotnull;
591 LLVMPositionBuilderAtEnd(
b, b_checkargnulls[argno]);
597 if (argno + 1 == op->
d.
func.nargs)
598 b_argnotnull = b_nonull;
600 b_argnotnull = b_checkargnulls[argno + 1];
603 v_argisnull = l_funcnull(
b, v_fcinfo, argno);
605 LLVMBuildICmp(
b, LLVMIntEQ,
613 LLVMPositionBuilderAtEnd(
b, b_nonull);
618 LLVMBuildStore(
b, v_retval, v_resvaluep);
619 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
621 LLVMBuildBr(
b, opblocks[opno + 1]);
627 v_state, op, v_econtext);
628 LLVMBuildBr(
b, opblocks[opno + 1]);
634 v_state, op, v_econtext);
635 LLVMBuildBr(
b, opblocks[opno + 1]);
647 LLVMValueRef v_boolvalue;
648 LLVMValueRef v_boolnull;
649 LLVMValueRef v_boolanynullp,
651 LLVMBasicBlockRef b_boolisnull;
652 LLVMBasicBlockRef b_boolcheckfalse;
653 LLVMBasicBlockRef b_boolisfalse;
654 LLVMBasicBlockRef b_boolcont;
655 LLVMBasicBlockRef b_boolisanynull;
657 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
658 "b.%d.boolisnull", opno);
659 b_boolcheckfalse = l_bb_before_v(opblocks[opno + 1],
660 "b.%d.boolcheckfalse", opno);
661 b_boolisfalse = l_bb_before_v(opblocks[opno + 1],
662 "b.%d.boolisfalse", opno);
663 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
664 "b.%d.boolisanynull", opno);
665 b_boolcont = l_bb_before_v(opblocks[opno + 1],
666 "b.%d.boolcont", opno);
668 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
672 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
674 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
675 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
678 LLVMBuildStore(
b, v_boolnull, v_resnullp);
680 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
684 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
685 l_sbool_const(1),
""),
690 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
692 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
694 LLVMBuildBr(
b, b_boolcont);
697 LLVMPositionBuilderAtEnd(
b, b_boolcheckfalse);
699 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
700 l_sizet_const(0),
""),
708 LLVMPositionBuilderAtEnd(
b, b_boolisfalse);
711 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
714 LLVMPositionBuilderAtEnd(
b, b_boolcont);
716 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
720 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
721 l_sbool_const(0),
""),
722 opblocks[opno + 1], b_boolisanynull);
724 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
726 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
728 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
730 LLVMBuildBr(
b, opblocks[opno + 1]);
743 LLVMValueRef v_boolvalue;
744 LLVMValueRef v_boolnull;
745 LLVMValueRef v_boolanynullp,
748 LLVMBasicBlockRef b_boolisnull;
749 LLVMBasicBlockRef b_boolchecktrue;
750 LLVMBasicBlockRef b_boolistrue;
751 LLVMBasicBlockRef b_boolcont;
752 LLVMBasicBlockRef b_boolisanynull;
754 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
755 "b.%d.boolisnull", opno);
756 b_boolchecktrue = l_bb_before_v(opblocks[opno + 1],
757 "b.%d.boolchecktrue", opno);
758 b_boolistrue = l_bb_before_v(opblocks[opno + 1],
759 "b.%d.boolistrue", opno);
760 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
761 "b.%d.boolisanynull", opno);
762 b_boolcont = l_bb_before_v(opblocks[opno + 1],
763 "b.%d.boolcont", opno);
765 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
769 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
770 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
771 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
774 LLVMBuildStore(
b, v_boolnull, v_resnullp);
776 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
779 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
780 l_sbool_const(1),
""),
785 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
787 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
789 LLVMBuildBr(
b, b_boolcont);
792 LLVMPositionBuilderAtEnd(
b, b_boolchecktrue);
794 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
795 l_sizet_const(1),
""),
803 LLVMPositionBuilderAtEnd(
b, b_boolistrue);
806 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
809 LLVMPositionBuilderAtEnd(
b, b_boolcont);
811 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
815 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
816 l_sbool_const(0),
""),
817 opblocks[opno + 1], b_boolisanynull);
819 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
821 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
823 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
825 LLVMBuildBr(
b, opblocks[opno + 1]);
831 LLVMValueRef v_boolvalue;
832 LLVMValueRef v_boolnull;
833 LLVMValueRef v_negbool;
835 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
836 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
838 v_negbool = LLVMBuildZExt(
b,
839 LLVMBuildICmp(
b, LLVMIntEQ,
845 LLVMBuildStore(
b, v_boolnull, v_resnullp);
847 LLVMBuildStore(
b, v_negbool, v_resvaluep);
849 LLVMBuildBr(
b, opblocks[opno + 1]);
855 LLVMValueRef v_resnull;
856 LLVMValueRef v_resvalue;
857 LLVMValueRef v_nullorfalse;
858 LLVMBasicBlockRef b_qualfail;
860 b_qualfail = l_bb_before_v(opblocks[opno + 1],
861 "op.%d.qualfail", opno);
863 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
864 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
868 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
869 l_sbool_const(1),
""),
870 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
871 l_sizet_const(0),
""),
880 LLVMPositionBuilderAtEnd(
b, b_qualfail);
882 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
884 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
886 LLVMBuildBr(
b, opblocks[op->
d.
qualexpr.jumpdone]);
892 LLVMBuildBr(
b, opblocks[op->
d.
jump.jumpdone]);
898 LLVMValueRef v_resnull;
902 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
905 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
906 l_sbool_const(1),
""),
907 opblocks[op->
d.
jump.jumpdone],
914 LLVMValueRef v_resnull;
918 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
921 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
922 l_sbool_const(0),
""),
923 opblocks[op->
d.
jump.jumpdone],
931 LLVMValueRef v_resnull;
932 LLVMValueRef v_resvalue;
933 LLVMValueRef v_nullorfalse;
937 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
938 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
942 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
943 l_sbool_const(1),
""),
944 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
945 l_sizet_const(0),
""),
950 opblocks[op->
d.
jump.jumpdone],
957 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
958 LLVMValueRef v_resvalue;
962 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
963 l_sbool_const(1),
""),
967 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
968 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
970 LLVMBuildBr(
b, opblocks[opno + 1]);
976 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
977 LLVMValueRef v_resvalue;
981 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
982 l_sbool_const(1),
""),
986 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
987 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
989 LLVMBuildBr(
b, opblocks[opno + 1]);
995 v_state, op, v_econtext);
996 LLVMBuildBr(
b, opblocks[opno + 1]);
1001 v_state, op, v_econtext);
1002 LLVMBuildBr(
b, opblocks[opno + 1]);
1010 LLVMBasicBlockRef b_isnull,
1012 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1014 b_isnull = l_bb_before_v(opblocks[opno + 1],
1015 "op.%d.isnull", opno);
1016 b_notnull = l_bb_before_v(opblocks[opno + 1],
1017 "op.%d.isnotnull", opno);
1021 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1022 l_sbool_const(1),
""),
1023 b_isnull, b_notnull);
1026 LLVMPositionBuilderAtEnd(
b, b_isnull);
1029 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1034 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1038 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1041 LLVMBuildBr(
b, opblocks[opno + 1]);
1043 LLVMPositionBuilderAtEnd(
b, b_notnull);
1055 LLVMValueRef v_value =
1056 LLVMBuildLoad(
b, v_resvaluep,
"");
1058 v_value = LLVMBuildZExt(
b,
1059 LLVMBuildICmp(
b, LLVMIntEQ,
1064 LLVMBuildStore(
b, v_value, v_resvaluep);
1066 LLVMBuildBr(
b, opblocks[opno + 1]);
1072 v_state, op, v_econtext);
1073 LLVMBuildBr(
b, opblocks[opno + 1]);
1078 v_state, op, v_econtext);
1079 LLVMBuildBr(
b, opblocks[opno + 1]);
1084 LLVMTypeRef v_functype;
1085 LLVMValueRef v_func;
1086 LLVMValueRef v_params[3];
1089 v_func = l_ptr_const(op->
d.
cparam.paramfunc,
1090 LLVMPointerType(v_functype, 0));
1092 v_params[0] = v_state;
1094 v_params[2] = v_econtext;
1099 LLVMBuildBr(
b, opblocks[opno + 1]);
1106 LLVMTypeRef v_functype;
1107 LLVMValueRef v_func;
1108 LLVMValueRef v_params[3];
1113 LLVMPointerType(v_functype, 0));
1115 v_params[0] = v_state;
1117 v_params[2] = v_econtext;
1118 v_ret = LLVMBuildCall(
b,
1124 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
1125 l_sbool_const(1),
""),
1127 opblocks[jumpdone]);
1135 LLVMTypeRef v_functype;
1136 LLVMValueRef v_func;
1137 LLVMValueRef v_params[3];
1140 v_func = l_ptr_const(op->
d.
sbsref.subscriptfunc,
1141 LLVMPointerType(v_functype, 0));
1143 v_params[0] = v_state;
1145 v_params[2] = v_econtext;
1150 LLVMBuildBr(
b, opblocks[opno + 1]);
1156 LLVMBasicBlockRef b_avail,
1158 LLVMValueRef v_casevaluep,
1160 LLVMValueRef v_casenullp,
1162 LLVMValueRef v_casevaluenull;
1164 b_avail = l_bb_before_v(opblocks[opno + 1],
1165 "op.%d.avail", opno);
1166 b_notavail = l_bb_before_v(opblocks[opno + 1],
1167 "op.%d.notavail", opno);
1169 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1171 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1175 LLVMBuildICmp(
b, LLVMIntEQ,
1176 LLVMBuildPtrToInt(
b, v_casevaluep,
1178 l_sizet_const(0),
"");
1179 LLVMBuildCondBr(
b, v_casevaluenull, b_notavail, b_avail);
1182 LLVMPositionBuilderAtEnd(
b, b_avail);
1183 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1184 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1185 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1186 LLVMBuildStore(
b, v_casenull, v_resnullp);
1187 LLVMBuildBr(
b, opblocks[opno + 1]);
1190 LLVMPositionBuilderAtEnd(
b, b_notavail);
1192 l_load_struct_gep(
b, v_econtext,
1195 l_load_struct_gep(
b, v_econtext,
1197 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1198 LLVMBuildStore(
b, v_casenull, v_resnullp);
1200 LLVMBuildBr(
b, opblocks[opno + 1]);
1206 LLVMBasicBlockRef b_notnull;
1207 LLVMValueRef v_params[1];
1209 LLVMValueRef v_nullp;
1210 LLVMValueRef v_valuep;
1211 LLVMValueRef v_null;
1212 LLVMValueRef v_value;
1214 b_notnull = l_bb_before_v(opblocks[opno + 1],
1215 "op.%d.readonly.notnull", opno);
1220 v_null = LLVMBuildLoad(
b, v_nullp,
"");
1223 LLVMBuildStore(
b, v_null, v_resnullp);
1227 LLVMBuildICmp(
b, LLVMIntEQ, v_null,
1228 l_sbool_const(1),
""),
1229 opblocks[opno + 1], b_notnull);
1232 LLVMPositionBuilderAtEnd(
b, b_notnull);
1237 v_value = LLVMBuildLoad(
b, v_valuep,
"");
1239 v_params[0] = v_value;
1242 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1244 LLVMBuildStore(
b, v_ret, v_resvaluep);
1246 LLVMBuildBr(
b, opblocks[opno + 1]);
1254 LLVMValueRef v_fn_out,
1256 LLVMValueRef v_fcinfo_out,
1258 LLVMValueRef v_fcinfo_in_isnullp;
1259 LLVMValueRef v_retval;
1260 LLVMValueRef v_resvalue;
1261 LLVMValueRef v_resnull;
1263 LLVMValueRef v_output_skip;
1264 LLVMValueRef v_output;
1266 LLVMBasicBlockRef b_skipoutput;
1267 LLVMBasicBlockRef b_calloutput;
1268 LLVMBasicBlockRef b_input;
1269 LLVMBasicBlockRef b_inputcall;
1271 fcinfo_out = op->
d.
iocoerce.fcinfo_data_out;
1272 fcinfo_in = op->
d.
iocoerce.fcinfo_data_in;
1274 b_skipoutput = l_bb_before_v(opblocks[opno + 1],
1275 "op.%d.skipoutputnull", opno);
1276 b_calloutput = l_bb_before_v(opblocks[opno + 1],
1277 "op.%d.calloutput", opno);
1278 b_input = l_bb_before_v(opblocks[opno + 1],
1279 "op.%d.input", opno);
1280 b_inputcall = l_bb_before_v(opblocks[opno + 1],
1281 "op.%d.inputcall", opno);
1288 v_fcinfo_in_isnullp =
1289 LLVMBuildStructGEP(
b, v_fcinfo_in,
1291 "v_fcinfo_in_isnull");
1294 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1296 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1297 l_sbool_const(1),
""),
1301 LLVMPositionBuilderAtEnd(
b, b_skipoutput);
1302 v_output_skip = l_sizet_const(0);
1303 LLVMBuildBr(
b, b_input);
1305 LLVMPositionBuilderAtEnd(
b, b_calloutput);
1306 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
1311 l_funcvaluep(
b, v_fcinfo_out, 0));
1314 l_funcnullp(
b, v_fcinfo_out, 0));
1316 v_output = LLVMBuildCall(
b, v_fn_out, &v_fcinfo_out,
1317 1,
"funccall_coerce_out");
1318 LLVMBuildBr(
b, b_input);
1321 LLVMPositionBuilderAtEnd(
b, b_input);
1325 LLVMValueRef incoming_values[2];
1326 LLVMBasicBlockRef incoming_blocks[2];
1328 incoming_values[0] = v_output_skip;
1329 incoming_blocks[0] = b_skipoutput;
1331 incoming_values[1] = v_output;
1332 incoming_blocks[1] = b_calloutput;
1334 v_output = LLVMBuildPhi(
b,
TypeSizeT,
"output");
1335 LLVMAddIncoming(v_output,
1336 incoming_values, incoming_blocks,
1347 LLVMBuildICmp(
b, LLVMIntEQ, v_output,
1348 l_sizet_const(0),
""),
1354 LLVMBuildBr(
b, b_inputcall);
1357 LLVMPositionBuilderAtEnd(
b, b_inputcall);
1360 LLVMBuildStore(
b, v_output,
1361 l_funcvaluep(
b, v_fcinfo_in, 0));
1362 LLVMBuildStore(
b, v_resnull,
1363 l_funcnullp(
b, v_fcinfo_in, 0));
1369 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_in_isnullp);
1371 v_retval = LLVMBuildCall(
b, v_fn_in, &v_fcinfo_in, 1,
1372 "funccall_iocoerce_in");
1374 LLVMBuildStore(
b, v_retval, v_resvaluep);
1376 LLVMBuildBr(
b, opblocks[opno + 1]);
1385 LLVMValueRef v_fcinfo;
1386 LLVMValueRef v_fcinfo_isnull;
1388 LLVMValueRef v_argnull0,
1390 LLVMValueRef v_argnull1,
1393 LLVMValueRef v_anyargisnull;
1394 LLVMValueRef v_bothargisnull;
1396 LLVMValueRef v_result;
1398 LLVMBasicBlockRef b_noargnull;
1399 LLVMBasicBlockRef b_checkbothargnull;
1400 LLVMBasicBlockRef b_bothargnull;
1401 LLVMBasicBlockRef b_anyargnull;
1403 b_noargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.noargnull", opno);
1404 b_checkbothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.checkbothargnull", opno);
1405 b_bothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.bothargnull", opno);
1406 b_anyargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.anyargnull", opno);
1411 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1412 v_argisnull0 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1413 l_sbool_const(1),
"");
1414 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1415 v_argisnull1 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1416 l_sbool_const(1),
"");
1418 v_anyargisnull = LLVMBuildOr(
b, v_argisnull0, v_argisnull1,
"");
1419 v_bothargisnull = LLVMBuildAnd(
b, v_argisnull0, v_argisnull1,
"");
1426 LLVMBuildCondBr(
b, v_anyargisnull, b_checkbothargnull,
1432 LLVMPositionBuilderAtEnd(
b, b_checkbothargnull);
1433 LLVMBuildCondBr(
b, v_bothargisnull, b_bothargnull,
1438 LLVMPositionBuilderAtEnd(
b, b_bothargnull);
1439 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1441 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1443 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1445 LLVMBuildBr(
b, opblocks[opno + 1]);
1448 LLVMPositionBuilderAtEnd(
b, b_anyargnull);
1449 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1451 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1453 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1454 LLVMBuildBr(
b, opblocks[opno + 1]);
1457 LLVMPositionBuilderAtEnd(
b, b_noargnull);
1467 LLVMBuildICmp(
b, LLVMIntEQ,
1469 l_sizet_const(0),
""),
1473 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1474 LLVMBuildStore(
b, v_result, v_resvaluep);
1476 LLVMBuildBr(
b, opblocks[opno + 1]);
1484 LLVMValueRef v_fcinfo;
1485 LLVMValueRef v_fcinfo_isnull;
1486 LLVMValueRef v_argnull0;
1487 LLVMValueRef v_argnull1;
1488 LLVMValueRef v_anyargisnull;
1489 LLVMValueRef v_arg0;
1490 LLVMBasicBlockRef b_hasnull;
1491 LLVMBasicBlockRef b_nonull;
1492 LLVMBasicBlockRef b_argsequal;
1493 LLVMValueRef v_retval;
1494 LLVMValueRef v_argsequal;
1496 b_hasnull = l_bb_before_v(opblocks[opno + 1],
1497 "b.%d.null-args", opno);
1498 b_nonull = l_bb_before_v(opblocks[opno + 1],
1499 "b.%d.no-null-args", opno);
1500 b_argsequal = l_bb_before_v(opblocks[opno + 1],
1501 "b.%d.argsequal", opno);
1506 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1507 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1511 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1512 l_sbool_const(1),
""),
1513 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1514 l_sbool_const(1),
""),
1517 LLVMBuildCondBr(
b, v_anyargisnull, b_hasnull, b_nonull);
1520 LLVMPositionBuilderAtEnd(
b, b_hasnull);
1521 v_arg0 = l_funcvalue(
b, v_fcinfo, 0);
1522 LLVMBuildStore(
b, v_argnull0, v_resnullp);
1523 LLVMBuildStore(
b, v_arg0, v_resvaluep);
1524 LLVMBuildBr(
b, opblocks[opno + 1]);
1527 LLVMPositionBuilderAtEnd(
b, b_nonull);
1529 v_retval =
BuildV1Call(context,
b, mod, fcinfo, &v_fcinfo_isnull);
1536 v_argsequal = LLVMBuildAnd(
b,
1537 LLVMBuildICmp(
b, LLVMIntEQ,
1541 LLVMBuildICmp(
b, LLVMIntEQ,
1546 LLVMBuildCondBr(
b, v_argsequal, b_argsequal, b_hasnull);
1549 LLVMPositionBuilderAtEnd(
b, b_argsequal);
1550 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1551 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1552 LLVMBuildStore(
b, v_retval, v_resvaluep);
1554 LLVMBuildBr(
b, opblocks[opno + 1]);
1561 LLVMBuildBr(
b, opblocks[opno + 1]);
1567 LLVMBuildBr(
b, opblocks[opno + 1]);
1573 LLVMBuildBr(
b, opblocks[opno + 1]);
1579 LLVMBuildBr(
b, opblocks[opno + 1]);
1584 v_state, op, v_econtext);
1585 LLVMBuildBr(
b, opblocks[opno + 1]);
1591 LLVMBuildBr(
b, opblocks[opno + 1]);
1597 LLVMValueRef v_fcinfo_isnull;
1598 LLVMBasicBlockRef b_null;
1599 LLVMBasicBlockRef b_compare;
1600 LLVMBasicBlockRef b_compare_result;
1602 LLVMValueRef v_retval;
1604 b_null = l_bb_before_v(opblocks[opno + 1],
1605 "op.%d.row-null", opno);
1606 b_compare = l_bb_before_v(opblocks[opno + 1],
1607 "op.%d.row-compare", opno);
1609 l_bb_before_v(opblocks[opno + 1],
1610 "op.%d.row-compare-result",
1619 LLVMValueRef v_fcinfo;
1620 LLVMValueRef v_argnull0;
1621 LLVMValueRef v_argnull1;
1622 LLVMValueRef v_anyargisnull;
1624 v_fcinfo = l_ptr_const(fcinfo,
1627 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1628 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1637 LLVMBuildICmp(
b, LLVMIntEQ,
1639 l_sbool_const(1),
""),
1642 LLVMBuildCondBr(
b, v_anyargisnull, b_null, b_compare);
1646 LLVMBuildBr(
b, b_compare);
1650 LLVMPositionBuilderAtEnd(
b, b_compare);
1655 LLVMBuildStore(
b, v_retval, v_resvaluep);
1668 LLVMPositionBuilderAtEnd(
b, b_compare_result);
1675 l_sizet_const(0),
""),
1683 LLVMPositionBuilderAtEnd(
b, b_null);
1684 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1694 LLVMValueRef v_cmpresult;
1695 LLVMValueRef v_result;
1696 LLVMIntPredicate predicate;
1705 LLVMBuildLoad(
b, v_resvaluep,
""),
1706 LLVMInt32Type(),
"");
1711 predicate = LLVMIntSLT;
1714 predicate = LLVMIntSLE;
1717 predicate = LLVMIntSGT;
1720 predicate = LLVMIntSGE;
1729 v_result = LLVMBuildICmp(
b,
1734 v_result = LLVMBuildZExt(
b, v_result,
TypeSizeT,
"");
1736 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1737 LLVMBuildStore(
b, v_result, v_resvaluep);
1739 LLVMBuildBr(
b, opblocks[opno + 1]);
1746 LLVMBuildBr(
b, opblocks[opno + 1]);
1751 v_state, op, v_econtext);
1752 LLVMBuildBr(
b, opblocks[opno + 1]);
1757 v_state, op, v_econtext);
1758 LLVMBuildBr(
b, opblocks[opno + 1]);
1763 v_state, op, v_econtext);
1764 LLVMBuildBr(
b, opblocks[opno + 1]);
1769 LLVMBasicBlockRef b_avail,
1771 LLVMValueRef v_casevaluep,
1773 LLVMValueRef v_casenullp,
1775 LLVMValueRef v_casevaluenull;
1777 b_avail = l_bb_before_v(opblocks[opno + 1],
1778 "op.%d.avail", opno);
1779 b_notavail = l_bb_before_v(opblocks[opno + 1],
1780 "op.%d.notavail", opno);
1782 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1784 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1788 LLVMBuildICmp(
b, LLVMIntEQ,
1789 LLVMBuildPtrToInt(
b, v_casevaluep,
1791 l_sizet_const(0),
"");
1794 b_notavail, b_avail);
1797 LLVMPositionBuilderAtEnd(
b, b_avail);
1798 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1799 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1800 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1801 LLVMBuildStore(
b, v_casenull, v_resnullp);
1802 LLVMBuildBr(
b, opblocks[opno + 1]);
1805 LLVMPositionBuilderAtEnd(
b, b_notavail);
1807 l_load_struct_gep(
b, v_econtext,
1811 l_load_struct_gep(
b, v_econtext,
1814 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1815 LLVMBuildStore(
b, v_casenull, v_resnullp);
1817 LLVMBuildBr(
b, opblocks[opno + 1]);
1824 LLVMBuildBr(
b, opblocks[opno + 1]);
1830 LLVMBuildBr(
b, opblocks[opno + 1]);
1835 v_state, op, v_econtext);
1836 LLVMBuildBr(
b, opblocks[opno + 1]);
1842 LLVMBuildBr(
b, opblocks[opno + 1]);
1847 v_state, op, v_econtext);
1848 LLVMBuildBr(
b, opblocks[opno + 1]);
1854 LLVMBuildBr(
b, opblocks[opno + 1]);
1859 v_state, op, v_econtext);
1860 LLVMBuildBr(
b, opblocks[opno + 1]);
1866 LLVMBuildBr(
b, opblocks[opno + 1]);
1871 LLVMValueRef v_aggno;
1875 v_aggno = l_int32_const(op->
d.
aggref.aggno);
1878 value = l_load_gep1(
b, v_aggvalues, v_aggno,
"aggvalue");
1879 isnull = l_load_gep1(
b, v_aggnulls, v_aggno,
"aggnull");
1882 LLVMBuildStore(
b,
value, v_resvaluep);
1883 LLVMBuildStore(
b, isnull, v_resnullp);
1885 LLVMBuildBr(
b, opblocks[opno + 1]);
1892 LLVMBuildBr(
b, opblocks[opno + 1]);
1898 LLVMValueRef v_wfuncnop;
1899 LLVMValueRef v_wfuncno;
1908 v_wfuncnop = l_ptr_const(&wfunc->
wfuncno,
1909 l_ptr(LLVMInt32Type()));
1910 v_wfuncno = LLVMBuildLoad(
b, v_wfuncnop,
"v_wfuncno");
1913 value = l_load_gep1(
b, v_aggvalues, v_wfuncno,
1915 isnull = l_load_gep1(
b, v_aggnulls, v_wfuncno,
1918 LLVMBuildStore(
b,
value, v_resvaluep);
1919 LLVMBuildStore(
b, isnull, v_resnullp);
1921 LLVMBuildBr(
b, opblocks[opno + 1]);
1927 v_state, op, v_econtext);
1928 LLVMBuildBr(
b, opblocks[opno + 1]);
1937 LLVMValueRef v_retval;
1938 LLVMValueRef v_fcinfo_isnull;
1939 LLVMValueRef v_tmpcontext;
1940 LLVMValueRef v_oldcontext;
1944 LLVMValueRef v_fcinfo;
1945 LLVMValueRef v_argnull0;
1946 LLVMBasicBlockRef b_deserialize;
1948 b_deserialize = l_bb_before_v(opblocks[opno + 1],
1949 "op.%d.deserialize", opno);
1951 v_fcinfo = l_ptr_const(fcinfo,
1953 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1963 LLVMPositionBuilderAtEnd(
b, b_deserialize);
1972 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
1975 l_mcxt_switch(mod,
b, v_oldcontext);
1977 LLVMBuildStore(
b, v_retval, v_resvaluep);
1978 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1980 LLVMBuildBr(
b, opblocks[opno + 1]);
1992 LLVMValueRef v_argsp;
1993 LLVMValueRef v_nullsp;
1994 LLVMBasicBlockRef *b_checknulls;
2003 b_checknulls =
palloc(
sizeof(LLVMBasicBlockRef *) * nargs);
2004 for (
int argno = 0; argno < nargs; argno++)
2006 b_checknulls[argno] =
2007 l_bb_before_v(opblocks[opno + 1],
2008 "op.%d.check-null.%d",
2012 LLVMBuildBr(
b, b_checknulls[0]);
2015 for (
int argno = 0; argno < nargs; argno++)
2017 LLVMValueRef v_argno = l_int32_const(argno);
2018 LLVMValueRef v_argisnull;
2019 LLVMBasicBlockRef b_argnotnull;
2021 LLVMPositionBuilderAtEnd(
b, b_checknulls[argno]);
2023 if (argno + 1 == nargs)
2024 b_argnotnull = opblocks[opno + 1];
2026 b_argnotnull = b_checknulls[argno + 1];
2029 v_argisnull = l_load_gep1(
b, v_nullsp, v_argno,
"");
2032 LLVMValueRef v_argn;
2034 v_argn = LLVMBuildGEP(
b, v_argsp, &v_argno, 1,
"");
2036 l_load_struct_gep(
b, v_argn,
2045 l_sbool_const(1),
""),
2056 LLVMValueRef v_aggstatep;
2057 LLVMValueRef v_allpergroupsp;
2058 LLVMValueRef v_pergroup_allaggs;
2059 LLVMValueRef v_setoff;
2067 v_aggstatep = LLVMBuildBitCast(
b, v_parent,
2070 v_allpergroupsp = l_load_struct_gep(
b, v_aggstatep,
2072 "aggstate.all_pergroups");
2076 v_pergroup_allaggs = l_load_gep1(
b, v_allpergroupsp, v_setoff,
"");
2079 LLVMBuildICmp(
b, LLVMIntEQ,
2080 LLVMBuildPtrToInt(
b, v_pergroup_allaggs,
TypeSizeT,
""),
2081 l_sizet_const(0),
""),
2083 opblocks[opno + 1]);
2098 LLVMValueRef v_aggstatep;
2099 LLVMValueRef v_fcinfo;
2100 LLVMValueRef v_fcinfo_isnull;
2102 LLVMValueRef v_transvaluep;
2103 LLVMValueRef v_transnullp;
2105 LLVMValueRef v_setoff;
2106 LLVMValueRef v_transno;
2108 LLVMValueRef v_aggcontext;
2110 LLVMValueRef v_allpergroupsp;
2111 LLVMValueRef v_current_setp;
2112 LLVMValueRef v_current_pertransp;
2113 LLVMValueRef v_curaggcontext;
2115 LLVMValueRef v_pertransp;
2117 LLVMValueRef v_pergroupp;
2119 LLVMValueRef v_retval;
2121 LLVMValueRef v_tmpcontext;
2122 LLVMValueRef v_oldcontext;
2131 v_pertransp = l_ptr_const(pertrans,
2139 l_load_struct_gep(
b, v_aggstatep,
2141 "aggstate.all_pergroups");
2142 v_setoff = l_int32_const(op->
d.
agg_trans.setoff);
2143 v_transno = l_int32_const(op->
d.
agg_trans.transno);
2146 l_load_gep1(
b, v_allpergroupsp, v_setoff,
""),
2153 LLVMValueRef v_notransvalue;
2154 LLVMBasicBlockRef b_init;
2155 LLVMBasicBlockRef b_no_init;
2158 l_load_struct_gep(
b, v_pergroupp,
2162 b_init = l_bb_before_v(opblocks[opno + 1],
2163 "op.%d.inittrans", opno);
2164 b_no_init = l_bb_before_v(opblocks[opno + 1],
2165 "op.%d.no_inittrans", opno);
2168 LLVMBuildICmp(
b, LLVMIntEQ, v_notransvalue,
2169 l_sbool_const(1),
""),
2175 LLVMValueRef params[4];
2177 LLVMPositionBuilderAtEnd(
b, b_init);
2179 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2182 params[0] = v_aggstatep;
2183 params[1] = v_pertransp;
2184 params[2] = v_pergroupp;
2185 params[3] = v_aggcontext;
2192 LLVMBuildBr(
b, opblocks[opno + 1]);
2195 LLVMPositionBuilderAtEnd(
b, b_no_init);
2203 LLVMValueRef v_transnull;
2204 LLVMBasicBlockRef b_strictpass;
2206 b_strictpass = l_bb_before_v(opblocks[opno + 1],
2207 "op.%d.strictpass", opno);
2209 l_load_struct_gep(
b, v_pergroupp,
2214 LLVMBuildICmp(
b, LLVMIntEQ, v_transnull,
2215 l_sbool_const(1),
""),
2219 LLVMPositionBuilderAtEnd(
b, b_strictpass);
2223 v_fcinfo = l_ptr_const(fcinfo,
2225 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2229 LLVMBuildStructGEP(
b,
2232 "aggstate.current_set");
2234 LLVMBuildStructGEP(
b,
2237 "aggstate.curaggcontext");
2238 v_current_pertransp =
2239 LLVMBuildStructGEP(
b,
2242 "aggstate.curpertrans");
2245 LLVMBuildStore(
b, v_aggcontext, v_curaggcontext);
2246 LLVMBuildStore(
b, l_int32_const(op->
d.
agg_trans.setno),
2248 LLVMBuildStore(
b, v_pertransp, v_current_pertransp);
2254 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2258 LLVMBuildStructGEP(
b, v_pergroupp,
2262 LLVMBuildStructGEP(
b, v_pergroupp,
2266 LLVMBuildLoad(
b, v_transvaluep,
2268 l_funcvaluep(
b, v_fcinfo, 0));
2270 LLVMBuildLoad(
b, v_transnullp,
"transnull"),
2271 l_funcnullp(
b, v_fcinfo, 0));
2290 LLVMBasicBlockRef b_call;
2291 LLVMBasicBlockRef b_nocall;
2293 LLVMValueRef v_transvalue;
2294 LLVMValueRef v_transnull;
2295 LLVMValueRef v_newval;
2296 LLVMValueRef params[6];
2298 b_call = l_bb_before_v(opblocks[opno + 1],
2299 "op.%d.transcall", opno);
2300 b_nocall = l_bb_before_v(opblocks[opno + 1],
2301 "op.%d.transnocall", opno);
2303 v_transvalue = LLVMBuildLoad(
b, v_transvaluep,
"");
2304 v_transnull = LLVMBuildLoad(
b, v_transnullp,
"");
2311 LLVMBuildICmp(
b, LLVMIntEQ,
2317 LLVMPositionBuilderAtEnd(
b, b_call);
2319 params[0] = v_aggstatep;
2320 params[1] = v_pertransp;
2321 params[2] = v_retval;
2322 params[3] = LLVMBuildTrunc(
b, v_fcinfo_isnull,
2324 params[4] = v_transvalue;
2325 params[5] = LLVMBuildTrunc(
b, v_transnull,
2330 LLVMBuildCall(
b, v_fn,
2335 LLVMBuildStore(
b, v_newval, v_transvaluep);
2336 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2338 l_mcxt_switch(mod,
b, v_oldcontext);
2339 LLVMBuildBr(
b, opblocks[opno + 1]);
2342 LLVMPositionBuilderAtEnd(
b, b_nocall);
2346 LLVMBuildStore(
b, v_retval, v_transvaluep);
2347 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2349 l_mcxt_switch(mod,
b, v_oldcontext);
2351 LLVMBuildBr(
b, opblocks[opno + 1]);
2361 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctSingle");
2362 LLVMValueRef v_args[2];
2368 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2372 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2373 l_sbool_const(1),
""),
2375 opblocks[jumpdistinct]);
2385 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctMulti");
2386 LLVMValueRef v_args[2];
2392 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2396 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2397 l_sbool_const(1),
""),
2399 opblocks[jumpdistinct]);
2405 v_state, op, v_econtext);
2406 LLVMBuildBr(
b, opblocks[opno + 1]);
2411 v_state, op, v_econtext);
2412 LLVMBuildBr(
b, opblocks[opno + 1]);
2421 LLVMDisposeBuilder(
b);
2437 state->evalfunc_private = cstate;
2444 endtime, starttime);
2472 state->evalfunc = func;
2474 return func(
state, econtext, isNull);
2480 LLVMValueRef *v_fcinfo_isnull)
2483 LLVMValueRef v_fcinfo_isnullp;
2484 LLVMValueRef v_retval;
2485 LLVMValueRef v_fcinfo;
2490 v_fcinfo_isnullp = LLVMBuildStructGEP(
b, v_fcinfo,
2493 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_isnullp);
2495 v_retval = LLVMBuildCall(
b, v_fn, &v_fcinfo, 1,
"funccall");
2497 if (v_fcinfo_isnull)
2498 *v_fcinfo_isnull = LLVMBuildLoad(
b, v_fcinfo_isnullp,
"");
2506 LLVMValueRef params[2];
2509 params[1] = l_ptr_const(fcinfo->
args, l_ptr(LLVMInt8Type()));
2510 LLVMBuildCall(
b, v_lifetime, params,
lengthof(params),
"");
2512 params[0] = l_int64_const(
sizeof(fcinfo->
isnull));
2513 params[1] = l_ptr_const(&fcinfo->
isnull, l_ptr(LLVMInt8Type()));
2514 LLVMBuildCall(
b, v_lifetime, params,
lengthof(params),
"");
2526 int nargs, LLVMValueRef *v_args)
2529 LLVMValueRef *params;
2534 if (LLVMCountParams(v_fn) != (nargs + 2))
2535 elog(
ERROR,
"parameter mismatch: %s expects %d passed %d",
2536 funcname, LLVMCountParams(v_fn), nargs + 2);
2538 params =
palloc(
sizeof(LLVMValueRef) * (2 + nargs));
2540 params[argno++] = v_state;
2543 for (
int i = 0;
i < nargs;
i++)
2544 params[argno++] = v_args[
i];
2546 v_ret = LLVMBuildCall(
b, v_fn, params, argno,
"");
2558 LLVMTypeRef param_types[2];
2561 #if LLVM_VERSION_MAJOR < 5
2562 const char *nm =
"llvm.lifetime.end";
2564 const char *nm =
"llvm.lifetime.end.p0i8";
2567 fn = LLVMGetNamedFunction(mod, nm);
2571 param_types[0] = LLVMInt64Type();
2572 param_types[1] = l_ptr(LLVMInt8Type());
2574 sig = LLVMFunctionType(LLVMVoidType(),
2575 param_types,
lengthof(param_types),
2577 fn = LLVMAddFunction(mod, nm,
sig);
2579 LLVMSetFunctionCallConv(
fn, LLVMCCallConv);
elog(ERROR, "%s: %s", p2, msg)
void CheckExprStillValid(ExprState *state, ExprContext *econtext)
ExprEvalOp ExecEvalStepOp(ExprState *state, ExprEvalStep *op)
@ EEOP_FUNCEXPR_STRICT_FUSAGE
@ 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_AGG_PRESORTED_DISTINCT_SINGLE
@ EEOP_BOOL_AND_STEP_FIRST
@ EEOP_BOOL_AND_STEP_LAST
@ EEOP_AGG_ORDERED_TRANS_DATUM
@ 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_EXPRCONTEXT_DOMAINNULL
#define FIELDNO_EXPRCONTEXT_DOMAINDATUM
#define FIELDNO_EXPRCONTEXT_CASEDATUM
#define FIELDNO_AGGSTATE_CURPERTRANS
#define FIELDNO_EXPRSTATE_RESNULL
#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)
Assert(fmt[strlen(fmt) - 1] !='\n')
LLVMTypeRef StructFunctionCallInfoData
LLVMTypeRef StructExprEvalStep
LLVMValueRef llvm_pg_func(LLVMModuleRef mod, const char *funcname)
LLVMTypeRef TypeParamBool
LLVMTypeRef StructMemoryContextData
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 TypeStorageBool
LLVMJitContext * llvm_create_context(int jitFlags)
LLVMModuleRef llvm_mutable_module(LLVMJitContext *context)
LLVMTypeRef StructAggState
LLVMValueRef AttributeTemplate
LLVMTypeRef StructExprContext
LLVMTypeRef StructNullableDatum
void * llvm_get_function(LLVMJitContext *context, const char *funcname)
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)
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::@51::@93 agg_presorted_distinctcheck
struct ExprEvalStep::@51::@66 make_readonly
struct ExprEvalStep::@51::@90 agg_deserialize
struct ExprEvalStep::@51::@92 agg_plain_pergroup_nullcheck
struct ExprEvalStep::@51::@52 fetch
union ExprEvalStep::@51 d
struct ExprEvalStep::@51::@57 constval
struct ExprEvalStep::@51::@56 assign_tmp
struct ExprEvalStep::@51::@88 window_func
struct ExprEvalStep::@51::@73 rowcompare_step
struct ExprEvalStep::@51::@60 qualexpr
struct ExprEvalStep::@51::@64 cparam
struct ExprEvalStep::@51::@78 sbsref_subscript
struct ExprEvalStep::@51::@65 casetest
struct ExprEvalStep::@51::@55 assign_var
struct ExprEvalStep::@51::@94 agg_trans
struct ExprEvalStep::@51::@67 iocoerce
struct ExprEvalStep::@51::@61 jump
struct ExprEvalStep::@51::@91 agg_strict_input_check
struct ExprEvalStep::@51::@53 var
struct ExprEvalStep::@51::@79 sbsref
struct ExprEvalStep::@51::@59 boolexpr
struct ExprEvalStep::@51::@74 rowcompare_final
struct ExprEvalStep::@51::@86 aggref
struct ExprEvalStep::@51::@58 func
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
static void * fn(void *arg)
#define FIELDNO_TUPLETABLESLOT_ISNULL
#define FIELDNO_TUPLETABLESLOT_VALUES
#define FIELDNO_TUPLETABLESLOT_NVALID