summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2025-08-11 15:41:34 -0400
committerAndres Freund <andres@anarazel.de>2025-08-11 15:41:34 -0400
commitb227b0bb4e032e19b3679bedac820eba3ac0d1cf (patch)
tree16824e186982c38492eba8ca893da21406bdd198 /src
parent01d6832c109bcc37acb30e934b7c472334b7c291 (diff)
Reduce ExecSeqScan* code size using pg_assume()HEADorigin/masterorigin/HEADmaster
fb9f955025f optimized code generation by using specialized variants of ExecSeqScan* for [not] having a qual, projection etc. This allowed the compiler to optimize the code out the code for qual / projection. However, as observed by David Rowley at the time, the compiler couldn't prove the opposite, i.e. that the qual etc *are* present. By using pg_assume(), introduced in d65eb5b1b84, we can tell the compiler that the relevant variables are non-null. This reduces the code size to a surprising degree and seems to lead to a small but reproducible performance gain. Reviewed-by: Amit Langote <amitlangote09@gmail.com> Discussion: https://postgr.es/m/CA+HiwqFk-MbwhfX_kucxzL8zLmjEt9MMcHi2YF=DyhPrSjsBEA@mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/nodeSeqscan.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/backend/executor/nodeSeqscan.c b/src/backend/executor/nodeSeqscan.c
index ed35c58c2c3..94047d29430 100644
--- a/src/backend/executor/nodeSeqscan.c
+++ b/src/backend/executor/nodeSeqscan.c
@@ -131,8 +131,12 @@ ExecSeqScanWithQual(PlanState *pstate)
{
SeqScanState *node = castNode(SeqScanState, pstate);
+ /*
+ * Use pg_assume() for != NULL tests to make the compiler realize no
+ * runtime check for the field is needed in ExecScanExtended().
+ */
Assert(pstate->state->es_epq_active == NULL);
- Assert(pstate->qual != NULL);
+ pg_assume(pstate->qual != NULL);
Assert(pstate->ps_ProjInfo == NULL);
return ExecScanExtended(&node->ss,
@@ -153,7 +157,7 @@ ExecSeqScanWithProject(PlanState *pstate)
Assert(pstate->state->es_epq_active == NULL);
Assert(pstate->qual == NULL);
- Assert(pstate->ps_ProjInfo != NULL);
+ pg_assume(pstate->ps_ProjInfo != NULL);
return ExecScanExtended(&node->ss,
(ExecScanAccessMtd) SeqNext,
@@ -173,8 +177,8 @@ ExecSeqScanWithQualProject(PlanState *pstate)
SeqScanState *node = castNode(SeqScanState, pstate);
Assert(pstate->state->es_epq_active == NULL);
- Assert(pstate->qual != NULL);
- Assert(pstate->ps_ProjInfo != NULL);
+ pg_assume(pstate->qual != NULL);
+ pg_assume(pstate->ps_ProjInfo != NULL);
return ExecScanExtended(&node->ss,
(ExecScanAccessMtd) SeqNext,