From patchwork Thu Aug 17 17:40:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew MacLeod X-Patchwork-Id: 135924 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b82d:0:b0:3f2:4152:657d with SMTP id z13csp867769vqi; Thu, 17 Aug 2023 10:41:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFwMw0Ey2obeH7uFTK8QU//erlr5o8gwU0jYFpfOOmN/kfd34N8WUAwoqsYED2QDB+ZihZA X-Received: by 2002:a2e:9cc5:0:b0:2b9:cb2a:11bf with SMTP id g5-20020a2e9cc5000000b002b9cb2a11bfmr21291ljj.49.1692294059771; Thu, 17 Aug 2023 10:40:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692294059; cv=none; d=google.com; s=arc-20160816; b=u+789NxFeyuAAuAxUYAwJRwmtVHpD7XwlCg+rp0Avua5wX0lwunvlCp9tonbwyURQ/ HhPpLNaaUfc4QnyDOihgpKmoaHQoQEsxmQWIO0xG1a7nRviZ271IFQ4d9iliDtS2JNQX gX5+03ZvOfoUoDrzK6OhOW78DbopI96rK4J5UxByyl+qj0KHrq3IGQ1IxcX1M349EPdx tTaSERhOKpghC7cTiOqPfknmU8m7zC9VLV7/1Mlo6b6TssagaCy1XioeCpXkCA0PrCar m1MnICgQkdoaiGbFR3evgcplPHYifZjxfuDeu0kywe11x585Hq1miUeDSYY8IisAdr2m 1Z3A== 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:content-language :subject:cc:to:user-agent:mime-version:date:message-id:dmarc-filter :delivered-to:dkim-signature:dkim-filter; bh=cZyGFzUntOLOOYjxYpTc2xVA7gKc8KcUwnyPdNBSGrU=; fh=gclC9oA2esmCBAay1qQbUaUwD9iqJFz6H0IpB4Uz3uA=; b=QM9I+MKowRzsrL9hNUnK5Q8ITO2VfPTgPkvgHe++dxI3K6AzQ+0EUVU/aAcJOJh18P pzgo6KYccWcZq+NQi9/PU88lHhzok06REXjLKVpObniqEiO6bFEs+lnPN0QJiKBAOrLC owSvWv5dcA0D2c8yDoWbbv6ubCmaEJRBJI5EuX/qq50/pYXQ9R8CNXF2VEj7SRPmOzUW AFzm9PZVpAkNqrutpOeUzzFeRfBP4uUsqnQaovScGU0KwsOUY0SvyQakUyg+qvQgn2/Y IR3Ceb7Amu64ITaHwRNfTSQIhAixs0UA7yIzguQ1DBj87nExob+ZWtQEqN2xIUDCJ0r/ is9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=x8B1jIba; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c 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 (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id ss13-20020a170907038d00b0099ce392acc9si1818ejb.904.2023.08.17.10.40.59 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Aug 2023 10:40:59 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=x8B1jIba; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c 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 C442F385417F for ; Thu, 17 Aug 2023 17:40:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C442F385417F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1692294055; bh=cZyGFzUntOLOOYjxYpTc2xVA7gKc8KcUwnyPdNBSGrU=; h=Date:To:Cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=x8B1jIba83x4N5jnOwzvkN/YUMaFYScVjpOq7lAVMQzKSDVH4nLQaPrga3wc4cXue qj4YvWIiddpvag8bmygJRQaAcnsvfWyjb8+4w2tDGbS+nJIuAfrpO9JcOeZpPgEEi7 eV97mX3cg9zPnXqTsFLCyiBIEul3tAKKuinH0iBE= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 AE60B3858C27 for ; Thu, 17 Aug 2023 17:40:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE60B3858C27 Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-446-4WTTNbobNueRgAutYaTQtA-1; Thu, 17 Aug 2023 13:40:06 -0400 X-MC-Unique: 4WTTNbobNueRgAutYaTQtA-1 Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-76c973b8973so7999185a.1 for ; Thu, 17 Aug 2023 10:40:06 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1692294005; x=1692898805; h=subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=aCI6Su6fCtCLGzdtu+x+2TypP3zIDISPQ9+Jmi71KWk=; b=QB25QJTHp2dwz6YvRtaWgqWOF/YD1HO6RrLuqO/aq8G76w4CbsjoiGZ3qEqNppZa7P fGZr7WYBSPpMH7tvI4CJ2LCBvROydpjB3mVZkZzHGfg4bL15bLx/iT8wkxJkPU+tklUz M3SQ+U/TO5ZfQiqReyzRTnJ6n7AyBxT/VTt/VZHYSA2M3nlZfMODv0hBfqx8VGYTlUH8 WseVWVQUEuY7bOUVENhsXGKCRNfDHfWZtXvutqhj+guW3//Za8ntF6qNAugYNys0A8tn s4FDpBYvW2xH8Zxy/0ywE+K305V6VP7ndKcS//Pq5gcVJ+35peQo3rZc5PHAlMLd+cod mfTA== X-Gm-Message-State: AOJu0YwM4+d9Tc/8oeZK+Ml1I1o4qa9XGgjwyePmbvz0K6YkdouHfzrO iYWdPTYe0/gxEQO/YSCaJOIbzeh+SYove6yZ9wlggVxKdaMFdLtKcAlTydqTw/tEgBTLlNfeA1B E0VVAKWBITk3Q/nlN0TJLqjfhLhpKOGtrdXJXHDmmUheaefkF6rQzxMFQXPv1e06PQIoyruWkwR QVeg== X-Received: by 2002:a05:620a:4414:b0:76c:5715:b45f with SMTP id v20-20020a05620a441400b0076c5715b45fmr434239qkp.14.1692294005266; Thu, 17 Aug 2023 10:40:05 -0700 (PDT) X-Received: by 2002:a05:620a:4414:b0:76c:5715:b45f with SMTP id v20-20020a05620a441400b0076c5715b45fmr434211qkp.14.1692294004743; Thu, 17 Aug 2023 10:40:04 -0700 (PDT) Received: from [10.19.97.94] ([69.17.166.84]) by smtp.gmail.com with ESMTPSA id a8-20020a05620a102800b00767d4a3f4d9sm5303644qkk.29.2023.08.17.10.40.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 17 Aug 2023 10:40:04 -0700 (PDT) Message-ID: <8da8804e-be70-a023-253c-317327ff955d@redhat.com> Date: Thu, 17 Aug 2023 13:40:03 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 To: gcc-patches Cc: "hernandez, aldy" Subject: [COMMITTED] PR tree-optimization/111009 - Fix range-ops operator_addr. X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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: Andrew MacLeod via Gcc-patches From: Andrew MacLeod Reply-To: Andrew MacLeod Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1774498936177690832 X-GMAIL-MSGID: 1774498936177690832 operator_addr was simply calling fold_range() to implement op1_range, but it turns out op1_range needs to be more restrictive. take for example  from the PR :    _13 = &dso->maj when folding,  getting a value of 0 for op1 means dso->maj resolved to a value of [0,0].  fold_using_range::range_of_address will have processed the symbolics, or at least we know that op1 is 0.  Likewise if it is non-zero, we can also conclude the LHS is non-zero. however, when working from the LHS, we cannot make the same conclusions.  GORI has no concept of symblics, so knowing the expressions is [0,0]  = &  we cannot conclude the op1 is also 0.. in particular &dso->maj wouldnt be unless dso was zero and maj was also a zero offset. Likewise if the LHS is [1,1] we cant be sure op1 is nonzero unless we know the type cannot wrap. This patch simply implements op1_range with these rules instead of calling fold_range. Bootstrapped on x86_64-pc-linux-gnu with no regressions.  Pushed. Andrew From dc48d1d1d4458773f89f21b2f019f66ddf88f2e5 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Thu, 17 Aug 2023 11:13:14 -0400 Subject: [PATCH] Fix range-ops operator_addr. Lack of symbolic information prevents op1_range from beig able to draw the same conclusions as fold_range can. PR tree-optimization/111009 gcc/ * range-op.cc (operator_addr_expr::op1_range): Be more restrictive. gcc/testsuite/ * gcc.dg/pr111009.c: New. --- gcc/range-op.cc | 12 ++++++++++- gcc/testsuite/gcc.dg/pr111009.c | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr111009.c diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 086c6c19735..268f6b6f025 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -4325,7 +4325,17 @@ operator_addr_expr::op1_range (irange &r, tree type, const irange &op2, relation_trio) const { - return operator_addr_expr::fold_range (r, type, lhs, op2); + if (empty_range_varying (r, type, lhs, op2)) + return true; + + // Return a non-null pointer of the LHS type (passed in op2), but only + // if we cant overflow, eitherwise a no-zero offset could wrap to zero. + // See PR 111009. + if (!contains_zero_p (lhs) && TYPE_OVERFLOW_UNDEFINED (type)) + r = range_nonzero (type); + else + r.set_varying (type); + return true; } // Initialize any integral operators to the primary table diff --git a/gcc/testsuite/gcc.dg/pr111009.c b/gcc/testsuite/gcc.dg/pr111009.c new file mode 100644 index 00000000000..3accd9ac063 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr111009.c @@ -0,0 +1,38 @@ +/* PR tree-optimization/111009 */ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-strict-overflow" } */ + +struct dso { + struct dso * next; + int maj; +}; + +__attribute__((noipa)) static void __dso_id__cmp_(void) {} + +__attribute__((noipa)) +static int bug(struct dso * d, struct dso *dso) +{ + struct dso **p = &d; + struct dso *curr = 0; + + while (*p) { + curr = *p; + // prevent null deref below + if (!dso) return 1; + if (dso == curr) return 1; + + int *a = &dso->maj; + // null deref + if (!(a && *a)) __dso_id__cmp_(); + + p = &curr->next; + } + return 0; +} + +__attribute__((noipa)) +int main(void) { + struct dso d = { 0, 0, }; + bug(&d, 0); +} +