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;
136 context = (LLVMJitContext *) parent->
state->
es_jit;
147 b = LLVMCreateBuilder();
152 eval_fn = LLVMAddFunction(mod,
funcname,
154 LLVMSetLinkage(eval_fn, LLVMExternalLinkage);
155 LLVMSetVisibility(eval_fn, LLVMDefaultVisibility);
158 entry = LLVMAppendBasicBlock(eval_fn,
"entry");
161 v_state = LLVMGetParam(eval_fn, 0);
162 v_econtext = LLVMGetParam(eval_fn, 1);
163 v_isnullp = LLVMGetParam(eval_fn, 2);
165 LLVMPositionBuilderAtEnd(
b, entry);
167 v_tmpvaluep = LLVMBuildStructGEP(
b, v_state,
170 v_tmpisnullp = LLVMBuildStructGEP(
b, v_state,
173 v_parent = l_load_struct_gep(
b, v_state,
178 v_scanslot = l_load_struct_gep(
b, v_econtext,
181 v_innerslot = l_load_struct_gep(
b, v_econtext,
184 v_outerslot = l_load_struct_gep(
b, v_econtext,
187 v_resultslot = l_load_struct_gep(
b, v_state,
192 v_scanvalues = l_load_struct_gep(
b, v_scanslot,
195 v_scannulls = l_load_struct_gep(
b, v_scanslot,
198 v_innervalues = l_load_struct_gep(
b, v_innerslot,
201 v_innernulls = l_load_struct_gep(
b, v_innerslot,
204 v_outervalues = l_load_struct_gep(
b, v_outerslot,
207 v_outernulls = l_load_struct_gep(
b, v_outerslot,
210 v_resultvalues = l_load_struct_gep(
b, v_resultslot,
213 v_resultnulls = l_load_struct_gep(
b, v_resultslot,
218 v_aggvalues = l_load_struct_gep(
b, v_econtext,
220 "v.econtext.aggvalues");
221 v_aggnulls = l_load_struct_gep(
b, v_econtext,
223 "v.econtext.aggnulls");
226 opblocks =
palloc(
sizeof(LLVMBasicBlockRef) *
state->steps_len);
227 for (
int opno = 0; opno <
state->steps_len; opno++)
228 opblocks[opno] = l_bb_append_v(eval_fn,
"b.op.%d.start", opno);
231 LLVMBuildBr(
b, opblocks[0]);
233 for (
int opno = 0; opno <
state->steps_len; opno++)
237 LLVMValueRef v_resvaluep;
238 LLVMValueRef v_resnullp;
240 LLVMPositionBuilderAtEnd(
b, opblocks[opno]);
242 op = &
state->steps[opno];
252 LLVMValueRef v_tmpisnull;
253 LLVMValueRef v_tmpvalue;
255 v_tmpvalue = LLVMBuildLoad(
b, v_tmpvaluep,
"");
256 v_tmpisnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
258 LLVMBuildStore(
b, v_tmpisnull, v_isnullp);
260 LLVMBuildRet(
b, v_tmpvalue);
270 LLVMBasicBlockRef b_fetch;
271 LLVMValueRef v_nvalid;
272 LLVMValueRef l_jit_deform = NULL;
275 b_fetch = l_bb_before_v(opblocks[opno + 1],
276 "op.%d.fetch", opno);
278 if (op->
d.
fetch.known_desc)
279 desc = op->
d.
fetch.known_desc;
282 tts_ops = op->
d.
fetch.kind;
288 v_slot = v_innerslot;
290 v_slot = v_outerslot;
299 l_load_struct_gep(
b, v_slot,
303 LLVMBuildICmp(
b, LLVMIntUGE, v_nvalid,
304 l_int16_const(op->
d.
fetch.last_var),
306 opblocks[opno + 1], b_fetch);
308 LLVMPositionBuilderAtEnd(
b, b_fetch);
316 if (tts_ops && desc && (context->base.flags &
PGJIT_DEFORM))
326 LLVMValueRef params[1];
330 LLVMBuildCall(
b, l_jit_deform,
335 LLVMValueRef params[2];
338 params[1] = l_int32_const(op->
d.
fetch.last_var);
345 LLVMBuildBr(
b, opblocks[opno + 1]);
355 LLVMValueRef v_attnum;
356 LLVMValueRef v_values;
357 LLVMValueRef v_nulls;
361 v_values = v_innervalues;
362 v_nulls = v_innernulls;
366 v_values = v_outervalues;
367 v_nulls = v_outernulls;
371 v_values = v_scanvalues;
372 v_nulls = v_scannulls;
375 v_attnum = l_int32_const(op->
d.
var.attnum);
376 value = l_load_gep1(
b, v_values, v_attnum,
"");
377 isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
378 LLVMBuildStore(
b,
value, v_resvaluep);
379 LLVMBuildStore(
b, isnull, v_resnullp);
381 LLVMBuildBr(
b, opblocks[opno + 1]);
392 v_slot = v_innerslot;
394 v_slot = v_outerslot;
399 v_state, op, v_econtext, v_slot);
401 LLVMBuildBr(
b, opblocks[opno + 1]);
407 v_state, op, v_econtext);
408 LLVMBuildBr(
b, opblocks[opno + 1]);
415 LLVMValueRef v_value;
416 LLVMValueRef v_isnull;
417 LLVMValueRef v_rvaluep;
418 LLVMValueRef v_risnullp;
419 LLVMValueRef v_attnum;
420 LLVMValueRef v_resultnum;
421 LLVMValueRef v_values;
422 LLVMValueRef v_nulls;
426 v_values = v_innervalues;
427 v_nulls = v_innernulls;
431 v_values = v_outervalues;
432 v_nulls = v_outernulls;
436 v_values = v_scanvalues;
437 v_nulls = v_scannulls;
442 v_value = l_load_gep1(
b, v_values, v_attnum,
"");
443 v_isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
446 v_resultnum = l_int32_const(op->
d.
assign_var.resultnum);
447 v_rvaluep = LLVMBuildGEP(
b, v_resultvalues,
448 &v_resultnum, 1,
"");
449 v_risnullp = LLVMBuildGEP(
b, v_resultnulls,
450 &v_resultnum, 1,
"");
453 LLVMBuildStore(
b, v_value, v_rvaluep);
454 LLVMBuildStore(
b, v_isnull, v_risnullp);
456 LLVMBuildBr(
b, opblocks[opno + 1]);
463 LLVMValueRef v_value,
465 LLVMValueRef v_rvaluep,
467 LLVMValueRef v_resultnum;
471 v_value = LLVMBuildLoad(
b, v_tmpvaluep,
"");
472 v_isnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
475 v_resultnum = l_int32_const(resultnum);
477 LLVMBuildGEP(
b, v_resultvalues, &v_resultnum, 1,
"");
479 LLVMBuildGEP(
b, v_resultnulls, &v_resultnum, 1,
"");
482 LLVMBuildStore(
b, v_isnull, v_risnullp);
487 LLVMBasicBlockRef b_notnull;
488 LLVMValueRef v_params[1];
490 b_notnull = l_bb_before_v(opblocks[opno + 1],
491 "op.%d.assign_tmp.notnull", opno);
495 LLVMBuildICmp(
b, LLVMIntEQ, v_isnull,
496 l_sbool_const(0),
""),
497 b_notnull, opblocks[opno + 1]);
500 LLVMPositionBuilderAtEnd(
b, b_notnull);
501 v_params[0] = v_value;
504 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
514 LLVMBuildStore(
b, v_value, v_rvaluep);
516 LLVMBuildBr(
b, opblocks[opno + 1]);
522 LLVMValueRef v_constvalue,
525 v_constvalue = l_sizet_const(op->
d.
constval.value);
526 v_constnull = l_sbool_const(op->
d.
constval.isnull);
528 LLVMBuildStore(
b, v_constvalue, v_resvaluep);
529 LLVMBuildStore(
b, v_constnull, v_resnullp);
531 LLVMBuildBr(
b, opblocks[opno + 1]);
539 LLVMValueRef v_fcinfo_isnull;
540 LLVMValueRef v_retval;
544 LLVMBasicBlockRef b_nonull;
545 LLVMBasicBlockRef *b_checkargnulls;
546 LLVMValueRef v_fcinfo;
552 b_nonull = l_bb_before_v(opblocks[opno + 1],
553 "b.%d.no-null-args", opno);
556 if (op->
d.
func.nargs == 0)
557 elog(
ERROR,
"argumentless strict functions are pointless");
566 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
570 palloc(
sizeof(LLVMBasicBlockRef *) * op->
d.
func.nargs);
571 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
572 b_checkargnulls[argno] =
573 l_bb_before_v(b_nonull,
"b.%d.isnull.%d", opno,
577 LLVMBuildBr(
b, b_checkargnulls[0]);
580 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
582 LLVMValueRef v_argisnull;
583 LLVMBasicBlockRef b_argnotnull;
585 LLVMPositionBuilderAtEnd(
b, b_checkargnulls[argno]);
591 if (argno + 1 == op->
d.
func.nargs)
592 b_argnotnull = b_nonull;
594 b_argnotnull = b_checkargnulls[argno + 1];
597 v_argisnull = l_funcnull(
b, v_fcinfo, argno);
599 LLVMBuildICmp(
b, LLVMIntEQ,
607 LLVMPositionBuilderAtEnd(
b, b_nonull);
612 LLVMBuildStore(
b, v_retval, v_resvaluep);
613 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
615 LLVMBuildBr(
b, opblocks[opno + 1]);
621 v_state, op, v_econtext);
622 LLVMBuildBr(
b, opblocks[opno + 1]);
628 v_state, op, v_econtext);
629 LLVMBuildBr(
b, opblocks[opno + 1]);
641 LLVMValueRef v_boolvalue;
642 LLVMValueRef v_boolnull;
643 LLVMValueRef v_boolanynullp,
645 LLVMBasicBlockRef b_boolisnull;
646 LLVMBasicBlockRef b_boolcheckfalse;
647 LLVMBasicBlockRef b_boolisfalse;
648 LLVMBasicBlockRef b_boolcont;
649 LLVMBasicBlockRef b_boolisanynull;
651 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
652 "b.%d.boolisnull", opno);
653 b_boolcheckfalse = l_bb_before_v(opblocks[opno + 1],
654 "b.%d.boolcheckfalse", opno);
655 b_boolisfalse = l_bb_before_v(opblocks[opno + 1],
656 "b.%d.boolisfalse", opno);
657 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
658 "b.%d.boolisanynull", opno);
659 b_boolcont = l_bb_before_v(opblocks[opno + 1],
660 "b.%d.boolcont", opno);
662 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
666 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
668 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
669 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
672 LLVMBuildStore(
b, v_boolnull, v_resnullp);
674 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
678 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
679 l_sbool_const(1),
""),
684 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
686 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
688 LLVMBuildBr(
b, b_boolcont);
691 LLVMPositionBuilderAtEnd(
b, b_boolcheckfalse);
693 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
694 l_sizet_const(0),
""),
702 LLVMPositionBuilderAtEnd(
b, b_boolisfalse);
705 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
708 LLVMPositionBuilderAtEnd(
b, b_boolcont);
710 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
714 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
715 l_sbool_const(0),
""),
716 opblocks[opno + 1], b_boolisanynull);
718 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
720 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
722 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
724 LLVMBuildBr(
b, opblocks[opno + 1]);
737 LLVMValueRef v_boolvalue;
738 LLVMValueRef v_boolnull;
739 LLVMValueRef v_boolanynullp,
742 LLVMBasicBlockRef b_boolisnull;
743 LLVMBasicBlockRef b_boolchecktrue;
744 LLVMBasicBlockRef b_boolistrue;
745 LLVMBasicBlockRef b_boolcont;
746 LLVMBasicBlockRef b_boolisanynull;
748 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
749 "b.%d.boolisnull", opno);
750 b_boolchecktrue = l_bb_before_v(opblocks[opno + 1],
751 "b.%d.boolchecktrue", opno);
752 b_boolistrue = l_bb_before_v(opblocks[opno + 1],
753 "b.%d.boolistrue", opno);
754 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
755 "b.%d.boolisanynull", opno);
756 b_boolcont = l_bb_before_v(opblocks[opno + 1],
757 "b.%d.boolcont", opno);
759 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
763 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
764 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
765 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
768 LLVMBuildStore(
b, v_boolnull, v_resnullp);
770 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
773 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
774 l_sbool_const(1),
""),
779 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
781 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
783 LLVMBuildBr(
b, b_boolcont);
786 LLVMPositionBuilderAtEnd(
b, b_boolchecktrue);
788 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
789 l_sizet_const(1),
""),
797 LLVMPositionBuilderAtEnd(
b, b_boolistrue);
800 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
803 LLVMPositionBuilderAtEnd(
b, b_boolcont);
805 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
809 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
810 l_sbool_const(0),
""),
811 opblocks[opno + 1], b_boolisanynull);
813 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
815 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
817 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
819 LLVMBuildBr(
b, opblocks[opno + 1]);
825 LLVMValueRef v_boolvalue;
826 LLVMValueRef v_boolnull;
827 LLVMValueRef v_negbool;
829 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
830 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
832 v_negbool = LLVMBuildZExt(
b,
833 LLVMBuildICmp(
b, LLVMIntEQ,
839 LLVMBuildStore(
b, v_boolnull, v_resnullp);
841 LLVMBuildStore(
b, v_negbool, v_resvaluep);
843 LLVMBuildBr(
b, opblocks[opno + 1]);
849 LLVMValueRef v_resnull;
850 LLVMValueRef v_resvalue;
851 LLVMValueRef v_nullorfalse;
852 LLVMBasicBlockRef b_qualfail;
854 b_qualfail = l_bb_before_v(opblocks[opno + 1],
855 "op.%d.qualfail", opno);
857 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
858 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
862 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
863 l_sbool_const(1),
""),
864 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
865 l_sizet_const(0),
""),
874 LLVMPositionBuilderAtEnd(
b, b_qualfail);
876 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
878 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
880 LLVMBuildBr(
b, opblocks[op->
d.
qualexpr.jumpdone]);
886 LLVMBuildBr(
b, opblocks[op->
d.
jump.jumpdone]);
892 LLVMValueRef v_resnull;
896 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
899 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
900 l_sbool_const(1),
""),
901 opblocks[op->
d.
jump.jumpdone],
908 LLVMValueRef v_resnull;
912 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
915 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
916 l_sbool_const(0),
""),
917 opblocks[op->
d.
jump.jumpdone],
925 LLVMValueRef v_resnull;
926 LLVMValueRef v_resvalue;
927 LLVMValueRef v_nullorfalse;
931 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
932 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
936 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
937 l_sbool_const(1),
""),
938 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
939 l_sizet_const(0),
""),
944 opblocks[op->
d.
jump.jumpdone],
951 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
952 LLVMValueRef v_resvalue;
956 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
957 l_sbool_const(1),
""),
961 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
962 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
964 LLVMBuildBr(
b, opblocks[opno + 1]);
970 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
971 LLVMValueRef v_resvalue;
975 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
976 l_sbool_const(1),
""),
980 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
981 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
983 LLVMBuildBr(
b, opblocks[opno + 1]);
989 v_state, op, v_econtext);
990 LLVMBuildBr(
b, opblocks[opno + 1]);
995 v_state, op, v_econtext);
996 LLVMBuildBr(
b, opblocks[opno + 1]);
1004 LLVMBasicBlockRef b_isnull,
1006 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1008 b_isnull = l_bb_before_v(opblocks[opno + 1],
1009 "op.%d.isnull", opno);
1010 b_notnull = l_bb_before_v(opblocks[opno + 1],
1011 "op.%d.isnotnull", opno);
1015 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1016 l_sbool_const(1),
""),
1017 b_isnull, b_notnull);
1020 LLVMPositionBuilderAtEnd(
b, b_isnull);
1023 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1028 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1032 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1035 LLVMBuildBr(
b, opblocks[opno + 1]);
1037 LLVMPositionBuilderAtEnd(
b, b_notnull);
1049 LLVMValueRef v_value =
1050 LLVMBuildLoad(
b, v_resvaluep,
"");
1052 v_value = LLVMBuildZExt(
b,
1053 LLVMBuildICmp(
b, LLVMIntEQ,
1058 LLVMBuildStore(
b, v_value, v_resvaluep);
1060 LLVMBuildBr(
b, opblocks[opno + 1]);
1066 v_state, op, v_econtext);
1067 LLVMBuildBr(
b, opblocks[opno + 1]);
1072 v_state, op, v_econtext);
1073 LLVMBuildBr(
b, opblocks[opno + 1]);
1078 LLVMTypeRef v_functype;
1079 LLVMValueRef v_func;
1080 LLVMValueRef v_params[3];
1083 v_func = l_ptr_const(op->
d.
cparam.paramfunc,
1084 LLVMPointerType(v_functype, 0));
1086 v_params[0] = v_state;
1088 v_params[2] = v_econtext;
1093 LLVMBuildBr(
b, opblocks[opno + 1]);
1100 LLVMTypeRef v_functype;
1101 LLVMValueRef v_func;
1102 LLVMValueRef v_params[3];
1107 LLVMPointerType(v_functype, 0));
1109 v_params[0] = v_state;
1111 v_params[2] = v_econtext;
1112 v_ret = LLVMBuildCall(
b,
1118 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
1119 l_sbool_const(1),
""),
1121 opblocks[jumpdone]);
1129 LLVMTypeRef v_functype;
1130 LLVMValueRef v_func;
1131 LLVMValueRef v_params[3];
1134 v_func = l_ptr_const(op->
d.
sbsref.subscriptfunc,
1135 LLVMPointerType(v_functype, 0));
1137 v_params[0] = v_state;
1139 v_params[2] = v_econtext;
1144 LLVMBuildBr(
b, opblocks[opno + 1]);
1150 LLVMBasicBlockRef b_avail,
1152 LLVMValueRef v_casevaluep,
1154 LLVMValueRef v_casenullp,
1156 LLVMValueRef v_casevaluenull;
1158 b_avail = l_bb_before_v(opblocks[opno + 1],
1159 "op.%d.avail", opno);
1160 b_notavail = l_bb_before_v(opblocks[opno + 1],
1161 "op.%d.notavail", opno);
1163 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1165 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1169 LLVMBuildICmp(
b, LLVMIntEQ,
1170 LLVMBuildPtrToInt(
b, v_casevaluep,
1172 l_sizet_const(0),
"");
1173 LLVMBuildCondBr(
b, v_casevaluenull, b_notavail, b_avail);
1176 LLVMPositionBuilderAtEnd(
b, b_avail);
1177 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1178 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1179 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1180 LLVMBuildStore(
b, v_casenull, v_resnullp);
1181 LLVMBuildBr(
b, opblocks[opno + 1]);
1184 LLVMPositionBuilderAtEnd(
b, b_notavail);
1186 l_load_struct_gep(
b, v_econtext,
1189 l_load_struct_gep(
b, v_econtext,
1191 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1192 LLVMBuildStore(
b, v_casenull, v_resnullp);
1194 LLVMBuildBr(
b, opblocks[opno + 1]);
1200 LLVMBasicBlockRef b_notnull;
1201 LLVMValueRef v_params[1];
1203 LLVMValueRef v_nullp;
1204 LLVMValueRef v_valuep;
1205 LLVMValueRef v_null;
1206 LLVMValueRef v_value;
1208 b_notnull = l_bb_before_v(opblocks[opno + 1],
1209 "op.%d.readonly.notnull", opno);
1214 v_null = LLVMBuildLoad(
b, v_nullp,
"");
1217 LLVMBuildStore(
b, v_null, v_resnullp);
1221 LLVMBuildICmp(
b, LLVMIntEQ, v_null,
1222 l_sbool_const(1),
""),
1223 opblocks[opno + 1], b_notnull);
1226 LLVMPositionBuilderAtEnd(
b, b_notnull);
1231 v_value = LLVMBuildLoad(
b, v_valuep,
"");
1233 v_params[0] = v_value;
1236 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1238 LLVMBuildStore(
b, v_ret, v_resvaluep);
1240 LLVMBuildBr(
b, opblocks[opno + 1]);
1248 LLVMValueRef v_fn_out,
1250 LLVMValueRef v_fcinfo_out,
1252 LLVMValueRef v_fcinfo_in_isnullp;
1253 LLVMValueRef v_retval;
1254 LLVMValueRef v_resvalue;
1255 LLVMValueRef v_resnull;
1257 LLVMValueRef v_output_skip;
1258 LLVMValueRef v_output;
1260 LLVMBasicBlockRef b_skipoutput;
1261 LLVMBasicBlockRef b_calloutput;
1262 LLVMBasicBlockRef b_input;
1263 LLVMBasicBlockRef b_inputcall;
1265 fcinfo_out = op->
d.
iocoerce.fcinfo_data_out;
1266 fcinfo_in = op->
d.
iocoerce.fcinfo_data_in;
1268 b_skipoutput = l_bb_before_v(opblocks[opno + 1],
1269 "op.%d.skipoutputnull", opno);
1270 b_calloutput = l_bb_before_v(opblocks[opno + 1],
1271 "op.%d.calloutput", opno);
1272 b_input = l_bb_before_v(opblocks[opno + 1],
1273 "op.%d.input", opno);
1274 b_inputcall = l_bb_before_v(opblocks[opno + 1],
1275 "op.%d.inputcall", opno);
1282 v_fcinfo_in_isnullp =
1283 LLVMBuildStructGEP(
b, v_fcinfo_in,
1285 "v_fcinfo_in_isnull");
1288 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1290 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1291 l_sbool_const(1),
""),
1295 LLVMPositionBuilderAtEnd(
b, b_skipoutput);
1296 v_output_skip = l_sizet_const(0);
1297 LLVMBuildBr(
b, b_input);
1299 LLVMPositionBuilderAtEnd(
b, b_calloutput);
1300 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
1305 l_funcvaluep(
b, v_fcinfo_out, 0));
1308 l_funcnullp(
b, v_fcinfo_out, 0));
1310 v_output = LLVMBuildCall(
b, v_fn_out, &v_fcinfo_out,
1311 1,
"funccall_coerce_out");
1312 LLVMBuildBr(
b, b_input);
1315 LLVMPositionBuilderAtEnd(
b, b_input);
1319 LLVMValueRef incoming_values[2];
1320 LLVMBasicBlockRef incoming_blocks[2];
1322 incoming_values[0] = v_output_skip;
1323 incoming_blocks[0] = b_skipoutput;
1325 incoming_values[1] = v_output;
1326 incoming_blocks[1] = b_calloutput;
1328 v_output = LLVMBuildPhi(
b,
TypeSizeT,
"output");
1329 LLVMAddIncoming(v_output,
1330 incoming_values, incoming_blocks,
1341 LLVMBuildICmp(
b, LLVMIntEQ, v_output,
1342 l_sizet_const(0),
""),
1348 LLVMBuildBr(
b, b_inputcall);
1351 LLVMPositionBuilderAtEnd(
b, b_inputcall);
1354 LLVMBuildStore(
b, v_output,
1355 l_funcvaluep(
b, v_fcinfo_in, 0));
1356 LLVMBuildStore(
b, v_resnull,
1357 l_funcnullp(
b, v_fcinfo_in, 0));
1363 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_in_isnullp);
1365 v_retval = LLVMBuildCall(
b, v_fn_in, &v_fcinfo_in, 1,
1366 "funccall_iocoerce_in");
1368 LLVMBuildStore(
b, v_retval, v_resvaluep);
1370 LLVMBuildBr(
b, opblocks[opno + 1]);
1379 LLVMValueRef v_fcinfo;
1380 LLVMValueRef v_fcinfo_isnull;
1382 LLVMValueRef v_argnull0,
1384 LLVMValueRef v_argnull1,
1387 LLVMValueRef v_anyargisnull;
1388 LLVMValueRef v_bothargisnull;
1390 LLVMValueRef v_result;
1392 LLVMBasicBlockRef b_noargnull;
1393 LLVMBasicBlockRef b_checkbothargnull;
1394 LLVMBasicBlockRef b_bothargnull;
1395 LLVMBasicBlockRef b_anyargnull;
1397 b_noargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.noargnull", opno);
1398 b_checkbothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.checkbothargnull", opno);
1399 b_bothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.bothargnull", opno);
1400 b_anyargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.anyargnull", opno);
1405 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1406 v_argisnull0 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1407 l_sbool_const(1),
"");
1408 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1409 v_argisnull1 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1410 l_sbool_const(1),
"");
1412 v_anyargisnull = LLVMBuildOr(
b, v_argisnull0, v_argisnull1,
"");
1413 v_bothargisnull = LLVMBuildAnd(
b, v_argisnull0, v_argisnull1,
"");
1420 LLVMBuildCondBr(
b, v_anyargisnull, b_checkbothargnull,
1426 LLVMPositionBuilderAtEnd(
b, b_checkbothargnull);
1427 LLVMBuildCondBr(
b, v_bothargisnull, b_bothargnull,
1432 LLVMPositionBuilderAtEnd(
b, b_bothargnull);
1433 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1435 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1437 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1439 LLVMBuildBr(
b, opblocks[opno + 1]);
1442 LLVMPositionBuilderAtEnd(
b, b_anyargnull);
1443 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1445 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1447 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1448 LLVMBuildBr(
b, opblocks[opno + 1]);
1451 LLVMPositionBuilderAtEnd(
b, b_noargnull);
1461 LLVMBuildICmp(
b, LLVMIntEQ,
1463 l_sizet_const(0),
""),
1467 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1468 LLVMBuildStore(
b, v_result, v_resvaluep);
1470 LLVMBuildBr(
b, opblocks[opno + 1]);
1478 LLVMValueRef v_fcinfo;
1479 LLVMValueRef v_fcinfo_isnull;
1480 LLVMValueRef v_argnull0;
1481 LLVMValueRef v_argnull1;
1482 LLVMValueRef v_anyargisnull;
1483 LLVMValueRef v_arg0;
1484 LLVMBasicBlockRef b_hasnull;
1485 LLVMBasicBlockRef b_nonull;
1486 LLVMBasicBlockRef b_argsequal;
1487 LLVMValueRef v_retval;
1488 LLVMValueRef v_argsequal;
1490 b_hasnull = l_bb_before_v(opblocks[opno + 1],
1491 "b.%d.null-args", opno);
1492 b_nonull = l_bb_before_v(opblocks[opno + 1],
1493 "b.%d.no-null-args", opno);
1494 b_argsequal = l_bb_before_v(opblocks[opno + 1],
1495 "b.%d.argsequal", opno);
1500 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1501 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1505 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1506 l_sbool_const(1),
""),
1507 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1508 l_sbool_const(1),
""),
1511 LLVMBuildCondBr(
b, v_anyargisnull, b_hasnull, b_nonull);
1514 LLVMPositionBuilderAtEnd(
b, b_hasnull);
1515 v_arg0 = l_funcvalue(
b, v_fcinfo, 0);
1516 LLVMBuildStore(
b, v_argnull0, v_resnullp);
1517 LLVMBuildStore(
b, v_arg0, v_resvaluep);
1518 LLVMBuildBr(
b, opblocks[opno + 1]);
1521 LLVMPositionBuilderAtEnd(
b, b_nonull);
1523 v_retval =
BuildV1Call(context,
b, mod, fcinfo, &v_fcinfo_isnull);
1530 v_argsequal = LLVMBuildAnd(
b,
1531 LLVMBuildICmp(
b, LLVMIntEQ,
1535 LLVMBuildICmp(
b, LLVMIntEQ,
1540 LLVMBuildCondBr(
b, v_argsequal, b_argsequal, b_hasnull);
1543 LLVMPositionBuilderAtEnd(
b, b_argsequal);
1544 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1545 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1546 LLVMBuildStore(
b, v_retval, v_resvaluep);
1548 LLVMBuildBr(
b, opblocks[opno + 1]);
1555 LLVMBuildBr(
b, opblocks[opno + 1]);
1561 LLVMBuildBr(
b, opblocks[opno + 1]);
1567 LLVMBuildBr(
b, opblocks[opno + 1]);
1573 LLVMBuildBr(
b, opblocks[opno + 1]);
1578 v_state, op, v_econtext);
1579 LLVMBuildBr(
b, opblocks[opno + 1]);
1585 LLVMBuildBr(
b, opblocks[opno + 1]);
1591 LLVMValueRef v_fcinfo_isnull;
1592 LLVMBasicBlockRef b_null;
1593 LLVMBasicBlockRef b_compare;
1594 LLVMBasicBlockRef b_compare_result;
1596 LLVMValueRef v_retval;
1598 b_null = l_bb_before_v(opblocks[opno + 1],
1599 "op.%d.row-null", opno);
1600 b_compare = l_bb_before_v(opblocks[opno + 1],
1601 "op.%d.row-compare", opno);
1603 l_bb_before_v(opblocks[opno + 1],
1604 "op.%d.row-compare-result",
1613 LLVMValueRef v_fcinfo;
1614 LLVMValueRef v_argnull0;
1615 LLVMValueRef v_argnull1;
1616 LLVMValueRef v_anyargisnull;
1618 v_fcinfo = l_ptr_const(fcinfo,
1621 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1622 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1631 LLVMBuildICmp(
b, LLVMIntEQ,
1633 l_sbool_const(1),
""),
1636 LLVMBuildCondBr(
b, v_anyargisnull, b_null, b_compare);
1640 LLVMBuildBr(
b, b_compare);
1644 LLVMPositionBuilderAtEnd(
b, b_compare);
1649 LLVMBuildStore(
b, v_retval, v_resvaluep);
1662 LLVMPositionBuilderAtEnd(
b, b_compare_result);
1669 l_sizet_const(0),
""),
1677 LLVMPositionBuilderAtEnd(
b, b_null);
1678 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1688 LLVMValueRef v_cmpresult;
1689 LLVMValueRef v_result;
1690 LLVMIntPredicate predicate;
1699 LLVMBuildLoad(
b, v_resvaluep,
""),
1700 LLVMInt32Type(),
"");
1705 predicate = LLVMIntSLT;
1708 predicate = LLVMIntSLE;
1711 predicate = LLVMIntSGT;
1714 predicate = LLVMIntSGE;
1723 v_result = LLVMBuildICmp(
b,
1728 v_result = LLVMBuildZExt(
b, v_result,
TypeSizeT,
"");
1730 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1731 LLVMBuildStore(
b, v_result, v_resvaluep);
1733 LLVMBuildBr(
b, opblocks[opno + 1]);
1740 LLVMBuildBr(
b, opblocks[opno + 1]);
1745 v_state, op, v_econtext);
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 LLVMBasicBlockRef b_avail,
1765 LLVMValueRef v_casevaluep,
1767 LLVMValueRef v_casenullp,
1769 LLVMValueRef v_casevaluenull;
1771 b_avail = l_bb_before_v(opblocks[opno + 1],
1772 "op.%d.avail", opno);
1773 b_notavail = l_bb_before_v(opblocks[opno + 1],
1774 "op.%d.notavail", opno);
1776 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1778 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1782 LLVMBuildICmp(
b, LLVMIntEQ,
1783 LLVMBuildPtrToInt(
b, v_casevaluep,
1785 l_sizet_const(0),
"");
1788 b_notavail, b_avail);
1791 LLVMPositionBuilderAtEnd(
b, b_avail);
1792 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1793 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1794 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1795 LLVMBuildStore(
b, v_casenull, v_resnullp);
1796 LLVMBuildBr(
b, opblocks[opno + 1]);
1799 LLVMPositionBuilderAtEnd(
b, b_notavail);
1801 l_load_struct_gep(
b, v_econtext,
1805 l_load_struct_gep(
b, v_econtext,
1808 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1809 LLVMBuildStore(
b, v_casenull, v_resnullp);
1811 LLVMBuildBr(
b, opblocks[opno + 1]);
1818 LLVMBuildBr(
b, opblocks[opno + 1]);
1824 LLVMBuildBr(
b, opblocks[opno + 1]);
1829 v_state, op, v_econtext);
1830 LLVMBuildBr(
b, opblocks[opno + 1]);
1836 LLVMBuildBr(
b, opblocks[opno + 1]);
1841 v_state, op, v_econtext);
1842 LLVMBuildBr(
b, opblocks[opno + 1]);
1848 LLVMBuildBr(
b, opblocks[opno + 1]);
1853 v_state, op, v_econtext);
1854 LLVMBuildBr(
b, opblocks[opno + 1]);
1860 LLVMBuildBr(
b, opblocks[opno + 1]);
1865 LLVMValueRef v_aggno;
1869 v_aggno = l_int32_const(op->
d.
aggref.aggno);
1872 value = l_load_gep1(
b, v_aggvalues, v_aggno,
"aggvalue");
1873 isnull = l_load_gep1(
b, v_aggnulls, v_aggno,
"aggnull");
1876 LLVMBuildStore(
b,
value, v_resvaluep);
1877 LLVMBuildStore(
b, isnull, v_resnullp);
1879 LLVMBuildBr(
b, opblocks[opno + 1]);
1886 LLVMBuildBr(
b, opblocks[opno + 1]);
1892 LLVMValueRef v_wfuncnop;
1893 LLVMValueRef v_wfuncno;
1902 v_wfuncnop = l_ptr_const(&wfunc->
wfuncno,
1903 l_ptr(LLVMInt32Type()));
1904 v_wfuncno = LLVMBuildLoad(
b, v_wfuncnop,
"v_wfuncno");
1907 value = l_load_gep1(
b, v_aggvalues, v_wfuncno,
1909 isnull = l_load_gep1(
b, v_aggnulls, v_wfuncno,
1912 LLVMBuildStore(
b,
value, v_resvaluep);
1913 LLVMBuildStore(
b, isnull, v_resnullp);
1915 LLVMBuildBr(
b, opblocks[opno + 1]);
1921 v_state, op, v_econtext);
1922 LLVMBuildBr(
b, opblocks[opno + 1]);
1931 LLVMValueRef v_retval;
1932 LLVMValueRef v_fcinfo_isnull;
1933 LLVMValueRef v_tmpcontext;
1934 LLVMValueRef v_oldcontext;
1938 LLVMValueRef v_fcinfo;
1939 LLVMValueRef v_argnull0;
1940 LLVMBasicBlockRef b_deserialize;
1942 b_deserialize = l_bb_before_v(opblocks[opno + 1],
1943 "op.%d.deserialize", opno);
1945 v_fcinfo = l_ptr_const(fcinfo,
1947 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1957 LLVMPositionBuilderAtEnd(
b, b_deserialize);
1966 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
1969 l_mcxt_switch(mod,
b, v_oldcontext);
1971 LLVMBuildStore(
b, v_retval, v_resvaluep);
1972 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1974 LLVMBuildBr(
b, opblocks[opno + 1]);
1986 LLVMValueRef v_argsp;
1987 LLVMValueRef v_nullsp;
1988 LLVMBasicBlockRef *b_checknulls;
1997 b_checknulls =
palloc(
sizeof(LLVMBasicBlockRef *) * nargs);
1998 for (
int argno = 0; argno < nargs; argno++)
2000 b_checknulls[argno] =
2001 l_bb_before_v(opblocks[opno + 1],
2002 "op.%d.check-null.%d",
2006 LLVMBuildBr(
b, b_checknulls[0]);
2009 for (
int argno = 0; argno < nargs; argno++)
2011 LLVMValueRef v_argno = l_int32_const(argno);
2012 LLVMValueRef v_argisnull;
2013 LLVMBasicBlockRef b_argnotnull;
2015 LLVMPositionBuilderAtEnd(
b, b_checknulls[argno]);
2017 if (argno + 1 == nargs)
2018 b_argnotnull = opblocks[opno + 1];
2020 b_argnotnull = b_checknulls[argno + 1];
2023 v_argisnull = l_load_gep1(
b, v_nullsp, v_argno,
"");
2026 LLVMValueRef v_argn;
2028 v_argn = LLVMBuildGEP(
b, v_argsp, &v_argno, 1,
"");
2030 l_load_struct_gep(
b, v_argn,
2039 l_sbool_const(1),
""),
2050 LLVMValueRef v_aggstatep;
2051 LLVMValueRef v_allpergroupsp;
2052 LLVMValueRef v_pergroup_allaggs;
2053 LLVMValueRef v_setoff;
2061 v_aggstatep = LLVMBuildBitCast(
b, v_parent,
2064 v_allpergroupsp = l_load_struct_gep(
b, v_aggstatep,
2066 "aggstate.all_pergroups");
2070 v_pergroup_allaggs = l_load_gep1(
b, v_allpergroupsp, v_setoff,
"");
2073 LLVMBuildICmp(
b, LLVMIntEQ,
2074 LLVMBuildPtrToInt(
b, v_pergroup_allaggs,
TypeSizeT,
""),
2075 l_sizet_const(0),
""),
2077 opblocks[opno + 1]);
2092 LLVMValueRef v_aggstatep;
2093 LLVMValueRef v_fcinfo;
2094 LLVMValueRef v_fcinfo_isnull;
2096 LLVMValueRef v_transvaluep;
2097 LLVMValueRef v_transnullp;
2099 LLVMValueRef v_setoff;
2100 LLVMValueRef v_transno;
2102 LLVMValueRef v_aggcontext;
2104 LLVMValueRef v_allpergroupsp;
2105 LLVMValueRef v_current_setp;
2106 LLVMValueRef v_current_pertransp;
2107 LLVMValueRef v_curaggcontext;
2109 LLVMValueRef v_pertransp;
2111 LLVMValueRef v_pergroupp;
2113 LLVMValueRef v_retval;
2115 LLVMValueRef v_tmpcontext;
2116 LLVMValueRef v_oldcontext;
2125 v_pertransp = l_ptr_const(pertrans,
2133 l_load_struct_gep(
b, v_aggstatep,
2135 "aggstate.all_pergroups");
2136 v_setoff = l_int32_const(op->
d.
agg_trans.setoff);
2137 v_transno = l_int32_const(op->
d.
agg_trans.transno);
2140 l_load_gep1(
b, v_allpergroupsp, v_setoff,
""),
2147 LLVMValueRef v_notransvalue;
2148 LLVMBasicBlockRef b_init;
2149 LLVMBasicBlockRef b_no_init;
2152 l_load_struct_gep(
b, v_pergroupp,
2156 b_init = l_bb_before_v(opblocks[opno + 1],
2157 "op.%d.inittrans", opno);
2158 b_no_init = l_bb_before_v(opblocks[opno + 1],
2159 "op.%d.no_inittrans", opno);
2162 LLVMBuildICmp(
b, LLVMIntEQ, v_notransvalue,
2163 l_sbool_const(1),
""),
2169 LLVMValueRef params[4];
2171 LLVMPositionBuilderAtEnd(
b, b_init);
2173 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2176 params[0] = v_aggstatep;
2177 params[1] = v_pertransp;
2178 params[2] = v_pergroupp;
2179 params[3] = v_aggcontext;
2186 LLVMBuildBr(
b, opblocks[opno + 1]);
2189 LLVMPositionBuilderAtEnd(
b, b_no_init);
2197 LLVMValueRef v_transnull;
2198 LLVMBasicBlockRef b_strictpass;
2200 b_strictpass = l_bb_before_v(opblocks[opno + 1],
2201 "op.%d.strictpass", opno);
2203 l_load_struct_gep(
b, v_pergroupp,
2208 LLVMBuildICmp(
b, LLVMIntEQ, v_transnull,
2209 l_sbool_const(1),
""),
2213 LLVMPositionBuilderAtEnd(
b, b_strictpass);
2217 v_fcinfo = l_ptr_const(fcinfo,
2219 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2223 LLVMBuildStructGEP(
b,
2226 "aggstate.current_set");
2228 LLVMBuildStructGEP(
b,
2231 "aggstate.curaggcontext");
2232 v_current_pertransp =
2233 LLVMBuildStructGEP(
b,
2236 "aggstate.curpertrans");
2239 LLVMBuildStore(
b, v_aggcontext, v_curaggcontext);
2240 LLVMBuildStore(
b, l_int32_const(op->
d.
agg_trans.setno),
2242 LLVMBuildStore(
b, v_pertransp, v_current_pertransp);
2248 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2252 LLVMBuildStructGEP(
b, v_pergroupp,
2256 LLVMBuildStructGEP(
b, v_pergroupp,
2260 LLVMBuildLoad(
b, v_transvaluep,
2262 l_funcvaluep(
b, v_fcinfo, 0));
2264 LLVMBuildLoad(
b, v_transnullp,
"transnull"),
2265 l_funcnullp(
b, v_fcinfo, 0));
2284 LLVMBasicBlockRef b_call;
2285 LLVMBasicBlockRef b_nocall;
2287 LLVMValueRef v_transvalue;
2288 LLVMValueRef v_transnull;
2289 LLVMValueRef v_newval;
2290 LLVMValueRef params[6];
2292 b_call = l_bb_before_v(opblocks[opno + 1],
2293 "op.%d.transcall", opno);
2294 b_nocall = l_bb_before_v(opblocks[opno + 1],
2295 "op.%d.transnocall", opno);
2297 v_transvalue = LLVMBuildLoad(
b, v_transvaluep,
"");
2298 v_transnull = LLVMBuildLoad(
b, v_transnullp,
"");
2305 LLVMBuildICmp(
b, LLVMIntEQ,
2311 LLVMPositionBuilderAtEnd(
b, b_call);
2313 params[0] = v_aggstatep;
2314 params[1] = v_pertransp;
2315 params[2] = v_retval;
2316 params[3] = LLVMBuildTrunc(
b, v_fcinfo_isnull,
2318 params[4] = v_transvalue;
2319 params[5] = LLVMBuildTrunc(
b, v_transnull,
2324 LLVMBuildCall(
b, v_fn,
2329 LLVMBuildStore(
b, v_newval, v_transvaluep);
2330 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2332 l_mcxt_switch(mod,
b, v_oldcontext);
2333 LLVMBuildBr(
b, opblocks[opno + 1]);
2336 LLVMPositionBuilderAtEnd(
b, b_nocall);
2340 LLVMBuildStore(
b, v_retval, v_transvaluep);
2341 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2343 l_mcxt_switch(mod,
b, v_oldcontext);
2345 LLVMBuildBr(
b, opblocks[opno + 1]);
2355 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctSingle");
2356 LLVMValueRef v_args[2];
2362 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2366 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2367 l_sbool_const(1),
""),
2369 opblocks[jumpdistinct]);
2379 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctMulti");
2380 LLVMValueRef v_args[2];
2386 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2390 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2391 l_sbool_const(1),
""),
2393 opblocks[jumpdistinct]);
2399 v_state, op, v_econtext);
2400 LLVMBuildBr(
b, opblocks[opno + 1]);
2405 v_state, op, v_econtext);
2406 LLVMBuildBr(
b, opblocks[opno + 1]);
2415 LLVMDisposeBuilder(
b);
2431 state->evalfunc_private = cstate;
2438 endtime, starttime);
2466 state->evalfunc = func;
2468 return func(
state, econtext, isNull);
2474 LLVMValueRef *v_fcinfo_isnull)
2477 LLVMValueRef v_fcinfo_isnullp;
2478 LLVMValueRef v_retval;
2479 LLVMValueRef v_fcinfo;
2484 v_fcinfo_isnullp = LLVMBuildStructGEP(
b, v_fcinfo,
2487 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_isnullp);
2489 v_retval = LLVMBuildCall(
b, v_fn, &v_fcinfo, 1,
"funccall");
2491 if (v_fcinfo_isnull)
2492 *v_fcinfo_isnull = LLVMBuildLoad(
b, v_fcinfo_isnullp,
"");
2500 LLVMValueRef params[2];
2503 params[1] = l_ptr_const(fcinfo->
args, l_ptr(LLVMInt8Type()));
2504 LLVMBuildCall(
b, v_lifetime, params,
lengthof(params),
"");
2506 params[0] = l_int64_const(
sizeof(fcinfo->
isnull));
2507 params[1] = l_ptr_const(&fcinfo->
isnull, l_ptr(LLVMInt8Type()));
2508 LLVMBuildCall(
b, v_lifetime, params,
lengthof(params),
"");
2520 int nargs, LLVMValueRef *v_args)
2523 LLVMValueRef *params;
2528 if (LLVMCountParams(v_fn) != (nargs + 2))
2529 elog(
ERROR,
"parameter mismatch: %s expects %d passed %d",
2530 funcname, LLVMCountParams(v_fn), nargs + 2);
2532 params =
palloc(
sizeof(LLVMValueRef) * (2 + nargs));
2534 params[argno++] = v_state;
2537 for (
int i = 0;
i < nargs;
i++)
2538 params[argno++] = v_args[
i];
2540 v_ret = LLVMBuildCall(
b, v_fn, params, argno,
"");
2552 LLVMTypeRef param_types[2];
2555 #if LLVM_VERSION_MAJOR < 5
2556 const char *nm =
"llvm.lifetime.end";
2558 const char *nm =
"llvm.lifetime.end.p0i8";
2561 fn = LLVMGetNamedFunction(mod, nm);
2565 param_types[0] = LLVMInt64Type();
2566 param_types[1] = l_ptr(LLVMInt8Type());
2568 sig = LLVMFunctionType(LLVMVoidType(),
2569 param_types,
lengthof(param_types),
2571 fn = LLVMAddFunction(mod, nm,
sig);
2573 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::@50::@90 agg_strict_input_check
struct ExprEvalStep::@50::@58 boolexpr
struct ExprEvalStep::@50::@51 fetch
struct ExprEvalStep::@50::@89 agg_deserialize
struct ExprEvalStep::@50::@77 sbsref_subscript
struct ExprEvalStep::@50::@52 var
struct ExprEvalStep::@50::@87 window_func
struct ExprEvalStep::@50::@59 qualexpr
struct ExprEvalStep::@50::@85 aggref
struct ExprEvalStep::@50::@60 jump
struct ExprEvalStep::@50::@56 constval
struct ExprEvalStep::@50::@65 make_readonly
struct ExprEvalStep::@50::@57 func
union ExprEvalStep::@50 d
struct ExprEvalStep::@50::@93 agg_trans
struct ExprEvalStep::@50::@63 cparam
struct ExprEvalStep::@50::@73 rowcompare_final
struct ExprEvalStep::@50::@54 assign_var
struct ExprEvalStep::@50::@92 agg_presorted_distinctcheck
struct ExprEvalStep::@50::@66 iocoerce
struct ExprEvalStep::@50::@55 assign_tmp
struct ExprEvalStep::@50::@78 sbsref
struct ExprEvalStep::@50::@72 rowcompare_step
struct ExprEvalStep::@50::@64 casetest
struct ExprEvalStep::@50::@91 agg_plain_pergroup_nullcheck
NullableDatum args[FLEXIBLE_ARRAY_MEMBER]
static void * fn(void *arg)
#define FIELDNO_TUPLETABLESLOT_ISNULL
#define FIELDNO_TUPLETABLESLOT_VALUES
#define FIELDNO_TUPLETABLESLOT_NVALID