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