From patchwork Wed Oct 23 16:23:24 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Andrew MacLeod X-Patchwork-Id: 99443 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6B9BB3858C50 for ; Wed, 23 Oct 2024 16:24:01 +0000 (GMT) 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 ESMTP id 1D4FB3858D28 for ; Wed, 23 Oct 2024 16:23:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1D4FB3858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1D4FB3858D28 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1729700613; cv=none; b=Tg2otZP0F5qEAaqugjTrJ+yBF2ThOIX+cmrE6KGY6hdP0I8/I7XAur/y6WhNixEW+kJ8M+0+SpCyudOvOPrXGe0soXnjhL35cbOrzof8OhSgfKfw7zkBKl0cIQAgPm5y95XxrSCjSDM/vO1zrtUBFZrQJPfrvayh5UYiaspfptk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1729700613; c=relaxed/simple; bh=YPSmpIE5MDn1z1ZOFpcEodoWOpY6UmVjPPKIsA/IxuE=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=S674u3svKuEnEIV0N48WK/EMiZcntHCVGnPIwBGt7ybemuO0GUZZmL6yDHEKPbEAKN9LfmwDTPZSQjSZfcInBUQDkRs2ZwbnLl3D+ZqHHe/MN7OTXih1IuTIXUAXqhjqKKhCPBgjt+SWWOVUyXPu+BXNDKm9kkKmNyzjtxTI3e8= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729700610; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=UU2aECqGQtY+PHEn+Y+jKKAHvjd0WDZ1fSiMC6clpJY=; b=hfa83TzJPhT7Z5hrUnyaSjeu0onSLkt0RVWqD17LFcmNwoatE2NX3bQ5LZozOqocWxHjfj kDR4oVsQXIR4aWNSl5epyFY1M4ztu3l6Y1yuInvFSQBrFJoPiXltTB3aL3lF11nw2Vnu3t KXl80l2U68PynMjVbnOeksT46Ck3zPA= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-56-qTPJm1GsOky9jmbyAMcDAg-1; Wed, 23 Oct 2024 12:23:29 -0400 X-MC-Unique: qTPJm1GsOky9jmbyAMcDAg-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-4315eaa3189so58322885e9.1 for ; Wed, 23 Oct 2024 09:23:28 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1729700607; x=1730305407; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=QCuf1jnWgDmLthuRqhSNY/dXpeACeO29XU0eQk1ts0c=; b=DVZnqxBXAIcf8+dvOr2Ld5jj+yK91VEJYnTDmd5sm56OWEU80IwmnwCt6utQMnQfai apf10ou7GskrwVSLvgyAD53TEXCqtsrZO5SZDoO5llI0uSSWpuTNOPg/ITcfzizu5gnF duNskuybN+wUe/IBwJ/ls39C8sMGZ4WQGONwZtcJ4xpmsU3TadcvNCCj2ukIiXgR6nMq ZdEN+zI5G2aa6CyD9FvHxDlNMixBInltM9EF+ma9EFsrNZbjm2L/R3Z99qUYexSWTU1J mJQfkape4LbhTtvT1PiIbww1up1rl2VP2lMXM+hsWrMDKLqPHrqp7WuLFB3d0FPPGOhH YQrg== X-Gm-Message-State: AOJu0Yzbk8g+/vve2I0Qi71ZaquhnMTETxWlAVKQ76chtObJB0Jxm0J1 J0VU8uVwvLg2kpKBtjKycgoTDylKwk3cOpHdPBB8gA9Qr6WuDLZCTZJpUs6qVexsLYVISvm5wZ/ C20VJW1VbZLXH3Sp/k1JnL5/NYK9PqZv1oYM8VVgBHFtUjuFXab5TqFoNUp/Cmks1xWZU18EdSD kX9b5/oKBc5v1VbWlWFtj9nueVOJOwnw1RK2E6B8m6iw== X-Received: by 2002:a05:600c:1ca4:b0:431:5f8c:ccb9 with SMTP id 5b1f17b1804b1-431842115ddmr36790385e9.17.1729700607512; Wed, 23 Oct 2024 09:23:27 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE9HNYw3howwJZ/gT1RCyhegvqI3XNh5D+vrkPIW4Cvvg8hT9zIHqNgS5Qpa57vL6pjC9GStg== X-Received: by 2002:a05:600c:1ca4:b0:431:5f8c:ccb9 with SMTP id 5b1f17b1804b1-431842115ddmr36789945e9.17.1729700606936; Wed, 23 Oct 2024 09:23:26 -0700 (PDT) Received: from [192.168.0.174] ([104.219.121.80]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43186bdba56sm20371105e9.16.2024.10.23.09.23.25 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 23 Oct 2024 09:23:26 -0700 (PDT) Message-ID: Date: Wed, 23 Oct 2024 12:23:24 -0400 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: gcc-patches From: Andrew MacLeod Subject: [COMMITTED] PR tree-optimization/117222 - Implement operator_pointer_diff::fold_range X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-Spam-Status: No, score=-12.5 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_H3, 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~patchwork=sourceware.org@gcc.gnu.org pointer_diff depends on range_operator::fold_range to do the generic fold, which invokes wi_fold on subranges.  It also in turn invokes op1_op2_relation_effect for relation effects. This worked fine when pointers were implemented with irange, but when the transition to prange was made, a new version of fold_range is invoked by dispatch which uses prange operators. The default fold_range for prange does nothing, expecting the few pointer operators which need it to implement their own fold_range.  As a result all calls to fold_range for pointer_diff were returning false, which translates to VARYING. This PR demonstrates a dependency on knowing the relation between the operands is VREL_NE, in which case pointer_diff should return a non-zero result instead of varying.  This patch implements the pointer_diff version of fold_range. I am also auditing the other prange operators to see if similar dispatch related issues were missed. Bootstrapped on x86_64-pc-linux-gnu with no regressions. Pushed. Andrew From 774ad67fba458dd1beaa0f2d3e389aac46ca18b5 Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Mon, 21 Oct 2024 16:32:00 -0400 Subject: [PATCH] Implement operator_pointer_diff::fold_range prange has no default fold_range processing like irange does, so each pointer specific operator needs to implement its own fold routine. PR tree-optimization/117222 gcc/ * range-op-ptr.cc (operator_pointer_diff::fold_range): New. (operator_pointer_diff::op1_op2_relation_effect): Remove irange variant. (operator_pointer_diff::update_bitmask): Likewise. gcc/testsuite * g++.dg/pr117222.C: New. --- gcc/range-op-ptr.cc | 37 ++++++++++++++++++--------------- gcc/testsuite/g++.dg/pr117222.C | 16 ++++++++++++++ 2 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/g++.dg/pr117222.C diff --git a/gcc/range-op-ptr.cc b/gcc/range-op-ptr.cc index 24e206c00cd..07a551618f9 100644 --- a/gcc/range-op-ptr.cc +++ b/gcc/range-op-ptr.cc @@ -567,25 +567,38 @@ pointer_or_operator::wi_fold (irange &r, tree type, class operator_pointer_diff : public range_operator { + using range_operator::fold_range; using range_operator::update_bitmask; using range_operator::op1_op2_relation_effect; - virtual bool op1_op2_relation_effect (irange &lhs_range, - tree type, - const irange &op1_range, - const irange &op2_range, - relation_kind rel) const; + virtual bool fold_range (irange &r, tree type, + const prange &op1, + const prange &op2, + relation_trio trio) const final override; virtual bool op1_op2_relation_effect (irange &lhs_range, tree type, const prange &op1_range, const prange &op2_range, relation_kind rel) const final override; - void update_bitmask (irange &r, const irange &lh, const irange &rh) const - { update_known_bitmask (r, POINTER_DIFF_EXPR, lh, rh); } void update_bitmask (irange &r, const prange &lh, const prange &rh) const final override { update_known_bitmask (r, POINTER_DIFF_EXPR, lh, rh); } } op_pointer_diff; +bool +operator_pointer_diff::fold_range (irange &r, tree type, + const prange &op1, + const prange &op2, + relation_trio trio) const +{ + gcc_checking_assert (r.supports_type_p (type)); + + r.set_varying (type); + relation_kind rel = trio.op1_op2 (); + op1_op2_relation_effect (r, type, op1, op2, rel); + update_bitmask (r, op1, op2); + return true; +} + bool operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type, const prange &op1_range, @@ -602,16 +615,6 @@ operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type, return minus_op1_op2_relation_effect (lhs_range, type, op1, op2, rel); } -bool -operator_pointer_diff::op1_op2_relation_effect (irange &lhs_range, tree type, - const irange &op1_range, - const irange &op2_range, - relation_kind rel) const -{ - return minus_op1_op2_relation_effect (lhs_range, type, op1_range, op2_range, - rel); -} - bool operator_identity::fold_range (prange &r, tree type ATTRIBUTE_UNUSED, const prange &lh ATTRIBUTE_UNUSED, diff --git a/gcc/testsuite/g++.dg/pr117222.C b/gcc/testsuite/g++.dg/pr117222.C new file mode 100644 index 00000000000..60cf6e30ed5 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr117222.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-require-effective-target c++11 } +// { dg-options "-O3 -fdump-tree-evrp" } + +#include +int main() +{ + std::vector c {1,2,3,0}; + while(c.size() > 0 && c.back() == 0) + { + auto sz = c.size() -1; + c.resize(sz); + } + return 0; +} +/* { dg-final { scan-tree-dump "Global Exported.*\[-INF, -1\]\[1, +INF\]" "evrp" } } */ -- 2.45.0