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_resultslot;
111 LLVMValueRef v_innervalues;
112 LLVMValueRef v_innernulls;
113 LLVMValueRef v_outervalues;
114 LLVMValueRef v_outernulls;
115 LLVMValueRef v_scanvalues;
116 LLVMValueRef v_scannulls;
117 LLVMValueRef v_resultvalues;
118 LLVMValueRef v_resultnulls;
121 LLVMValueRef v_aggvalues;
122 LLVMValueRef v_aggnulls;
139 context = (LLVMJitContext *) parent->
state->
es_jit;
149 lc = LLVMGetModuleContext(mod);
151 b = LLVMCreateBuilderInContext(lc);
156 eval_fn = LLVMAddFunction(mod,
funcname,
158 LLVMSetLinkage(eval_fn, LLVMExternalLinkage);
159 LLVMSetVisibility(eval_fn, LLVMDefaultVisibility);
162 entry = LLVMAppendBasicBlockInContext(lc, eval_fn,
"entry");
165 v_state = LLVMGetParam(eval_fn, 0);
166 v_econtext = LLVMGetParam(eval_fn, 1);
167 v_isnullp = LLVMGetParam(eval_fn, 2);
169 LLVMPositionBuilderAtEnd(
b, entry);
171 v_tmpvaluep = LLVMBuildStructGEP(
b, v_state,
174 v_tmpisnullp = LLVMBuildStructGEP(
b, v_state,
177 v_parent = l_load_struct_gep(
b, v_state,
182 v_scanslot = l_load_struct_gep(
b, v_econtext,
185 v_innerslot = l_load_struct_gep(
b, v_econtext,
188 v_outerslot = l_load_struct_gep(
b, v_econtext,
191 v_resultslot = l_load_struct_gep(
b, v_state,
196 v_scanvalues = l_load_struct_gep(
b, v_scanslot,
199 v_scannulls = l_load_struct_gep(
b, v_scanslot,
202 v_innervalues = l_load_struct_gep(
b, v_innerslot,
205 v_innernulls = l_load_struct_gep(
b, v_innerslot,
208 v_outervalues = l_load_struct_gep(
b, v_outerslot,
211 v_outernulls = l_load_struct_gep(
b, v_outerslot,
214 v_resultvalues = l_load_struct_gep(
b, v_resultslot,
217 v_resultnulls = l_load_struct_gep(
b, v_resultslot,
222 v_aggvalues = l_load_struct_gep(
b, v_econtext,
224 "v.econtext.aggvalues");
225 v_aggnulls = l_load_struct_gep(
b, v_econtext,
227 "v.econtext.aggnulls");
230 opblocks =
palloc(
sizeof(LLVMBasicBlockRef) *
state->steps_len);
231 for (
int opno = 0; opno <
state->steps_len; opno++)
232 opblocks[opno] = l_bb_append_v(eval_fn,
"b.op.%d.start", opno);
235 LLVMBuildBr(
b, opblocks[0]);
237 for (
int opno = 0; opno <
state->steps_len; opno++)
241 LLVMValueRef v_resvaluep;
242 LLVMValueRef v_resnullp;
244 LLVMPositionBuilderAtEnd(
b, opblocks[opno]);
246 op = &
state->steps[opno];
256 LLVMValueRef v_tmpisnull;
257 LLVMValueRef v_tmpvalue;
259 v_tmpvalue = LLVMBuildLoad(
b, v_tmpvaluep,
"");
260 v_tmpisnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
262 LLVMBuildStore(
b, v_tmpisnull, v_isnullp);
264 LLVMBuildRet(
b, v_tmpvalue);
274 LLVMBasicBlockRef b_fetch;
275 LLVMValueRef v_nvalid;
276 LLVMValueRef l_jit_deform = NULL;
279 b_fetch = l_bb_before_v(opblocks[opno + 1],
280 "op.%d.fetch", opno);
282 if (op->
d.
fetch.known_desc)
283 desc = op->
d.
fetch.known_desc;
286 tts_ops = op->
d.
fetch.kind;
292 v_slot = v_innerslot;
294 v_slot = v_outerslot;
303 l_load_struct_gep(
b, v_slot,
307 LLVMBuildICmp(
b, LLVMIntUGE, v_nvalid,
308 l_int16_const(lc, op->
d.
fetch.last_var),
310 opblocks[opno + 1], b_fetch);
312 LLVMPositionBuilderAtEnd(
b, b_fetch);
320 if (tts_ops && desc && (context->base.flags &
PGJIT_DEFORM))
329 deform_endtime, deform_starttime);
334 LLVMValueRef params[1];
338 LLVMBuildCall(
b, l_jit_deform,
343 LLVMValueRef params[2];
346 params[1] = l_int32_const(lc, op->
d.
fetch.last_var);
353 LLVMBuildBr(
b, opblocks[opno + 1]);
363 LLVMValueRef v_attnum;
364 LLVMValueRef v_values;
365 LLVMValueRef v_nulls;
369 v_values = v_innervalues;
370 v_nulls = v_innernulls;
374 v_values = v_outervalues;
375 v_nulls = v_outernulls;
379 v_values = v_scanvalues;
380 v_nulls = v_scannulls;
383 v_attnum = l_int32_const(lc, op->
d.
var.attnum);
384 value = l_load_gep1(
b, v_values, v_attnum,
"");
385 isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
386 LLVMBuildStore(
b,
value, v_resvaluep);
387 LLVMBuildStore(
b, isnull, v_resnullp);
389 LLVMBuildBr(
b, opblocks[opno + 1]);
400 v_slot = v_innerslot;
402 v_slot = v_outerslot;
407 v_state, op, v_econtext, v_slot);
409 LLVMBuildBr(
b, opblocks[opno + 1]);
415 v_state, op, v_econtext);
416 LLVMBuildBr(
b, opblocks[opno + 1]);
423 LLVMValueRef v_value;
424 LLVMValueRef v_isnull;
425 LLVMValueRef v_rvaluep;
426 LLVMValueRef v_risnullp;
427 LLVMValueRef v_attnum;
428 LLVMValueRef v_resultnum;
429 LLVMValueRef v_values;
430 LLVMValueRef v_nulls;
434 v_values = v_innervalues;
435 v_nulls = v_innernulls;
439 v_values = v_outervalues;
440 v_nulls = v_outernulls;
444 v_values = v_scanvalues;
445 v_nulls = v_scannulls;
449 v_attnum = l_int32_const(lc, op->
d.
assign_var.attnum);
450 v_value = l_load_gep1(
b, v_values, v_attnum,
"");
451 v_isnull = l_load_gep1(
b, v_nulls, v_attnum,
"");
454 v_resultnum = l_int32_const(lc, op->
d.
assign_var.resultnum);
455 v_rvaluep = LLVMBuildGEP(
b, v_resultvalues,
456 &v_resultnum, 1,
"");
457 v_risnullp = LLVMBuildGEP(
b, v_resultnulls,
458 &v_resultnum, 1,
"");
461 LLVMBuildStore(
b, v_value, v_rvaluep);
462 LLVMBuildStore(
b, v_isnull, v_risnullp);
464 LLVMBuildBr(
b, opblocks[opno + 1]);
471 LLVMValueRef v_value,
473 LLVMValueRef v_rvaluep,
475 LLVMValueRef v_resultnum;
479 v_value = LLVMBuildLoad(
b, v_tmpvaluep,
"");
480 v_isnull = LLVMBuildLoad(
b, v_tmpisnullp,
"");
483 v_resultnum = l_int32_const(lc, resultnum);
485 LLVMBuildGEP(
b, v_resultvalues, &v_resultnum, 1,
"");
487 LLVMBuildGEP(
b, v_resultnulls, &v_resultnum, 1,
"");
490 LLVMBuildStore(
b, v_isnull, v_risnullp);
495 LLVMBasicBlockRef b_notnull;
496 LLVMValueRef v_params[1];
498 b_notnull = l_bb_before_v(opblocks[opno + 1],
499 "op.%d.assign_tmp.notnull", opno);
503 LLVMBuildICmp(
b, LLVMIntEQ, v_isnull,
504 l_sbool_const(0),
""),
505 b_notnull, opblocks[opno + 1]);
508 LLVMPositionBuilderAtEnd(
b, b_notnull);
509 v_params[0] = v_value;
512 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
522 LLVMBuildStore(
b, v_value, v_rvaluep);
524 LLVMBuildBr(
b, opblocks[opno + 1]);
530 LLVMValueRef v_constvalue,
533 v_constvalue = l_sizet_const(op->
d.
constval.value);
534 v_constnull = l_sbool_const(op->
d.
constval.isnull);
536 LLVMBuildStore(
b, v_constvalue, v_resvaluep);
537 LLVMBuildStore(
b, v_constnull, v_resnullp);
539 LLVMBuildBr(
b, opblocks[opno + 1]);
547 LLVMValueRef v_fcinfo_isnull;
548 LLVMValueRef v_retval;
552 LLVMBasicBlockRef b_nonull;
553 LLVMBasicBlockRef *b_checkargnulls;
554 LLVMValueRef v_fcinfo;
560 b_nonull = l_bb_before_v(opblocks[opno + 1],
561 "b.%d.no-null-args", opno);
564 if (op->
d.
func.nargs == 0)
565 elog(
ERROR,
"argumentless strict functions are pointless");
574 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
578 palloc(
sizeof(LLVMBasicBlockRef *) * op->
d.
func.nargs);
579 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
580 b_checkargnulls[argno] =
581 l_bb_before_v(b_nonull,
"b.%d.isnull.%d", opno,
585 LLVMBuildBr(
b, b_checkargnulls[0]);
588 for (
int argno = 0; argno < op->
d.
func.nargs; argno++)
590 LLVMValueRef v_argisnull;
591 LLVMBasicBlockRef b_argnotnull;
593 LLVMPositionBuilderAtEnd(
b, b_checkargnulls[argno]);
599 if (argno + 1 == op->
d.
func.nargs)
600 b_argnotnull = b_nonull;
602 b_argnotnull = b_checkargnulls[argno + 1];
605 v_argisnull = l_funcnull(
b, v_fcinfo, argno);
607 LLVMBuildICmp(
b, LLVMIntEQ,
615 LLVMPositionBuilderAtEnd(
b, b_nonull);
620 LLVMBuildStore(
b, v_retval, v_resvaluep);
621 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
623 LLVMBuildBr(
b, opblocks[opno + 1]);
629 v_state, op, v_econtext);
630 LLVMBuildBr(
b, opblocks[opno + 1]);
636 v_state, op, v_econtext);
637 LLVMBuildBr(
b, opblocks[opno + 1]);
649 LLVMValueRef v_boolvalue;
650 LLVMValueRef v_boolnull;
651 LLVMValueRef v_boolanynullp,
653 LLVMBasicBlockRef b_boolisnull;
654 LLVMBasicBlockRef b_boolcheckfalse;
655 LLVMBasicBlockRef b_boolisfalse;
656 LLVMBasicBlockRef b_boolcont;
657 LLVMBasicBlockRef b_boolisanynull;
659 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
660 "b.%d.boolisnull", opno);
661 b_boolcheckfalse = l_bb_before_v(opblocks[opno + 1],
662 "b.%d.boolcheckfalse", opno);
663 b_boolisfalse = l_bb_before_v(opblocks[opno + 1],
664 "b.%d.boolisfalse", opno);
665 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
666 "b.%d.boolisanynull", opno);
667 b_boolcont = l_bb_before_v(opblocks[opno + 1],
668 "b.%d.boolcont", opno);
670 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
674 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
676 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
677 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
680 LLVMBuildStore(
b, v_boolnull, v_resnullp);
682 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
686 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
687 l_sbool_const(1),
""),
692 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
694 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
696 LLVMBuildBr(
b, b_boolcont);
699 LLVMPositionBuilderAtEnd(
b, b_boolcheckfalse);
701 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
702 l_sizet_const(0),
""),
710 LLVMPositionBuilderAtEnd(
b, b_boolisfalse);
713 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
716 LLVMPositionBuilderAtEnd(
b, b_boolcont);
718 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
722 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
723 l_sbool_const(0),
""),
724 opblocks[opno + 1], b_boolisanynull);
726 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
728 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
730 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
732 LLVMBuildBr(
b, opblocks[opno + 1]);
745 LLVMValueRef v_boolvalue;
746 LLVMValueRef v_boolnull;
747 LLVMValueRef v_boolanynullp,
750 LLVMBasicBlockRef b_boolisnull;
751 LLVMBasicBlockRef b_boolchecktrue;
752 LLVMBasicBlockRef b_boolistrue;
753 LLVMBasicBlockRef b_boolcont;
754 LLVMBasicBlockRef b_boolisanynull;
756 b_boolisnull = l_bb_before_v(opblocks[opno + 1],
757 "b.%d.boolisnull", opno);
758 b_boolchecktrue = l_bb_before_v(opblocks[opno + 1],
759 "b.%d.boolchecktrue", opno);
760 b_boolistrue = l_bb_before_v(opblocks[opno + 1],
761 "b.%d.boolistrue", opno);
762 b_boolisanynull = l_bb_before_v(opblocks[opno + 1],
763 "b.%d.boolisanynull", opno);
764 b_boolcont = l_bb_before_v(opblocks[opno + 1],
765 "b.%d.boolcont", opno);
767 v_boolanynullp = l_ptr_const(op->
d.
boolexpr.anynull,
771 LLVMBuildStore(
b, l_sbool_const(0), v_boolanynullp);
772 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
773 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
776 LLVMBuildStore(
b, v_boolnull, v_resnullp);
778 LLVMBuildStore(
b, v_boolvalue, v_resvaluep);
781 LLVMBuildICmp(
b, LLVMIntEQ, v_boolnull,
782 l_sbool_const(1),
""),
787 LLVMPositionBuilderAtEnd(
b, b_boolisnull);
789 LLVMBuildStore(
b, l_sbool_const(1), v_boolanynullp);
791 LLVMBuildBr(
b, b_boolcont);
794 LLVMPositionBuilderAtEnd(
b, b_boolchecktrue);
796 LLVMBuildICmp(
b, LLVMIntEQ, v_boolvalue,
797 l_sizet_const(1),
""),
805 LLVMPositionBuilderAtEnd(
b, b_boolistrue);
808 LLVMBuildBr(
b, opblocks[op->
d.
boolexpr.jumpdone]);
811 LLVMPositionBuilderAtEnd(
b, b_boolcont);
813 v_boolanynull = LLVMBuildLoad(
b, v_boolanynullp,
"");
817 LLVMBuildICmp(
b, LLVMIntEQ, v_boolanynull,
818 l_sbool_const(0),
""),
819 opblocks[opno + 1], b_boolisanynull);
821 LLVMPositionBuilderAtEnd(
b, b_boolisanynull);
823 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
825 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
827 LLVMBuildBr(
b, opblocks[opno + 1]);
833 LLVMValueRef v_boolvalue;
834 LLVMValueRef v_boolnull;
835 LLVMValueRef v_negbool;
837 v_boolnull = LLVMBuildLoad(
b, v_resnullp,
"");
838 v_boolvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
840 v_negbool = LLVMBuildZExt(
b,
841 LLVMBuildICmp(
b, LLVMIntEQ,
847 LLVMBuildStore(
b, v_boolnull, v_resnullp);
849 LLVMBuildStore(
b, v_negbool, v_resvaluep);
851 LLVMBuildBr(
b, opblocks[opno + 1]);
857 LLVMValueRef v_resnull;
858 LLVMValueRef v_resvalue;
859 LLVMValueRef v_nullorfalse;
860 LLVMBasicBlockRef b_qualfail;
862 b_qualfail = l_bb_before_v(opblocks[opno + 1],
863 "op.%d.qualfail", opno);
865 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
866 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
870 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
871 l_sbool_const(1),
""),
872 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
873 l_sizet_const(0),
""),
882 LLVMPositionBuilderAtEnd(
b, b_qualfail);
884 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
886 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
888 LLVMBuildBr(
b, opblocks[op->
d.
qualexpr.jumpdone]);
894 LLVMBuildBr(
b, opblocks[op->
d.
jump.jumpdone]);
900 LLVMValueRef v_resnull;
904 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
907 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
908 l_sbool_const(1),
""),
909 opblocks[op->
d.
jump.jumpdone],
916 LLVMValueRef v_resnull;
920 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
923 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
924 l_sbool_const(0),
""),
925 opblocks[op->
d.
jump.jumpdone],
933 LLVMValueRef v_resnull;
934 LLVMValueRef v_resvalue;
935 LLVMValueRef v_nullorfalse;
939 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
940 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
944 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
945 l_sbool_const(1),
""),
946 LLVMBuildICmp(
b, LLVMIntEQ, v_resvalue,
947 l_sizet_const(0),
""),
952 opblocks[op->
d.
jump.jumpdone],
959 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
960 LLVMValueRef v_resvalue;
964 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
965 l_sbool_const(1),
""),
969 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
970 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
972 LLVMBuildBr(
b, opblocks[opno + 1]);
978 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
979 LLVMValueRef v_resvalue;
983 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
984 l_sbool_const(1),
""),
988 LLVMBuildStore(
b, v_resvalue, v_resvaluep);
989 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
991 LLVMBuildBr(
b, opblocks[opno + 1]);
997 v_state, op, v_econtext);
998 LLVMBuildBr(
b, opblocks[opno + 1]);
1003 v_state, op, v_econtext);
1004 LLVMBuildBr(
b, opblocks[opno + 1]);
1012 LLVMBasicBlockRef b_isnull,
1014 LLVMValueRef v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1016 b_isnull = l_bb_before_v(opblocks[opno + 1],
1017 "op.%d.isnull", opno);
1018 b_notnull = l_bb_before_v(opblocks[opno + 1],
1019 "op.%d.isnotnull", opno);
1023 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1024 l_sbool_const(1),
""),
1025 b_isnull, b_notnull);
1028 LLVMPositionBuilderAtEnd(
b, b_isnull);
1031 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1036 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1040 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1043 LLVMBuildBr(
b, opblocks[opno + 1]);
1045 LLVMPositionBuilderAtEnd(
b, b_notnull);
1057 LLVMValueRef v_value =
1058 LLVMBuildLoad(
b, v_resvaluep,
"");
1060 v_value = LLVMBuildZExt(
b,
1061 LLVMBuildICmp(
b, LLVMIntEQ,
1066 LLVMBuildStore(
b, v_value, v_resvaluep);
1068 LLVMBuildBr(
b, opblocks[opno + 1]);
1074 v_state, op, v_econtext);
1075 LLVMBuildBr(
b, opblocks[opno + 1]);
1080 v_state, op, v_econtext);
1081 LLVMBuildBr(
b, opblocks[opno + 1]);
1086 LLVMTypeRef v_functype;
1087 LLVMValueRef v_func;
1088 LLVMValueRef v_params[3];
1091 v_func = l_ptr_const(op->
d.
cparam.paramfunc,
1092 LLVMPointerType(v_functype, 0));
1094 v_params[0] = v_state;
1096 v_params[2] = v_econtext;
1101 LLVMBuildBr(
b, opblocks[opno + 1]);
1108 LLVMTypeRef v_functype;
1109 LLVMValueRef v_func;
1110 LLVMValueRef v_params[3];
1115 LLVMPointerType(v_functype, 0));
1117 v_params[0] = v_state;
1119 v_params[2] = v_econtext;
1120 v_ret = LLVMBuildCall(
b,
1126 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
1127 l_sbool_const(1),
""),
1129 opblocks[jumpdone]);
1137 LLVMTypeRef v_functype;
1138 LLVMValueRef v_func;
1139 LLVMValueRef v_params[3];
1142 v_func = l_ptr_const(op->
d.
sbsref.subscriptfunc,
1143 LLVMPointerType(v_functype, 0));
1145 v_params[0] = v_state;
1147 v_params[2] = v_econtext;
1152 LLVMBuildBr(
b, opblocks[opno + 1]);
1158 LLVMBasicBlockRef b_avail,
1160 LLVMValueRef v_casevaluep,
1162 LLVMValueRef v_casenullp,
1164 LLVMValueRef v_casevaluenull;
1166 b_avail = l_bb_before_v(opblocks[opno + 1],
1167 "op.%d.avail", opno);
1168 b_notavail = l_bb_before_v(opblocks[opno + 1],
1169 "op.%d.notavail", opno);
1171 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1173 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1177 LLVMBuildICmp(
b, LLVMIntEQ,
1178 LLVMBuildPtrToInt(
b, v_casevaluep,
1180 l_sizet_const(0),
"");
1181 LLVMBuildCondBr(
b, v_casevaluenull, b_notavail, b_avail);
1184 LLVMPositionBuilderAtEnd(
b, b_avail);
1185 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1186 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1187 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1188 LLVMBuildStore(
b, v_casenull, v_resnullp);
1189 LLVMBuildBr(
b, opblocks[opno + 1]);
1192 LLVMPositionBuilderAtEnd(
b, b_notavail);
1194 l_load_struct_gep(
b, v_econtext,
1197 l_load_struct_gep(
b, v_econtext,
1199 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1200 LLVMBuildStore(
b, v_casenull, v_resnullp);
1202 LLVMBuildBr(
b, opblocks[opno + 1]);
1208 LLVMBasicBlockRef b_notnull;
1209 LLVMValueRef v_params[1];
1211 LLVMValueRef v_nullp;
1212 LLVMValueRef v_valuep;
1213 LLVMValueRef v_null;
1214 LLVMValueRef v_value;
1216 b_notnull = l_bb_before_v(opblocks[opno + 1],
1217 "op.%d.readonly.notnull", opno);
1222 v_null = LLVMBuildLoad(
b, v_nullp,
"");
1225 LLVMBuildStore(
b, v_null, v_resnullp);
1229 LLVMBuildICmp(
b, LLVMIntEQ, v_null,
1230 l_sbool_const(1),
""),
1231 opblocks[opno + 1], b_notnull);
1234 LLVMPositionBuilderAtEnd(
b, b_notnull);
1239 v_value = LLVMBuildLoad(
b, v_valuep,
"");
1241 v_params[0] = v_value;
1244 llvm_pg_func(mod,
"MakeExpandedObjectReadOnlyInternal"),
1246 LLVMBuildStore(
b, v_ret, v_resvaluep);
1248 LLVMBuildBr(
b, opblocks[opno + 1]);
1256 LLVMValueRef v_fn_out,
1258 LLVMValueRef v_fcinfo_out,
1260 LLVMValueRef v_fcinfo_in_isnullp;
1261 LLVMValueRef v_retval;
1262 LLVMValueRef v_resvalue;
1263 LLVMValueRef v_resnull;
1265 LLVMValueRef v_output_skip;
1266 LLVMValueRef v_output;
1268 LLVMBasicBlockRef b_skipoutput;
1269 LLVMBasicBlockRef b_calloutput;
1270 LLVMBasicBlockRef b_input;
1271 LLVMBasicBlockRef b_inputcall;
1273 fcinfo_out = op->
d.
iocoerce.fcinfo_data_out;
1274 fcinfo_in = op->
d.
iocoerce.fcinfo_data_in;
1276 b_skipoutput = l_bb_before_v(opblocks[opno + 1],
1277 "op.%d.skipoutputnull", opno);
1278 b_calloutput = l_bb_before_v(opblocks[opno + 1],
1279 "op.%d.calloutput", opno);
1280 b_input = l_bb_before_v(opblocks[opno + 1],
1281 "op.%d.input", opno);
1282 b_inputcall = l_bb_before_v(opblocks[opno + 1],
1283 "op.%d.inputcall", opno);
1290 v_fcinfo_in_isnullp =
1291 LLVMBuildStructGEP(
b, v_fcinfo_in,
1293 "v_fcinfo_in_isnull");
1296 v_resnull = LLVMBuildLoad(
b, v_resnullp,
"");
1298 LLVMBuildICmp(
b, LLVMIntEQ, v_resnull,
1299 l_sbool_const(1),
""),
1303 LLVMPositionBuilderAtEnd(
b, b_skipoutput);
1304 v_output_skip = l_sizet_const(0);
1305 LLVMBuildBr(
b, b_input);
1307 LLVMPositionBuilderAtEnd(
b, b_calloutput);
1308 v_resvalue = LLVMBuildLoad(
b, v_resvaluep,
"");
1313 l_funcvaluep(
b, v_fcinfo_out, 0));
1316 l_funcnullp(
b, v_fcinfo_out, 0));
1318 v_output = LLVMBuildCall(
b, v_fn_out, &v_fcinfo_out,
1319 1,
"funccall_coerce_out");
1320 LLVMBuildBr(
b, b_input);
1323 LLVMPositionBuilderAtEnd(
b, b_input);
1327 LLVMValueRef incoming_values[2];
1328 LLVMBasicBlockRef incoming_blocks[2];
1330 incoming_values[0] = v_output_skip;
1331 incoming_blocks[0] = b_skipoutput;
1333 incoming_values[1] = v_output;
1334 incoming_blocks[1] = b_calloutput;
1336 v_output = LLVMBuildPhi(
b,
TypeSizeT,
"output");
1337 LLVMAddIncoming(v_output,
1338 incoming_values, incoming_blocks,
1349 LLVMBuildICmp(
b, LLVMIntEQ, v_output,
1350 l_sizet_const(0),
""),
1356 LLVMBuildBr(
b, b_inputcall);
1359 LLVMPositionBuilderAtEnd(
b, b_inputcall);
1362 LLVMBuildStore(
b, v_output,
1363 l_funcvaluep(
b, v_fcinfo_in, 0));
1364 LLVMBuildStore(
b, v_resnull,
1365 l_funcnullp(
b, v_fcinfo_in, 0));
1371 LLVMBuildStore(
b, l_sbool_const(0), v_fcinfo_in_isnullp);
1373 v_retval = LLVMBuildCall(
b, v_fn_in, &v_fcinfo_in, 1,
1374 "funccall_iocoerce_in");
1376 LLVMBuildStore(
b, v_retval, v_resvaluep);
1378 LLVMBuildBr(
b, opblocks[opno + 1]);
1387 LLVMValueRef v_fcinfo;
1388 LLVMValueRef v_fcinfo_isnull;
1390 LLVMValueRef v_argnull0,
1392 LLVMValueRef v_argnull1,
1395 LLVMValueRef v_anyargisnull;
1396 LLVMValueRef v_bothargisnull;
1398 LLVMValueRef v_result;
1400 LLVMBasicBlockRef b_noargnull;
1401 LLVMBasicBlockRef b_checkbothargnull;
1402 LLVMBasicBlockRef b_bothargnull;
1403 LLVMBasicBlockRef b_anyargnull;
1405 b_noargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.noargnull", opno);
1406 b_checkbothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.checkbothargnull", opno);
1407 b_bothargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.bothargnull", opno);
1408 b_anyargnull = l_bb_before_v(opblocks[opno + 1],
"op.%d.anyargnull", opno);
1413 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1414 v_argisnull0 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1415 l_sbool_const(1),
"");
1416 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1417 v_argisnull1 = LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1418 l_sbool_const(1),
"");
1420 v_anyargisnull = LLVMBuildOr(
b, v_argisnull0, v_argisnull1,
"");
1421 v_bothargisnull = LLVMBuildAnd(
b, v_argisnull0, v_argisnull1,
"");
1428 LLVMBuildCondBr(
b, v_anyargisnull, b_checkbothargnull,
1434 LLVMPositionBuilderAtEnd(
b, b_checkbothargnull);
1435 LLVMBuildCondBr(
b, v_bothargisnull, b_bothargnull,
1440 LLVMPositionBuilderAtEnd(
b, b_bothargnull);
1441 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1443 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1445 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1447 LLVMBuildBr(
b, opblocks[opno + 1]);
1450 LLVMPositionBuilderAtEnd(
b, b_anyargnull);
1451 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1453 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1455 LLVMBuildStore(
b, l_sizet_const(1), v_resvaluep);
1456 LLVMBuildBr(
b, opblocks[opno + 1]);
1459 LLVMPositionBuilderAtEnd(
b, b_noargnull);
1469 LLVMBuildICmp(
b, LLVMIntEQ,
1471 l_sizet_const(0),
""),
1475 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1476 LLVMBuildStore(
b, v_result, v_resvaluep);
1478 LLVMBuildBr(
b, opblocks[opno + 1]);
1486 LLVMValueRef v_fcinfo;
1487 LLVMValueRef v_fcinfo_isnull;
1488 LLVMValueRef v_argnull0;
1489 LLVMValueRef v_argnull1;
1490 LLVMValueRef v_anyargisnull;
1491 LLVMValueRef v_arg0;
1492 LLVMBasicBlockRef b_hasnull;
1493 LLVMBasicBlockRef b_nonull;
1494 LLVMBasicBlockRef b_argsequal;
1495 LLVMValueRef v_retval;
1496 LLVMValueRef v_argsequal;
1498 b_hasnull = l_bb_before_v(opblocks[opno + 1],
1499 "b.%d.null-args", opno);
1500 b_nonull = l_bb_before_v(opblocks[opno + 1],
1501 "b.%d.no-null-args", opno);
1502 b_argsequal = l_bb_before_v(opblocks[opno + 1],
1503 "b.%d.argsequal", opno);
1508 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1509 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1513 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull0,
1514 l_sbool_const(1),
""),
1515 LLVMBuildICmp(
b, LLVMIntEQ, v_argnull1,
1516 l_sbool_const(1),
""),
1519 LLVMBuildCondBr(
b, v_anyargisnull, b_hasnull, b_nonull);
1522 LLVMPositionBuilderAtEnd(
b, b_hasnull);
1523 v_arg0 = l_funcvalue(
b, v_fcinfo, 0);
1524 LLVMBuildStore(
b, v_argnull0, v_resnullp);
1525 LLVMBuildStore(
b, v_arg0, v_resvaluep);
1526 LLVMBuildBr(
b, opblocks[opno + 1]);
1529 LLVMPositionBuilderAtEnd(
b, b_nonull);
1531 v_retval =
BuildV1Call(context,
b, mod, fcinfo, &v_fcinfo_isnull);
1538 v_argsequal = LLVMBuildAnd(
b,
1539 LLVMBuildICmp(
b, LLVMIntEQ,
1543 LLVMBuildICmp(
b, LLVMIntEQ,
1548 LLVMBuildCondBr(
b, v_argsequal, b_argsequal, b_hasnull);
1551 LLVMPositionBuilderAtEnd(
b, b_argsequal);
1552 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1553 LLVMBuildStore(
b, l_sizet_const(0), v_resvaluep);
1554 LLVMBuildStore(
b, v_retval, v_resvaluep);
1556 LLVMBuildBr(
b, opblocks[opno + 1]);
1563 LLVMBuildBr(
b, opblocks[opno + 1]);
1569 LLVMBuildBr(
b, opblocks[opno + 1]);
1575 LLVMBuildBr(
b, opblocks[opno + 1]);
1581 LLVMBuildBr(
b, opblocks[opno + 1]);
1586 v_state, op, v_econtext);
1587 LLVMBuildBr(
b, opblocks[opno + 1]);
1593 LLVMBuildBr(
b, opblocks[opno + 1]);
1599 LLVMValueRef v_fcinfo_isnull;
1600 LLVMBasicBlockRef b_null;
1601 LLVMBasicBlockRef b_compare;
1602 LLVMBasicBlockRef b_compare_result;
1604 LLVMValueRef v_retval;
1606 b_null = l_bb_before_v(opblocks[opno + 1],
1607 "op.%d.row-null", opno);
1608 b_compare = l_bb_before_v(opblocks[opno + 1],
1609 "op.%d.row-compare", opno);
1611 l_bb_before_v(opblocks[opno + 1],
1612 "op.%d.row-compare-result",
1621 LLVMValueRef v_fcinfo;
1622 LLVMValueRef v_argnull0;
1623 LLVMValueRef v_argnull1;
1624 LLVMValueRef v_anyargisnull;
1626 v_fcinfo = l_ptr_const(fcinfo,
1629 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1630 v_argnull1 = l_funcnull(
b, v_fcinfo, 1);
1639 LLVMBuildICmp(
b, LLVMIntEQ,
1641 l_sbool_const(1),
""),
1644 LLVMBuildCondBr(
b, v_anyargisnull, b_null, b_compare);
1648 LLVMBuildBr(
b, b_compare);
1652 LLVMPositionBuilderAtEnd(
b, b_compare);
1657 LLVMBuildStore(
b, v_retval, v_resvaluep);
1670 LLVMPositionBuilderAtEnd(
b, b_compare_result);
1677 l_sizet_const(0),
""),
1685 LLVMPositionBuilderAtEnd(
b, b_null);
1686 LLVMBuildStore(
b, l_sbool_const(1), v_resnullp);
1696 LLVMValueRef v_cmpresult;
1697 LLVMValueRef v_result;
1698 LLVMIntPredicate predicate;
1707 LLVMBuildLoad(
b, v_resvaluep,
""),
1708 LLVMInt32TypeInContext(lc),
"");
1713 predicate = LLVMIntSLT;
1716 predicate = LLVMIntSLE;
1719 predicate = LLVMIntSGT;
1722 predicate = LLVMIntSGE;
1731 v_result = LLVMBuildICmp(
b,
1734 l_int32_const(lc, 0),
1736 v_result = LLVMBuildZExt(
b, v_result,
TypeSizeT,
"");
1738 LLVMBuildStore(
b, l_sbool_const(0), v_resnullp);
1739 LLVMBuildStore(
b, v_result, v_resvaluep);
1741 LLVMBuildBr(
b, opblocks[opno + 1]);
1748 LLVMBuildBr(
b, opblocks[opno + 1]);
1753 v_state, op, v_econtext);
1754 LLVMBuildBr(
b, opblocks[opno + 1]);
1759 v_state, op, v_econtext);
1760 LLVMBuildBr(
b, opblocks[opno + 1]);
1765 v_state, op, v_econtext);
1766 LLVMBuildBr(
b, opblocks[opno + 1]);
1771 LLVMBasicBlockRef b_avail,
1773 LLVMValueRef v_casevaluep,
1775 LLVMValueRef v_casenullp,
1777 LLVMValueRef v_casevaluenull;
1779 b_avail = l_bb_before_v(opblocks[opno + 1],
1780 "op.%d.avail", opno);
1781 b_notavail = l_bb_before_v(opblocks[opno + 1],
1782 "op.%d.notavail", opno);
1784 v_casevaluep = l_ptr_const(op->
d.
casetest.value,
1786 v_casenullp = l_ptr_const(op->
d.
casetest.isnull,
1790 LLVMBuildICmp(
b, LLVMIntEQ,
1791 LLVMBuildPtrToInt(
b, v_casevaluep,
1793 l_sizet_const(0),
"");
1796 b_notavail, b_avail);
1799 LLVMPositionBuilderAtEnd(
b, b_avail);
1800 v_casevalue = LLVMBuildLoad(
b, v_casevaluep,
"");
1801 v_casenull = LLVMBuildLoad(
b, v_casenullp,
"");
1802 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1803 LLVMBuildStore(
b, v_casenull, v_resnullp);
1804 LLVMBuildBr(
b, opblocks[opno + 1]);
1807 LLVMPositionBuilderAtEnd(
b, b_notavail);
1809 l_load_struct_gep(
b, v_econtext,
1813 l_load_struct_gep(
b, v_econtext,
1816 LLVMBuildStore(
b, v_casevalue, v_resvaluep);
1817 LLVMBuildStore(
b, v_casenull, v_resnullp);
1819 LLVMBuildBr(
b, opblocks[opno + 1]);
1826 LLVMBuildBr(
b, opblocks[opno + 1]);
1832 LLVMBuildBr(
b, opblocks[opno + 1]);
1837 v_state, op, v_econtext);
1838 LLVMBuildBr(
b, opblocks[opno + 1]);
1844 LLVMBuildBr(
b, opblocks[opno + 1]);
1849 v_state, op, v_econtext);
1850 LLVMBuildBr(
b, opblocks[opno + 1]);
1856 LLVMBuildBr(
b, opblocks[opno + 1]);
1861 v_state, op, v_econtext);
1862 LLVMBuildBr(
b, opblocks[opno + 1]);
1868 LLVMBuildBr(
b, opblocks[opno + 1]);
1873 LLVMValueRef v_aggno;
1877 v_aggno = l_int32_const(lc, op->
d.
aggref.aggno);
1880 value = l_load_gep1(
b, v_aggvalues, v_aggno,
"aggvalue");
1881 isnull = l_load_gep1(
b, v_aggnulls, v_aggno,
"aggnull");
1884 LLVMBuildStore(
b,
value, v_resvaluep);
1885 LLVMBuildStore(
b, isnull, v_resnullp);
1887 LLVMBuildBr(
b, opblocks[opno + 1]);
1894 LLVMBuildBr(
b, opblocks[opno + 1]);
1900 LLVMValueRef v_wfuncnop;
1901 LLVMValueRef v_wfuncno;
1910 v_wfuncnop = l_ptr_const(&wfunc->
wfuncno,
1911 l_ptr(LLVMInt32TypeInContext(lc)));
1912 v_wfuncno = LLVMBuildLoad(
b, v_wfuncnop,
"v_wfuncno");
1915 value = l_load_gep1(
b, v_aggvalues, v_wfuncno,
1917 isnull = l_load_gep1(
b, v_aggnulls, v_wfuncno,
1920 LLVMBuildStore(
b,
value, v_resvaluep);
1921 LLVMBuildStore(
b, isnull, v_resnullp);
1923 LLVMBuildBr(
b, opblocks[opno + 1]);
1929 v_state, op, v_econtext);
1930 LLVMBuildBr(
b, opblocks[opno + 1]);
1939 LLVMValueRef v_retval;
1940 LLVMValueRef v_fcinfo_isnull;
1941 LLVMValueRef v_tmpcontext;
1942 LLVMValueRef v_oldcontext;
1946 LLVMValueRef v_fcinfo;
1947 LLVMValueRef v_argnull0;
1948 LLVMBasicBlockRef b_deserialize;
1950 b_deserialize = l_bb_before_v(opblocks[opno + 1],
1951 "op.%d.deserialize", opno);
1953 v_fcinfo = l_ptr_const(fcinfo,
1955 v_argnull0 = l_funcnull(
b, v_fcinfo, 0);
1965 LLVMPositionBuilderAtEnd(
b, b_deserialize);
1974 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
1977 l_mcxt_switch(mod,
b, v_oldcontext);
1979 LLVMBuildStore(
b, v_retval, v_resvaluep);
1980 LLVMBuildStore(
b, v_fcinfo_isnull, v_resnullp);
1982 LLVMBuildBr(
b, opblocks[opno + 1]);
1994 LLVMValueRef v_argsp;
1995 LLVMValueRef v_nullsp;
1996 LLVMBasicBlockRef *b_checknulls;
2005 b_checknulls =
palloc(
sizeof(LLVMBasicBlockRef *) * nargs);
2006 for (
int argno = 0; argno < nargs; argno++)
2008 b_checknulls[argno] =
2009 l_bb_before_v(opblocks[opno + 1],
2010 "op.%d.check-null.%d",
2014 LLVMBuildBr(
b, b_checknulls[0]);
2017 for (
int argno = 0; argno < nargs; argno++)
2019 LLVMValueRef v_argno = l_int32_const(lc, argno);
2020 LLVMValueRef v_argisnull;
2021 LLVMBasicBlockRef b_argnotnull;
2023 LLVMPositionBuilderAtEnd(
b, b_checknulls[argno]);
2025 if (argno + 1 == nargs)
2026 b_argnotnull = opblocks[opno + 1];
2028 b_argnotnull = b_checknulls[argno + 1];
2031 v_argisnull = l_load_gep1(
b, v_nullsp, v_argno,
"");
2034 LLVMValueRef v_argn;
2036 v_argn = LLVMBuildGEP(
b, v_argsp, &v_argno, 1,
"");
2038 l_load_struct_gep(
b, v_argn,
2047 l_sbool_const(1),
""),
2058 LLVMValueRef v_aggstatep;
2059 LLVMValueRef v_allpergroupsp;
2060 LLVMValueRef v_pergroup_allaggs;
2061 LLVMValueRef v_setoff;
2069 v_aggstatep = LLVMBuildBitCast(
b, v_parent,
2072 v_allpergroupsp = l_load_struct_gep(
b, v_aggstatep,
2074 "aggstate.all_pergroups");
2078 v_pergroup_allaggs = l_load_gep1(
b, v_allpergroupsp, v_setoff,
"");
2081 LLVMBuildICmp(
b, LLVMIntEQ,
2082 LLVMBuildPtrToInt(
b, v_pergroup_allaggs,
TypeSizeT,
""),
2083 l_sizet_const(0),
""),
2085 opblocks[opno + 1]);
2100 LLVMValueRef v_aggstatep;
2101 LLVMValueRef v_fcinfo;
2102 LLVMValueRef v_fcinfo_isnull;
2104 LLVMValueRef v_transvaluep;
2105 LLVMValueRef v_transnullp;
2107 LLVMValueRef v_setoff;
2108 LLVMValueRef v_transno;
2110 LLVMValueRef v_aggcontext;
2112 LLVMValueRef v_allpergroupsp;
2113 LLVMValueRef v_current_setp;
2114 LLVMValueRef v_current_pertransp;
2115 LLVMValueRef v_curaggcontext;
2117 LLVMValueRef v_pertransp;
2119 LLVMValueRef v_pergroupp;
2121 LLVMValueRef v_retval;
2123 LLVMValueRef v_tmpcontext;
2124 LLVMValueRef v_oldcontext;
2133 v_pertransp = l_ptr_const(pertrans,
2141 l_load_struct_gep(
b, v_aggstatep,
2143 "aggstate.all_pergroups");
2144 v_setoff = l_int32_const(lc, op->
d.
agg_trans.setoff);
2145 v_transno = l_int32_const(lc, op->
d.
agg_trans.transno);
2148 l_load_gep1(
b, v_allpergroupsp, v_setoff,
""),
2155 LLVMValueRef v_notransvalue;
2156 LLVMBasicBlockRef b_init;
2157 LLVMBasicBlockRef b_no_init;
2160 l_load_struct_gep(
b, v_pergroupp,
2164 b_init = l_bb_before_v(opblocks[opno + 1],
2165 "op.%d.inittrans", opno);
2166 b_no_init = l_bb_before_v(opblocks[opno + 1],
2167 "op.%d.no_inittrans", opno);
2170 LLVMBuildICmp(
b, LLVMIntEQ, v_notransvalue,
2171 l_sbool_const(1),
""),
2177 LLVMValueRef params[4];
2179 LLVMPositionBuilderAtEnd(
b, b_init);
2181 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2184 params[0] = v_aggstatep;
2185 params[1] = v_pertransp;
2186 params[2] = v_pergroupp;
2187 params[3] = v_aggcontext;
2194 LLVMBuildBr(
b, opblocks[opno + 1]);
2197 LLVMPositionBuilderAtEnd(
b, b_no_init);
2205 LLVMValueRef v_transnull;
2206 LLVMBasicBlockRef b_strictpass;
2208 b_strictpass = l_bb_before_v(opblocks[opno + 1],
2209 "op.%d.strictpass", opno);
2211 l_load_struct_gep(
b, v_pergroupp,
2216 LLVMBuildICmp(
b, LLVMIntEQ, v_transnull,
2217 l_sbool_const(1),
""),
2221 LLVMPositionBuilderAtEnd(
b, b_strictpass);
2225 v_fcinfo = l_ptr_const(fcinfo,
2227 v_aggcontext = l_ptr_const(op->
d.
agg_trans.aggcontext,
2231 LLVMBuildStructGEP(
b,
2234 "aggstate.current_set");
2236 LLVMBuildStructGEP(
b,
2239 "aggstate.curaggcontext");
2240 v_current_pertransp =
2241 LLVMBuildStructGEP(
b,
2244 "aggstate.curpertrans");
2247 LLVMBuildStore(
b, v_aggcontext, v_curaggcontext);
2248 LLVMBuildStore(
b, l_int32_const(lc, op->
d.
agg_trans.setno),
2250 LLVMBuildStore(
b, v_pertransp, v_current_pertransp);
2256 v_oldcontext = l_mcxt_switch(mod,
b, v_tmpcontext);
2260 LLVMBuildStructGEP(
b, v_pergroupp,
2264 LLVMBuildStructGEP(
b, v_pergroupp,
2268 LLVMBuildLoad(
b, v_transvaluep,
2270 l_funcvaluep(
b, v_fcinfo, 0));
2272 LLVMBuildLoad(
b, v_transnullp,
"transnull"),
2273 l_funcnullp(
b, v_fcinfo, 0));
2292 LLVMBasicBlockRef b_call;
2293 LLVMBasicBlockRef b_nocall;
2295 LLVMValueRef v_transvalue;
2296 LLVMValueRef v_transnull;
2297 LLVMValueRef v_newval;
2298 LLVMValueRef params[6];
2300 b_call = l_bb_before_v(opblocks[opno + 1],
2301 "op.%d.transcall", opno);
2302 b_nocall = l_bb_before_v(opblocks[opno + 1],
2303 "op.%d.transnocall", opno);
2305 v_transvalue = LLVMBuildLoad(
b, v_transvaluep,
"");
2306 v_transnull = LLVMBuildLoad(
b, v_transnullp,
"");
2313 LLVMBuildICmp(
b, LLVMIntEQ,
2319 LLVMPositionBuilderAtEnd(
b, b_call);
2321 params[0] = v_aggstatep;
2322 params[1] = v_pertransp;
2323 params[2] = v_retval;
2324 params[3] = LLVMBuildTrunc(
b, v_fcinfo_isnull,
2326 params[4] = v_transvalue;
2327 params[5] = LLVMBuildTrunc(
b, v_transnull,
2332 LLVMBuildCall(
b, v_fn,
2337 LLVMBuildStore(
b, v_newval, v_transvaluep);
2338 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2340 l_mcxt_switch(mod,
b, v_oldcontext);
2341 LLVMBuildBr(
b, opblocks[opno + 1]);
2344 LLVMPositionBuilderAtEnd(
b, b_nocall);
2348 LLVMBuildStore(
b, v_retval, v_transvaluep);
2349 LLVMBuildStore(
b, v_fcinfo_isnull, v_transnullp);
2351 l_mcxt_switch(mod,
b, v_oldcontext);
2353 LLVMBuildBr(
b, opblocks[opno + 1]);
2363 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctSingle");
2364 LLVMValueRef v_args[2];
2370 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2374 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2375 l_sbool_const(1),
""),
2377 opblocks[jumpdistinct]);
2387 LLVMValueRef v_fn =
llvm_pg_func(mod,
"ExecEvalPreOrderedDistinctMulti");
2388 LLVMValueRef v_args[2];
2394 v_ret = LLVMBuildCall(
b, v_fn, v_args, 2,
"");
2398 LLVMBuildICmp(
b, LLVMIntEQ, v_ret,
2399 l_sbool_const(1),
""),
2401 opblocks[jumpdistinct]);
2407 v_state, op, v_econtext);
2408 LLVMBuildBr(
b, opblocks[opno + 1]);
2413 v_state, op, v_econtext);
2414 LLVMBuildBr(
b, opblocks[opno + 1]);
2423 LLVMDisposeBuilder(
b);
2439 state->evalfunc_private = cstate;
2446 endtime, starttime);
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
#define INSTR_TIME_SET_CURRENT(t)
#define INSTR_TIME_ACCUM_DIFF(x, y, z)
LLVMTypeRef TypeParamBool
LLVMTypeRef StructMemoryContextData
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
LLVMTypeRef StructAggStatePerTransData
void llvm_copy_attributes(LLVMValueRef v_from, LLVMValueRef v_to)
static Datum ExecRunCompiledExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define build_EvalXFunc(b, mod, funcname, v_state, op,...)
static LLVMValueRef BuildV1Call(LLVMJitContext *context, LLVMBuilderRef b, LLVMModuleRef mod, FunctionCallInfo fcinfo, LLVMValueRef *v_fcinfo_isnull)
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
#define FIELDNO_TUPLETABLESLOT_ISNULL
#define FIELDNO_TUPLETABLESLOT_VALUES
#define FIELDNO_TUPLETABLESLOT_NVALID