It has been fixed by swapping operands during SLP discovery.
gcc/testsuite/
* gnat.dg/vect19.ads, gnat.dg/vect19.adb: New test.
* gnat.dg/vect19_pkg.ads, gnat.dg/vect19_pkg.adb: New helper.
--- /dev/null
+-- { dg-do compile { target i?86-*-* x86_64-*-* } }
+-- { dg-options "-O3 -msse2 -gnatn -fno-tree-slp-vectorize -fdump-tree-vect-details" }
+
+package body Vect19 is
+
+ function NSum (X : Arr; N : Positive) return Arr is
+ Ret : Arr := X;
+ begin
+ for I in 1 .. N loop
+ Ret := Sum (Ret, X);
+ end loop;
+ return Ret;
+ end;
+
+end Vect19;
+
+-- { dg-final { scan-tree-dump "vectorized 1 loops" "vect" } }
--- /dev/null
+with Vect19_Pkg; use Vect19_Pkg;
+
+package Vect19 is
+
+ function NSum (X : Arr; N : Positive) return Arr;
+
+end Vect19;
--- /dev/null
+package body Vect19_Pkg is
+
+ function Sum (X : Arr; Y : Arr) return Arr is
+ Result : Arr;
+ begin
+ for I in X'Range loop
+ Result(I) := X(I) + Y(I);
+ end loop;
+ return Result;
+ end;
+
+end Vect19_Pkg;
--- /dev/null
+package Vect19_Pkg is
+
+ type Arr is array (1 .. 4) of Float;
+ for Arr'Alignment use 16;
+
+ function Sum (X : Arr; Y : Arr) return Arr;
+ pragma Inline (Sum);
+
+end Vect19_Pkg;