From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62a.google.com (mail-ej1-x62a.google.com [IPv6:2a00:1450:4864:20::62a]) by sourceware.org (Postfix) with ESMTPS id 0F3E03858D32 for ; Sat, 5 Nov 2022 11:21:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0F3E03858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x62a.google.com with SMTP id sc25so19155793ejc.12 for ; Sat, 05 Nov 2022 04:21:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=ROrV+j8C7oK4x8Hh5hxGVbQ0ZytgxjH9BJ2N90Kuq+g=; b=UqP2LPTX6HWbwZmyXsE6lFJPyrafQsoLiQJesqkVlXr4ZMwmtIUDwQubh7hRnbqvGc 1Nz7xb5DXlo3CiNm4ZW0OHWWtJ4nhYLbe9+5kyFCB4oBJocO6JLlCTn59SkEyZuZ866M Rp43uDaCbwxl44F9BM3VJx0pkPXBPtk03kbd+DNulqqvVDwu8BhUPI3tAQy21EM8lVBc 7pJdrowhSscvA3BeqM5RajtXKsgU/f+zaPaRBZDEnTfE3/dJAPN3ZDGFgNslYFZWtBIe S8zaaxQkTuBmt8RpOCmM4Oxi0vpbDhMQrez0/seAgtuGdV2TEMQFAzJlo4hIAyDMIbMM o7tw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ROrV+j8C7oK4x8Hh5hxGVbQ0ZytgxjH9BJ2N90Kuq+g=; b=zNWbj/J7RxzLVkSViIjIDR60POPP2Cr4yOSaQZH+050/NiUU50G60cNjOm9evU+f7B bXvBEW8Xc0eH6XkaJUu6wurd09gWlx6tiFJLiOa9TpVwOtw5jg4YNnEjr1BmxJPVihr1 UP8xantIhXgh7am9Nonz4nKtIyUri3uwM0QvNE8Aa6+lzTjUUINEbbculzJ6GTxI66Z2 Hz1jVaZmmHqFr+z8K5ZkqC3wCnyJ+fNWX2JdFUUz2UdpjQp/Wu5ne/0jhKDAGpUhqfJh b/Z1Lh7zPQm554M/6f1GeJGD5sn8CN9pm8XSr2anXrlrmL7GzrleF4+a+mQJ73VJ9YR+ sebQ== X-Gm-Message-State: ACrzQf0x84jbud3O3wNtu4fJK8VSWQp91NehQXKhHR8G1Cr+WKY+lqRB JBrkRAiWUGAuhyeRg6yGDQqfi7xoc+Y0DDN3U1o= X-Google-Smtp-Source: AMsMyM4ihZm+7R6oryyk+S5lkBnk8ocogk/KwqWNzkX4cvZzE2zyzwjF5udT+u3A9Q07OPfexZuZuX3bh4pSJGFdQi8= X-Received: by 2002:a17:907:d93:b0:7ad:8319:d095 with SMTP id go19-20020a1709070d9300b007ad8319d095mr37990865ejc.511.1667647284792; Sat, 05 Nov 2022 04:21:24 -0700 (PDT) MIME-Version: 1.0 References: <20221102190819.862078-1-hjl.tools@gmail.com> In-Reply-To: <20221102190819.862078-1-hjl.tools@gmail.com> From: Richard Biener Date: Sat, 5 Nov 2022 12:21:10 +0100 Message-ID: Subject: Re: [PATCH] Extend optimization for integer bit test on __atomic_fetch_[or|and]_* To: "H.J. Lu" Cc: gcc-patches@gcc.gnu.org, liuhongt Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-8.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,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 List-Id: On Wed, Nov 2, 2022 at 8:09 PM H.J. Lu via Gcc-patches wrote: > > Extend optimization for > > _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3); > _5 = (signed int) _1; > _4 = _5 >= 0; > > to > > _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3); > _5 = (signed int) _1; > if (_5 >= 0) OK. > gcc/ > > PR middle-end/102566 > * tree-ssa-ccp.cc (optimize_atomic_bit_test_and): Also handle > if (_5 < 0) and if (_5 >= 0). > > gcc/testsuite/ > > PR middle-end/102566 > * g++.target/i386/pr102566-7.C > --- > gcc/testsuite/g++.target/i386/pr102566-7.C | 22 ++++++ > gcc/tree-ssa-ccp.cc | 84 ++++++++++++++++++---- > 2 files changed, 91 insertions(+), 15 deletions(-) > create mode 100644 gcc/testsuite/g++.target/i386/pr102566-7.C > > diff --git a/gcc/testsuite/g++.target/i386/pr102566-7.C b/gcc/testsuite/g++.target/i386/pr102566-7.C > new file mode 100644 > index 00000000000..ce90214f33d > --- /dev/null > +++ b/gcc/testsuite/g++.target/i386/pr102566-7.C > @@ -0,0 +1,22 @@ > +/* { dg-do compile { target c++11 } } */ > +/* { dg-options "-O2" } */ > + > +#include > + > +template > +void lock_bts(std::atomic &a) { while (!(a.fetch_or(b) & b)); } > +template > +void lock_btr(std::atomic &a) { while (a.fetch_and(~b) & b); } > +template > +void lock_btc(std::atomic &a) { while (a.fetch_xor(b) & b); } > +template void lock_bts<1U<<30>(std::atomic &a); > +template void lock_btr<1U<<30>(std::atomic &a); > +template void lock_btc<1U<<30>(std::atomic &a); > +template void lock_bts<1U<<31>(std::atomic &a); > +template void lock_btr<1U<<31>(std::atomic &a); > +template void lock_btc<1U<<31>(std::atomic &a); > + > +/* { dg-final { scan-assembler-times "lock;?\[ \t\]*btsl" 2 } } */ > +/* { dg-final { scan-assembler-times "lock;?\[ \t\]*btrl" 2 } } */ > +/* { dg-final { scan-assembler-times "lock;?\[ \t\]*btcl" 2 } } */ > +/* { dg-final { scan-assembler-not "cmpxchg" } } */ > diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc > index 9778e776cf2..3a4b6bc1118 100644 > --- a/gcc/tree-ssa-ccp.cc > +++ b/gcc/tree-ssa-ccp.cc > @@ -3471,17 +3471,35 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > { > gimple *use_nop_stmt; > if (!single_imm_use (use_lhs, &use_p, &use_nop_stmt) > - || !is_gimple_assign (use_nop_stmt)) > + || (!is_gimple_assign (use_nop_stmt) > + && gimple_code (use_nop_stmt) != GIMPLE_COND)) > return false; > - tree use_nop_lhs = gimple_assign_lhs (use_nop_stmt); > - rhs_code = gimple_assign_rhs_code (use_nop_stmt); > - if (rhs_code != BIT_AND_EXPR) > + /* Handle both > + _4 = _5 < 0; > + and > + if (_5 < 0) > + */ > + tree use_nop_lhs = nullptr; > + rhs_code = ERROR_MARK; > + if (is_gimple_assign (use_nop_stmt)) > { > - if (TREE_CODE (use_nop_lhs) == SSA_NAME > + use_nop_lhs = gimple_assign_lhs (use_nop_stmt); > + rhs_code = gimple_assign_rhs_code (use_nop_stmt); > + } > + if (!use_nop_lhs || rhs_code != BIT_AND_EXPR) > + { > + /* Also handle > + if (_5 < 0) > + */ > + if (use_nop_lhs > + && TREE_CODE (use_nop_lhs) == SSA_NAME > && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (use_nop_lhs)) > return false; > - if (rhs_code == BIT_NOT_EXPR) > + if (use_nop_lhs && rhs_code == BIT_NOT_EXPR) > { > + /* Handle > + _7 = ~_2; > + */ > g = convert_atomic_bit_not (fn, use_nop_stmt, lhs, > mask); > if (!g) > @@ -3512,14 +3530,31 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > } > else > { > - if (TREE_CODE (TREE_TYPE (use_nop_lhs)) != BOOLEAN_TYPE) > - return false; > + tree cmp_rhs1, cmp_rhs2; > + if (use_nop_lhs) > + { > + /* Handle > + _4 = _5 < 0; > + */ > + if (TREE_CODE (TREE_TYPE (use_nop_lhs)) > + != BOOLEAN_TYPE) > + return false; > + cmp_rhs1 = gimple_assign_rhs1 (use_nop_stmt); > + cmp_rhs2 = gimple_assign_rhs2 (use_nop_stmt); > + } > + else > + { > + /* Handle > + if (_5 < 0) > + */ > + rhs_code = gimple_cond_code (use_nop_stmt); > + cmp_rhs1 = gimple_cond_lhs (use_nop_stmt); > + cmp_rhs2 = gimple_cond_rhs (use_nop_stmt); > + } > if (rhs_code != GE_EXPR && rhs_code != LT_EXPR) > return false; > - tree cmp_rhs1 = gimple_assign_rhs1 (use_nop_stmt); > if (use_lhs != cmp_rhs1) > return false; > - tree cmp_rhs2 = gimple_assign_rhs2 (use_nop_stmt); > if (!integer_zerop (cmp_rhs2)) > return false; > > @@ -3547,6 +3582,14 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > _1 = __atomic_fetch_and_4 (ptr_6, 0x7fffffff, _3); > _6 = _1 & 0x80000000; > _4 = _6 != 0 or _6 == 0; > + and convert > + _1 = __atomic_fetch_and_4 (ptr_6, 0x7fffffff, _3); > + _5 = (signed int) _1; > + if (_5 < 0 or _5 >= 0) > + to > + _1 = __atomic_fetch_and_4 (ptr_6, 0x7fffffff, _3); > + _6 = _1 & 0x80000000; > + if (_6 != 0 or _6 == 0) > */ > and_mask = build_int_cst (TREE_TYPE (use_rhs), > highest); > @@ -3567,6 +3610,14 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3); > _6 = _1 & 0x80000000; > _4 = _6 != 0 or _6 == 0; > + and convert > + _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3); > + _5 = (signed int) _1; > + if (_5 < 0 or _5 >= 0) > + to > + _1 = __atomic_fetch_or_4 (ptr_6, 0x80000000, _3); > + _6 = _1 & 0x80000000; > + if (_6 != 0 or _6 == 0) > */ > } > var = make_ssa_name (TREE_TYPE (use_rhs)); > @@ -3577,11 +3628,14 @@ optimize_atomic_bit_test_and (gimple_stmt_iterator *gsip, > gsi = gsi_for_stmt (use_nop_stmt); > gsi_insert_before (&gsi, g, GSI_NEW_STMT); > use_stmt = g; > - g = gimple_build_assign (use_nop_lhs, > - (rhs_code == GE_EXPR > - ? EQ_EXPR : NE_EXPR), > - var, > - build_zero_cst (TREE_TYPE (use_rhs))); > + rhs_code = rhs_code == GE_EXPR ? EQ_EXPR : NE_EXPR; > + tree const_zero = build_zero_cst (TREE_TYPE (use_rhs)); > + if (use_nop_lhs) > + g = gimple_build_assign (use_nop_lhs, rhs_code, > + var, const_zero); > + else > + g = gimple_build_cond (rhs_code, var, const_zero, > + nullptr, nullptr); > gsi_insert_after (&gsi, g, GSI_NEW_STMT); > gsi = gsi_for_stmt (use_nop_stmt); > gsi_remove (&gsi, true); > -- > 2.37.3 >