]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
middle-end/116083 - vectorizer slowness
authorRichard Biener <rguenther@suse.de>
Tue, 3 Dec 2024 13:21:47 +0000 (14:21 +0100)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 28 Apr 2025 09:27:30 +0000 (11:27 +0200)
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.

gcc/stor-layout.cc

index 18b5af56124d28a0303b002fab95b79a499f9def..12071c96ca79f96ea571038909570bd4f756de60 100644 (file)
@@ -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.