1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-27 23:21:58 +03:00

Move EEOP_*_SYSVAR evaluation out of line.

This mainly de-duplicates code. As evaluating a system variable isn't
the hottest path and the current inline implementation ends up calling
out to an external function anyway, this is OK from a performance POV.

The main motivation for de-duplicating is the upcoming slot
abstraction work, after which there's not guaranteed to be a HeapTuple
backing the slot.

Author: Andres Freund, Amit Khandekar
Discussion: https://postgr.es/m/20181105210039.hh4vvi4vwoq5ba2q@alap3.anarazel.de
This commit is contained in:
Andres Freund
2018-11-07 11:08:45 -08:00
parent 517b0d0b5f
commit b84a6dafbf
6 changed files with 33 additions and 73 deletions

View File

@ -406,13 +406,8 @@ llvm_compile_expr(ExprState *state)
case EEOP_OUTER_SYSVAR:
case EEOP_SCAN_SYSVAR:
{
int attnum = op->d.var.attnum;
LLVMValueRef v_attnum;
LLVMValueRef v_tuple;
LLVMValueRef v_tupleDescriptor;
LLVMValueRef v_params[4];
LLVMValueRef v_syscol;
LLVMValueRef v_slot;
LLVMValueRef v_params[4];
if (opcode == EEOP_INNER_SYSVAR)
v_slot = v_innerslot;
@ -421,31 +416,14 @@ llvm_compile_expr(ExprState *state)
else
v_slot = v_scanslot;
Assert(op->d.var.attnum < 0);
v_params[0] = v_state;
v_params[1] = l_ptr_const(op, l_ptr(StructExprEvalStep));
v_params[2] = v_econtext;
v_params[3] = v_slot;
v_tuple = l_load_struct_gep(b, v_slot,
FIELDNO_TUPLETABLESLOT_TUPLE,
"v.tuple");
/*
* Could optimize this a bit for fixed descriptors, but
* this shouldn't be that critical a path.
*/
v_tupleDescriptor =
l_load_struct_gep(b, v_slot,
FIELDNO_TUPLETABLESLOT_TUPLEDESCRIPTOR,
"v.tupledesc");
v_attnum = l_int32_const(attnum);
v_params[0] = v_tuple;
v_params[1] = v_attnum;
v_params[2] = v_tupleDescriptor;
v_params[3] = v_resnullp;
v_syscol = LLVMBuildCall(b,
llvm_get_decl(mod, FuncHeapGetsysattr),
v_params, lengthof(v_params),
"");
LLVMBuildStore(b, v_syscol, v_resvaluep);
LLVMBuildCall(b,
FuncExecEvalSysVar,
v_params, lengthof(v_params), "");
LLVMBuildBr(b, opblocks[i + 1]);
break;