From 6ceb712e2699a493da544b1755f6f73d62930f9b Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 10 Mar 2021 11:57:21 +0100 Subject: [PATCH] tree-optimization/99510 - fix type reuse of build_aligned_type The fix for PR94775 added more strict checking for type reuse to check_aligned_type, specifically matching TYPE_USER_ALIGN. But then build_aligned_type sets TYPE_USER_ALIGN on the built variant so if the type we build an aligned variant for does not have TYPE_USER_ALIGN we'll never re-use the newly created aligned variant. This results in ~35000 identical variants being created for polyhedron doduc. The following instead checks that the candidate has TYPE_USER_ALIGN set. 2021-03-10 Richard Biener PR tree-optimization/99510 * tree.c (check_aligned_type): Check that the candidate has TYPE_USER_ALIGN set instead of matching with the original type. --- gcc/tree.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gcc/tree.c b/gcc/tree.c index 8fa9995..7c44c22 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -6609,7 +6609,9 @@ check_aligned_type (const_tree cand, const_tree base, unsigned int align) && TYPE_CONTEXT (cand) == TYPE_CONTEXT (base) /* Check alignment. */ && TYPE_ALIGN (cand) == align - && TYPE_USER_ALIGN (cand) == TYPE_USER_ALIGN (base) + /* Check this is a user-aligned type as build_aligned_type + would create. */ + && TYPE_USER_ALIGN (cand) && attribute_list_equal (TYPE_ATTRIBUTES (cand), TYPE_ATTRIBUTES (base)) && check_lang_type (cand, base)); -- 2.7.4