From: Richard Biener Date: Tue, 3 Dec 2024 13:21:47 +0000 (+0100) Subject: middle-end/116083 - vectorizer slowness X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b30424f43522171e8ffe587e0df0ce3627c88f6c;p=thirdparty%2Fgcc.git 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 --git a/gcc/stor-layout.cc b/gcc/stor-layout.cc index 18b5af56124..12071c96ca7 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.