From patchwork Tue Jun 27 09:45:33 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 113329 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp8070014vqr; Tue, 27 Jun 2023 02:46:23 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4MMKas9cZ8KnCykhHRmpiCVi3lNaINrFlUYtEufvc66+T0h4eweFrHMW+epb0PTenUTBUT X-Received: by 2002:a17:907:60c9:b0:988:e243:7a9f with SMTP id hv9-20020a17090760c900b00988e2437a9fmr22106418ejc.35.1687859183033; Tue, 27 Jun 2023 02:46:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1687859183; cv=none; d=google.com; s=arc-20160816; b=qaLsKa0xQhiyvyxlHWV9c0Iw4AzW+cdDjJHxnLy/0KXsEkiPL3H+nwU9krK7fY8EZG ZeCo9pnvVZLTJgjVos+V7FaIAGaNDpsH2RA+j9BjwE9mxo1k5OQujDDr4IhsD+Yol4rG DC15nP+b811dhT8+UpP6zz1Sd1dOfFLaaSAtt8CLCFpPeQ+caiQ0q1uAM+pJ3zUnduQM oiVaxWY9jsfUxgAmYrcl+MlUZzIqx0SwiIEl7fRBroOghLSnmifjhhxFYrn3TyQ42ZIo AX3JyhsSwW+NGc5Tfjg1Xe/Mh9mPup3jjJ9w/ruHwYpDhR3Iwct+E1zuh7kUabi4jy3R u/xQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:message-id :mime-version:subject:cc:to:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=vu75726z4VG0EKnKGrTXwD/CthX8sNWCfx8BVM0+8go=; fh=3pP5I2W1o8T0QF0cYdowfSwHW7aPeXdKZjMs+QH8H7I=; b=i81DPpwEyxRpm5Fkf/x7pcXvwO5JfskADwBGsitU0m9vDy1//F7G8MtUsNzZuekQqU NN0wRQjJ08EA9tMSLGOVVvZlN9A4TgxIYhOknjjCNzBKdAe5HbtS4d5bJavo+kjMxyJn X5rRBQyLfQcb4D46BHrWGEQfadqfuXAdTmrUGQft5BdIhF6YOP8bjybLuDzlKBrYjc6O 4ZrFyQYEpR3vofPgqZ6NAsG8MTN3UsKgI9MyXiJ8UjkV+HGjEXy3FvAAWzuCKacOwYAR /ioGJrHc2FcWjnEVevPuFVQSEy1L4fkFEfJN9xoAnVys/0/SKelnhks7CM69V5tZNgOz JdRA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=RQs6zSDW; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id ss13-20020a170907038d00b00990dbce26f3si2242446ejb.122.2023.06.27.02.46.22 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 27 Jun 2023 02:46:23 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=RQs6zSDW; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A4F54385840D for ; Tue, 27 Jun 2023 09:46:19 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A4F54385840D DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1687859179; bh=vu75726z4VG0EKnKGrTXwD/CthX8sNWCfx8BVM0+8go=; h=Date:To:cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=RQs6zSDWhxIwl8FeqGKghuwI5rqBk63Y8xHlmOcYlaXBzzRlL8LKnPoL/W3/xCieO gjM3TpEqimS4Cjd2ypTM8CGkxb1lYc4Gi+EB4xTe92RHypgnKBb+rtrG4phZUnAhtx GoQhuLKTang1JAp69L5UdW6anB5cgSwl8TmAlM1o= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 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) 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) To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek , jeffreyalaw@gmail.com Subject: [PATCH] Prevent TYPE_PRECISION on VECTOR_TYPEs MIME-Version: 1.0 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1769848630668777490?= X-GMAIL-MSGID: =?utf-8?q?1769848630668777490?= 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)