From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [IPv6:2001:67c:2178:6::1d]) by sourceware.org (Postfix) with ESMTPS id 11BE03858C31 for ; Tue, 27 Jun 2023 09:45:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 11BE03858C31 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id E5C8E1F459; Tue, 27 Jun 2023 09:45:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1687859133; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=vu75726z4VG0EKnKGrTXwD/CthX8sNWCfx8BVM0+8go=; b=vx4vIW7QFCNrDMz+O1F+hAI1oKZ8kxl0bOHS+emBbvu4CGWTQcVaCwrlHCfaGnRdo1OOof wmmDWK3Gt89rQayAwxfdgAHYQ4kexAYRwT/mWAodaeN0rQRXFmLtePWX4/Rdcdda5eYHfG pMqQmUY8jEgNnPB+WaxsZQBJL0DBbPo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1687859133; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=vu75726z4VG0EKnKGrTXwD/CthX8sNWCfx8BVM0+8go=; b=/lKWprr5tEwvYep3BRh6FL6JZ308ZKU8Q5xVLZYjuhA0LlaImue9EytdH4sys46CaK1Jfp F8QhIUQpaSMidzDQ== Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id C82C713462; Tue, 27 Jun 2023 09:45:33 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id kqfEL72vmmQ8ZgAAMHmgww (envelope-from ); Tue, 27 Jun 2023 09:45:33 +0000 Date: Tue, 27 Jun 2023 11:45:33 +0200 (CEST) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek , jeffreyalaw@gmail.com Subject: [PATCH] Prevent TYPE_PRECISION on VECTOR_TYPEs MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Message-Id: <20230627094533.C82C713462@imap2.suse-dmz.suse.de> X-Spam-Status: No, score=-11.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: The following makes sure that using TYPE_PRECISION on VECTOR_TYPE ICEs when tree checking is enabled. This should avoid wrong-code in cases like PR110182 and instead ICE. It also introduces a TYPE_PRECISION_RAW accessor and adjusts places I found that are eligible to use that. Bootstrapped and tested on x86_64-unknown-linux-gnu with all languages enabled. OK for trunk? There is definitely going to be fallout but it should be straight-forward to fix with quick fixes using TYPE_PRECISION_RAW possible. Thanks, Richard. * tree.h (TYPE_PRECISION): Check for non-VECTOR_TYPE. (TYPE_PRECISION_RAW): Provide raw access to the precision field. * tree.cc (verify_type_variant): Compare TYPE_PRECISION_RAW. (gimple_canonical_types_compatible_p): Likewise. * tree-streamer-out.cc (pack_ts_type_common_value_fields): Stream TYPE_PRECISION_RAW. * tree-streamer-in.cc (unpack_ts_type_common_value_fields): Likewise. * lto-streamer-out.cc (hash_tree): Hash TYPE_PRECISION_RAW. gcc/lto/ * lto-common.cc (compare_tree_sccs_1): Use TYPE_PRECISION_RAW. --- gcc/lto-streamer-out.cc | 2 +- gcc/lto/lto-common.cc | 2 +- gcc/tree-streamer-in.cc | 2 +- gcc/tree-streamer-out.cc | 2 +- gcc/tree.cc | 6 +++--- gcc/tree.h | 4 +++- 6 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gcc/lto-streamer-out.cc b/gcc/lto-streamer-out.cc index 5ab2eb4301e..3432dd434e2 100644 --- a/gcc/lto-streamer-out.cc +++ b/gcc/lto-streamer-out.cc @@ -1373,7 +1373,7 @@ hash_tree (struct streamer_tree_cache_d *cache, hash_map *map, if (AGGREGATE_TYPE_P (t)) hstate.add_flag (TYPE_TYPELESS_STORAGE (t)); hstate.commit_flag (); - hstate.add_int (TYPE_PRECISION (t)); + hstate.add_int (TYPE_PRECISION_RAW (t)); hstate.add_int (TYPE_ALIGN (t)); hstate.add_int (TYPE_EMPTY_P (t)); } diff --git a/gcc/lto/lto-common.cc b/gcc/lto/lto-common.cc index 537570204b3..afe051edf74 100644 --- a/gcc/lto/lto-common.cc +++ b/gcc/lto/lto-common.cc @@ -1280,7 +1280,7 @@ compare_tree_sccs_1 (tree t1, tree t2, tree **map) compare_values (TYPE_RESTRICT); compare_values (TYPE_USER_ALIGN); compare_values (TYPE_READONLY); - compare_values (TYPE_PRECISION); + compare_values (TYPE_PRECISION_RAW); compare_values (TYPE_ALIGN); /* Do not compare TYPE_ALIAS_SET. Doing so introduce ordering issues with calls to get_alias_set which may initialize it for streamed diff --git a/gcc/tree-streamer-in.cc b/gcc/tree-streamer-in.cc index c803800862c..e6919e463c0 100644 --- a/gcc/tree-streamer-in.cc +++ b/gcc/tree-streamer-in.cc @@ -387,7 +387,7 @@ unpack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) TYPE_TYPELESS_STORAGE (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_EMPTY_P (expr) = (unsigned) bp_unpack_value (bp, 1); TYPE_NO_NAMED_ARGS_STDARG_P (expr) = (unsigned) bp_unpack_value (bp, 1); - TYPE_PRECISION (expr) = bp_unpack_var_len_unsigned (bp); + TYPE_PRECISION_RAW (expr) = bp_unpack_var_len_unsigned (bp); SET_TYPE_ALIGN (expr, bp_unpack_var_len_unsigned (bp)); #ifdef ACCEL_COMPILER if (TYPE_ALIGN (expr) > targetm.absolute_biggest_alignment) diff --git a/gcc/tree-streamer-out.cc b/gcc/tree-streamer-out.cc index 5751f77273b..719cbeacf99 100644 --- a/gcc/tree-streamer-out.cc +++ b/gcc/tree-streamer-out.cc @@ -356,7 +356,7 @@ pack_ts_type_common_value_fields (struct bitpack_d *bp, tree expr) bp_pack_value (bp, TYPE_TYPELESS_STORAGE (expr), 1); bp_pack_value (bp, TYPE_EMPTY_P (expr), 1); bp_pack_value (bp, TYPE_NO_NAMED_ARGS_STDARG_P (expr), 1); - bp_pack_var_len_unsigned (bp, TYPE_PRECISION (expr)); + bp_pack_var_len_unsigned (bp, TYPE_PRECISION_RAW (expr)); bp_pack_var_len_unsigned (bp, TYPE_ALIGN (expr)); } diff --git a/gcc/tree.cc b/gcc/tree.cc index 8e144bc090e..58288efa2e2 100644 --- a/gcc/tree.cc +++ b/gcc/tree.cc @@ -13423,7 +13423,7 @@ verify_type_variant (const_tree t, tree tv) } verify_variant_match (TYPE_NEEDS_CONSTRUCTING); } - verify_variant_match (TYPE_PRECISION); + verify_variant_match (TYPE_PRECISION_RAW); if (RECORD_OR_UNION_TYPE_P (t)) verify_variant_match (TYPE_TRANSPARENT_AGGR); else if (TREE_CODE (t) == ARRAY_TYPE) @@ -13701,8 +13701,8 @@ gimple_canonical_types_compatible_p (const_tree t1, const_tree t2, || TREE_CODE (t1) == OFFSET_TYPE || POINTER_TYPE_P (t1)) { - /* Can't be the same type if they have different recision. */ - if (TYPE_PRECISION (t1) != TYPE_PRECISION (t2)) + /* Can't be the same type if they have different precision. */ + if (TYPE_PRECISION_RAW (t1) != TYPE_PRECISION_RAW (t2)) return false; /* In some cases the signed and unsigned types are required to be diff --git a/gcc/tree.h b/gcc/tree.h index 1854fe4a7d4..1b791335d38 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -2191,7 +2191,9 @@ class auto_suppress_location_wrappers #define TYPE_SIZE_UNIT(NODE) (TYPE_CHECK (NODE)->type_common.size_unit) #define TYPE_POINTER_TO(NODE) (TYPE_CHECK (NODE)->type_common.pointer_to) #define TYPE_REFERENCE_TO(NODE) (TYPE_CHECK (NODE)->type_common.reference_to) -#define TYPE_PRECISION(NODE) (TYPE_CHECK (NODE)->type_common.precision) +#define TYPE_PRECISION(NODE) \ + (TREE_NOT_CHECK (TYPE_CHECK (NODE), VECTOR_TYPE)->type_common.precision) +#define TYPE_PRECISION_RAW(NODE) (TYPE_CHECK (NODE)->type_common.precision) #define TYPE_NAME(NODE) (TYPE_CHECK (NODE)->type_common.name) #define TYPE_NEXT_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.next_variant) #define TYPE_MAIN_VARIANT(NODE) (TYPE_CHECK (NODE)->type_common.main_variant) -- 2.35.3