https://gcc.gnu.org/g:2d4312bca252738f81528623d36b45a1eae4321c

commit r16-1128-g2d4312bca252738f81528623d36b45a1eae4321c
Author: Hongyu Wang <hongyu.w...@intel.com>
Date:   Thu Jun 5 14:45:08 2025 +0800

    tree-sra: Use MOVE_MAX for sra size limit [PR112824]
    
    Current sra use UNITS_PER_WORD to define max scalarization size, but
    for targets like x86 it allows operations on larger size, so the
    components like vector variables in an aggregate can be larger than
    just UNITS_PER_WORD. Use MOVE_MAX instead of UNITS_PER_WORD to allow
    sra for aggregates with vector components.
    
    gcc/ChangeLog:
    
            PR middle-end/112824
            * tree-sra.cc (sra_get_max_scalarization_size): Use MOVE_MAX
            instead of UNITS_PER_WORD to define max_scalarization_size.
    
    gcc/testsuite/ChangeLog:
    
            * g++.target/i386/pr112824-2.C: New test.

Diff:
---
 gcc/testsuite/g++.target/i386/pr112824-2.C | 10 ++++++++++
 gcc/tree-sra.cc                            |  2 +-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/g++.target/i386/pr112824-2.C 
b/gcc/testsuite/g++.target/i386/pr112824-2.C
new file mode 100644
index 000000000000..036a47b7280f
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr112824-2.C
@@ -0,0 +1,10 @@
+/* PR target/112824 */
+/* { dg-do compile } */
+/* { dg-options "-std=c++23 -O3 -march=skylake-avx512 
-mprefer-vector-width=512" } */
+/* { dg-final { scan-assembler-not "vmov.*\[ \\t\]+\[^\n\]*%rsp" } } */
+
+#include "pr112824-1.C"
+
+void prod(Dual<Dual<double,8>,2> &c, const Dual<Dual<double,8>,2> &a, const 
Dual<Dual<double,8>,2>&b){
+    c = a*b;
+}
diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc
index 4b6daf772841..23236fc65377 100644
--- a/gcc/tree-sra.cc
+++ b/gcc/tree-sra.cc
@@ -3760,7 +3760,7 @@ sra_get_max_scalarization_size (void)
   /* If the user didn't set PARAM_SRA_MAX_SCALARIZATION_SIZE_<...>,
      fall back to a target default.  */
   unsigned HOST_WIDE_INT max_scalarization_size
-    = get_move_ratio (optimize_speed_p) * UNITS_PER_WORD;
+    = get_move_ratio (optimize_speed_p) * MOVE_MAX;
 
   if (optimize_speed_p)
     {

Reply via email to