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 2DAFC385841C for ; Tue, 23 Nov 2021 16:17:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2DAFC385841C Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-18-fuH-rSJeP1-CqltntJf-XA-1; Tue, 23 Nov 2021 11:17:50 -0500 X-MC-Unique: fuH-rSJeP1-CqltntJf-XA-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 75E70100C660; Tue, 23 Nov 2021 16:17:49 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.23]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0EEF126FBF; Tue, 23 Nov 2021 16:17:48 +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 1ANGHkiX2111805 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Tue, 23 Nov 2021 17:17:46 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.16.1/8.16.1/Submit) id 1ANGHj3x2111804; Tue, 23 Nov 2021 17:17:45 +0100 Date: Tue, 23 Nov 2021 17:17:45 +0100 From: Jakub Jelinek To: Siddhesh Poyarekar Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH 06/10] tree-object-size: Support dynamic sizes in conditions Message-ID: <20211123161745.GB2646553@tucnak> Reply-To: Jakub Jelinek References: <20211109190137.1107736-1-siddhesh@gotplt.org> <20211109190137.1107736-7-siddhesh@gotplt.org> <20211123151252.GZ2646553@tucnak> <773d3a85-b78c-c67e-c190-b9b128d3738b@gotplt.org> <667a586c-7a43-b711-09e9-91a40cdd7072@gotplt.org> MIME-Version: 1.0 In-Reply-To: <667a586c-7a43-b711-09e9-91a40cdd7072@gotplt.org> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-5.7 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, 23 Nov 2021 16:17:53 -0000 On Tue, Nov 23, 2021 at 09:08:35PM +0530, Siddhesh Poyarekar wrote: > On 11/23/21 21:06, Siddhesh Poyarekar wrote: > > On 11/23/21 20:42, Jakub Jelinek wrote: > > > On Wed, Nov 10, 2021 at 12:31:32AM +0530, Siddhesh Poyarekar wrote: > > > >     (object_sizes_execute): Don't insert min/max for dynamic sizes. > > > > > > I'm worried about this. > > > I'd say what we might want to do is in the early pass for __bdos > > > compute actually __bos (i.e. the static one) and add MIN_EXPR/MAX_EXPR > > > for the result of the __bdos call from the second pass with the > > > statically computed value. > > > > > > The reason for the MIN_EXPR/MAX_EXPR stuff is that GIMPLE optimizations > > > can remove exact ADDR_EXPRs with detailed COMPONENT_REF etc. access paths > > > in it, so during the late objsz2 pass the subobject modes don't work > > > reliably anymore.  But the subobject knowledge should be the same between > > > the static and dynamic evaluation... > > > > So in the dynamic case we almost always end up with the right expression > > in objsz1, except in cases where late optimizations make available > > information that wasn't available earlier.  How about putting in a > > MIN_EXPR/MAX_EXPR if we *fail* to get the subobject size instead? > > Actually if we don't get a dynamic expression it's unlikely that we'll get a > static size either, so I'm not sure if MIN_EXPR/MAX_EXPR will actually do > anything useful. Consider: struct S { int a; char b[16]; int c; char d[]; }; static int foo (struct S *s) { return __builtin_object_size (&s->b[2], 1); } int bar (int m) { struct S *s = (struct S *) __builtin_malloc (m); int r = foo (s); __builtin_free (s); return r; } In early_objsz, foo isn't inlined, we can statically determine the maximum bound of 14 but don't really know how large the allocation will actually be. So, we record that foo returns MIN_EXPR <__builtin_object_size (&s->b[2], 1), 14> and in the late objsz compute that as MIN_EXPR <-1UL, 14>. Now, with __builtin_dynamic_object_size, I think it is pretty much the same, you don't know how large the allocation actually is, so IMHO we want to record MIN_EXPR <__buitin_dynamic_object_size (&s->b[2], 1), 14> and at runtime do MIN_EXPR or so. It is true that it is just an upper bound, if we do: static int baz (struct S *s, int l) { return __builtin_dynamic_object_size (l ? &s->b[3] : &s->b[2], 1); } int qux (int m, int l) { struct S *s = (struct S *) __builtin_malloc (m); int r = foo (s, l); __builtin_free (s); return r; } then the statically computed __bos in early_objsz would be still 14 and I think dynamic needs to punt because it really doesn't know how large the allocation will be. In the late objsz it can make m - 6 - !!l out of it for the __bdos (, 0) from it and combine that to MIN_EXPR which still isn't exact, that would be l ? MIN_EXPR : MIN_EXPR . But, at late objsz time, the information that there was &s->b[3] and &s->b[2] might be gone, consider e.g. in baz above a call corge ((char *) s + offsetof (struct S, b) + 2, (char *) s + offsetof (struct S, b) + 3); where SCCVN will CSE the (char *) s + offsetof (struct S, b) + 2 and &s->b[2] etc. expressions because they have the same value. But __bos ((char *) s + offsetof (struct S, b) + 2, 1) should be equal to __bos ((char *) s + offsetof (struct S, b) + 2, 0). Jakub