From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id CC3CB3858404 for ; Tue, 19 Oct 2021 06:58:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CC3CB3858404 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-324-rE5OoDVhPsChmUEjjaYVXw-1; Tue, 19 Oct 2021 02:58:18 -0400 X-MC-Unique: rE5OoDVhPsChmUEjjaYVXw-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id BE0A9801FCE; Tue, 19 Oct 2021 06:58:17 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.193.172]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 597625BB06; Tue, 19 Oct 2021 06:58:17 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.16.1/8.16.1) with ESMTPS id 19J6wEiW2905888 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 19 Oct 2021 08:58:14 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 19J6wDtu2905887; Tue, 19 Oct 2021 08:58:13 +0200 Date: Tue, 19 Oct 2021 08:58:13 +0200 From: Jakub Jelinek To: Siddhesh Poyarekar Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] tree-object-size: Make unknown a computation Message-ID: <20211019065813.GJ304296@tucnak> Reply-To: Jakub Jelinek References: <20211019041745.199156-1-siddhesh@gotplt.org> MIME-Version: 1.0 In-Reply-To: <20211019041745.199156-1-siddhesh@gotplt.org> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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-List-Received-Date: Tue, 19 Oct 2021 06:58:22 -0000 On Tue, Oct 19, 2021 at 09:47:45AM +0530, Siddhesh Poyarekar wrote: > Compute the unknown size value as a function of the min/max bit of > object_size_type. This transforms into a neat little branchless > sequence on x86_64: > > movl %edi, %eax > sarl %eax > xorl $1, %eax > negl %eax > cltq > > which should be faster than loading the value from memory. A quick > unscientific test using > > `time make check-gcc RUNTESTFLAGS="dg.exp=builtin*"` But if you use some other higher bit of object_size_type for the mode (normal vs. dynamic) you'd need to mask it away, so it will become longer. Anyway, I guess that part is ok. > -/* Compute object_sizes for PTR, defined to an unknown value. */ > - > -static void > -unknown_object_size (struct object_size_info *osi, tree ptr) > -{ > - int object_size_type = osi->object_size_type; > - unsigned int varno = SSA_NAME_VERSION (ptr); > - unsigned HOST_WIDE_INT bytes; > - > - gcc_assert (object_sizes[object_size_type][varno] > - != unknown[object_size_type]); > - gcc_assert (osi->pass == 0); > - > - bytes = unknown[object_size_type]; > - > - if ((object_size_type & 2) == 0) > - { > - if (object_sizes[object_size_type][varno] < bytes) > - object_sizes[object_size_type][varno] = bytes; > - } > - else > - { > - if (object_sizes[object_size_type][varno] > bytes) > - object_sizes[object_size_type][varno] = bytes; > - } > -} But I don't think removing this function is desirable. Can it be greatly simplified? Yes, certainly. The assert verifies it is not unknown before, and then for mode 0 or 1 uses maximum which will always be unknown and for mode 2 or 3 minimum which will always be unknown as well. But I'd keep the asserts in there. So it can become int object_size_type = osi->object_size_type; unsigned int varno = SSA_NAME_VERSION (ptr); unsigned HOST_WIDE_INT bytes = unknown (object_size_type); gcc_checking_assert (object_sizes[object_size_type][varno] != bytes); gcc_checking_assert (osi->pass == 0); object_sizes[object_size_type][varno] = bytes; Jakub