From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x530.google.com (mail-pg1-x530.google.com [IPv6:2607:f8b0:4864:20::530]) by sourceware.org (Postfix) with ESMTPS id 9D9353857023 for ; Wed, 2 Nov 2022 19:08:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 9D9353857023 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-pg1-x530.google.com with SMTP id b5so17060768pgb.6 for ; Wed, 02 Nov 2022 12:08:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=rOzIsxYf6X3UHQQssJp1M+pstxOc7nHgh4SmK+yeV7A=; b=mSNxc6mL7xaKv7BXWCYoY3No6t9f1F5PVY4INre2Pv/9ecANtMUAPUg6PQuK5q2w9Q 1vtv877YEBSA18tdBOIUqVxv6/nnk5xzyrEufD/sLKhe0FFW8BtfUDKG1ZARPOUf0zdk YqfET3JX76Xp/oseMUSoKyvgIsScduuqrypN+gR0SofCxKD2acx5Ccd5GyIKJ3WMw9FL i2URPk4OBjHW6YlnIefIVbcu7xFE3IN7INRJL4CP28glzS8NSiY9AamLmd7P4rKHsmRw Tgdb5JMgT37wp2k3TaSgf1+B4fYFfxiO124LxIDyd6TUNU83A9uK/0a2H0O8Pmr/pqRE YVKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=rOzIsxYf6X3UHQQssJp1M+pstxOc7nHgh4SmK+yeV7A=; b=2mB00u55MUmqEXhaKokD2OIpV3SXW0HtCsX9YU70Nd0y3E3o8sONJ8Vg2lu2R2z+Wc AUqgQ2F7fhAT91WE38IRtfeYu5agU9lmvWgprTVm0dlD6fmxMULEuSKnkv5bOAm/9nL4 c/5MkbWByntxmkf6pWmDBELCbPFGONTgL5XZyMrysJV1TRHCRf6KL00WxKt0r/Gvvemg jcLYPsE5Z7zjZNx+SdbD8E2zPzI0YmSneyAgHMzhvkhzlTQFXNLWWnnlS7X7CE0qM27B 8rcTvhQMnSDw+Q4qGZvanlt5kDPbVNZPu1VdRllnvXoDb4XMx5MMLIa0Xh54WuxwfKeE G0ZQ== X-Gm-Message-State: ACrzQf3rKJ+3cMhYU+tA1lqKq7vIsu+qB03l+VFyK8pEZxjy8utJgwPY N26L3mwt9CmKMMQT+x/20guNl+8c/5Q= X-Google-Smtp-Source: AMsMyM7sUC0dztPFfsQCPO1Uy9htSgTtcCpOxmovC8exr2/lYSuiL7sa1YHNJMoKEQz2vGpuQ/hHfA== X-Received: by 2002:a62:e504:0:b0:56d:2798:f024 with SMTP id n4-20020a62e504000000b0056d2798f024mr22733162pff.12.1667416101902; Wed, 02 Nov 2022 12:08:21 -0700 (PDT) Received: from gnu-tgl-3.localdomain ([172.56.31.252]) by smtp.gmail.com with ESMTPSA id j11-20020a170902690b00b00186ac812ab0sm8683715plk.83.2022.11.02.12.08.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Nov 2022 12:08:21 -0700 (PDT) Received: from gnu-tgl-3.. (localhost [IPv6:::1]) by gnu-tgl-3.localdomain (Postfix) with ESMTP id 6F7E9C0284; Wed, 2 Nov 2022 12:08:19 -0700 (PDT) From: "H.J. Lu" To: gcc-patches@gcc.gnu.org Cc: liuhongt Subject: [PATCH] Extend optimization for integer bit test on __atomic_fetch_[or|and]_* Date: Wed, 2 Nov 2022 12:08:19 -0700 Message-Id: <20221102190819.862078-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.37.3 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-3026.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: 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) 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