https://gcc.gnu.org/g:b30424f43522171e8ffe587e0df0ce3627c88f6c

commit r16-187-gb30424f43522171e8ffe587e0df0ce3627c88f6c
Author: Richard Biener <rguent...@suse.de>
Date:   Tue Dec 3 14:21:47 2024 +0100

    middle-end/116083 - vectorizer slowness
    
    Turns out SLP discovery can end up doing a lot of vector type
    builds from scalar types.  Those are all ultimatively cached but
    end up built and layouted first.  The latter is particularly
    expensive because it does tree node arithmetic to compute TYPE_SIZE
    and TYPE_SIZE_UNIT.  The following replaces this with the appropriate
    poly-int arithmetic which speeds up the testcase by 50%.
    
            PR middle-end/116083
            * stor-layout.cc (layout_type): Compute TYPE_SIZE and
            TYPE_SIZE_UNIT for vector types from the component mode
            sizes.

Diff:
---
 gcc/stor-layout.cc | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

diff --git a/gcc/stor-layout.cc b/gcc/stor-layout.cc
index 18b5af56124d..12071c96ca79 100644
--- a/gcc/stor-layout.cc
+++ b/gcc/stor-layout.cc
@@ -2591,16 +2591,21 @@ layout_type (tree type)
        /* Several boolean vector elements may fit in a single unit.  */
        if (VECTOR_BOOLEAN_TYPE_P (type)
            && type->type_common.mode != BLKmode)
-         TYPE_SIZE_UNIT (type)
-           = size_int (GET_MODE_SIZE (type->type_common.mode));
+         {
+           TYPE_SIZE_UNIT (type)
+             = size_int (GET_MODE_SIZE (type->type_common.mode));
+           TYPE_SIZE (type)
+             = bitsize_int (GET_MODE_BITSIZE (type->type_common.mode));
+         }
        else
-         TYPE_SIZE_UNIT (type) = int_const_binop (MULT_EXPR,
-                                                  TYPE_SIZE_UNIT (innertype),
-                                                  size_int (nunits));
-       TYPE_SIZE (type) = int_const_binop
-         (MULT_EXPR,
-          bits_from_bytes (TYPE_SIZE_UNIT (type)),
-          bitsize_int (BITS_PER_UNIT));
+         {
+           TYPE_SIZE_UNIT (type)
+             = size_int (GET_MODE_SIZE (SCALAR_TYPE_MODE (innertype))
+                         * nunits);
+           TYPE_SIZE (type)
+             = bitsize_int (GET_MODE_BITSIZE (SCALAR_TYPE_MODE (innertype))
+                            * nunits);
+         }
 
        /* For vector types, we do not default to the mode's alignment.
           Instead, query a target hook, defaulting to natural alignment.

Reply via email to