From eccc83a3174dde3aa18b531fb8eddf4cefdffb79 Mon Sep 17 00:00:00 2001
From: zengxx <xiangxin_zeng@qq.com>
Date: Fri, 9 Oct 2026 23:55:19 +0800
Subject: [PATCH] numeric: canonicalize wide digit accumulation

Rewrite accum_sum_add() to advance the destination cursor once and use a
zero-based inner loop.  This follows the loop forms already used in
numeric multiplication and division for auto-vectorization, allowing GCC
to vectorize wide digit accumulation without SIMD intrinsics or
ISA-specific code.
---
 src/backend/utils/adt/numeric.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
index 37f24e3385..c4e5bcfffe 100644
--- a/src/backend/utils/adt/numeric.c
+++ b/src/backend/utils/adt/numeric.c
@@ -11912,8 +11912,7 @@ static void
 accum_sum_add(NumericSumAccum *accum, const NumericVar *val)
 {
 	int32	   *accum_digits;
-	int			i,
-				val_i;
+	int			val_i;
 	int			val_ndigits;
 	NumericDigit *val_digits;
 
@@ -11943,12 +11942,9 @@ accum_sum_add(NumericSumAccum *accum, const NumericVar *val)
 	val_ndigits = val->ndigits;
 	val_digits = val->digits;
 
-	i = accum->weight - val->weight;
+	accum_digits += accum->weight - val->weight;
 	for (val_i = 0; val_i < val_ndigits; val_i++)
-	{
-		accum_digits[i] += (int32) val_digits[val_i];
-		i++;
-	}
+		accum_digits[val_i] += (int32) val_digits[val_i];
 
 	accum->num_uncarried++;
 }
-- 
2.43.0

