From eccc83a3174dde3aa18b531fb8eddf4cefdffb79 Mon Sep 17 00:00:00 2001 From: zengxx 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