I noticed the following while poking around with perf:
| fcinfo->isnull = false; |b5b: movb $0x0,0x1c(%rdx) |
*op->resvalue = op->d.func.fn_addr(fcinfo); 0.02 | mov 0x8(%rbx),%rcx 1.19 | mov %rdx,%rdi
0.93| mov %rdx,(%rsp) | mov %rcx,0x8(%rsp) 0.01 | callq *0x28(%rbx) 2.17 | mov
0x8(%rsp),%rcx | mov %rax,(%rcx) | *op->resnull = fcinfo->isnull; 1.18 |
mov (%rsp),%rdx 4.32 | mov 0x10(%rbx),%rax 0.06 | movzbl 0x1c(%rdx),%edx 9.14 | mov
%dl,(%rax)
It looks to me like gcc believes it is required to evaluate "op->resvalue"
before invoking the called function, just in case the function somehow has
access to *op and modifies that. We could save a pointless register spill
and reload if there were a temporary variable in there, ie
EEO_CASE(EEOP_FUNCEXPR) { FunctionCallInfo fcinfo = op->d.func.fcinfo_data;
+ Datum fvalue; fcinfo->isnull = false;
- *op->resvalue = op->d.func.fn_addr(fcinfo);
+ fvalue = op->d.func.fn_addr(fcinfo);
+ *op->resvalue = fvalue; *op->resnull = fcinfo->isnull;
EEO_NEXT(); }
and likewise in the other FUNCEXPR cases.
This is on a rather old gcc, haven't checked on bleeding-edge versions.
regards, tom lane
--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers