aboutsummaryrefslogtreecommitdiff
path: root/src/backend/jit/llvm/llvmjit_expr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/jit/llvm/llvmjit_expr.c')
-rw-r--r--src/backend/jit/llvm/llvmjit_expr.c44
1 files changed, 15 insertions, 29 deletions
diff --git a/src/backend/jit/llvm/llvmjit_expr.c b/src/backend/jit/llvm/llvmjit_expr.c
index 0dbc1e41062..be9b2aecffe 100644
--- a/src/backend/jit/llvm/llvmjit_expr.c
+++ b/src/backend/jit/llvm/llvmjit_expr.c
@@ -276,6 +276,8 @@ llvm_compile_expr(ExprState *state)
LLVMValueRef v_slot;
LLVMBasicBlockRef b_fetch;
LLVMValueRef v_nvalid;
+ LLVMValueRef l_jit_deform = NULL;
+ const TupleTableSlotOps *tts_ops = NULL;
b_fetch = l_bb_before_v(opblocks[i + 1],
"op.%d.fetch", i);
@@ -283,40 +285,22 @@ llvm_compile_expr(ExprState *state)
if (op->d.fetch.known_desc)
desc = op->d.fetch.known_desc;
- if (opcode == EEOP_INNER_FETCHSOME)
- {
- PlanState *is = innerPlanState(parent);
+ if (op->d.fetch.fixed)
+ tts_ops = op->d.fetch.kind;
+ if (opcode == EEOP_INNER_FETCHSOME)
v_slot = v_innerslot;
-
- if (!desc &&
- is &&
- is->ps_ResultTupleSlot &&
- TTS_FIXED(is->ps_ResultTupleSlot))
- desc = is->ps_ResultTupleSlot->tts_tupleDescriptor;
- }
else if (opcode == EEOP_OUTER_FETCHSOME)
- {
- PlanState *os = outerPlanState(parent);
-
v_slot = v_outerslot;
-
- if (!desc &&
- os &&
- os->ps_ResultTupleSlot &&
- TTS_FIXED(os->ps_ResultTupleSlot))
- desc = os->ps_ResultTupleSlot->tts_tupleDescriptor;
- }
else
- {
v_slot = v_scanslot;
- if (!desc && parent)
- desc = parent->scandesc;
- }
/*
* Check if all required attributes are available, or
* whether deforming is required.
+ *
+ * TODO: skip nvalid check if slot is fixed and known to
+ * be a virtual slot.
*/
v_nvalid =
l_load_struct_gep(b, v_slot,
@@ -336,19 +320,21 @@ llvm_compile_expr(ExprState *state)
* function specific to tupledesc and the exact number of
* to-be-extracted attributes.
*/
- if (desc && (context->base.flags & PGJIT_DEFORM))
+ if (tts_ops && desc && (context->base.flags & PGJIT_DEFORM))
{
- LLVMValueRef params[1];
- LLVMValueRef l_jit_deform;
-
l_jit_deform =
slot_compile_deform(context, desc,
op->d.fetch.last_var);
+ }
+
+ if (l_jit_deform)
+ {
+ LLVMValueRef params[1];
+
params[0] = v_slot;
LLVMBuildCall(b, l_jit_deform,
params, lengthof(params), "");
-
}
else
{