From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2136) id 0D5C83857C44; Mon, 26 Sep 2022 17:25:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0D5C83857C44 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1664213124; bh=4v4dHshRxvbUEW8UbGrdeTy9mj7K+SzdM24nOIA6dNc=; h=From:To:Subject:Date:From; b=l1QzBoE55IzVs9YwiXcwdNeabw+6tXFIBsuE70m3A5KvvhV4HQR9t95JEAGjdXXtc 0pWeC6nChfk6KGrOFnSnsU2LLetRcB2UKuLSyED3qJ5L4H7R54kpBXVPCXTaKZ3xV+ yhA3t+6D+KcKDrZ6hwJsECBfh/AlSYtZIy+dkTP0= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Aldy Hernandez To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-2880] Optimize [0 = x & MASK] in range-ops. X-Act-Checkin: gcc X-Git-Author: Aldy Hernandez X-Git-Refname: refs/heads/master X-Git-Oldrev: be4b32b9ef69b86b662cb7511b48cd1048a55403 X-Git-Newrev: 5e77d4082fa845f1182641a93cfbae71984244d2 Message-Id: <20220926172524.0D5C83857C44@sourceware.org> Date: Mon, 26 Sep 2022 17:25:24 +0000 (GMT) List-Id: https://gcc.gnu.org/g:5e77d4082fa845f1182641a93cfbae71984244d2 commit r13-2880-g5e77d4082fa845f1182641a93cfbae71984244d2 Author: Aldy Hernandez Date: Fri Sep 23 19:47:19 2022 +0200 Optimize [0 = x & MASK] in range-ops. For [0 = x & MASK], we can determine that x is ~MASK. This is something we're picking up in DOM thanks to maybe_set_nonzero_bits, but is something we should handle natively. This is a good example of how much easier to maintain the range-ops entries are versus the ad-hoc pattern matching stuff we had to do before. For the curious, compare the changes to range-op here, versus maybe_set_nonzero_bits. I'm leaving the call to maybe_set_nonzero_bits until I can properly audit it to make sure we're catching it all in range-ops. It won't hurt, since both set_range_info() and set_nonzero_bits() are intersect operations, so we'll never lose information if we do both. PR tree-optimization/107009 gcc/ChangeLog: * range-op.cc (operator_bitwise_and::op1_range): Optimize 0 = x & MASK. (range_op_bitwise_and_tests): New test. Diff: --- gcc/range-op.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gcc/range-op.cc b/gcc/range-op.cc index 072ebd32109..fc930f4d613 100644 --- a/gcc/range-op.cc +++ b/gcc/range-op.cc @@ -2951,6 +2951,15 @@ operator_bitwise_and::op1_range (irange &r, tree type, } if (r.undefined_p ()) set_nonzero_range_from_mask (r, type, lhs); + + // For 0 = op1 & MASK, op1 is ~MASK. + if (lhs.zero_p () && op2.singleton_p ()) + { + wide_int nz = wi::bit_not (op2.get_nonzero_bits ()); + int_range<2> tmp (type); + tmp.set_nonzero_bits (nz); + r.intersect (tmp); + } return true; } @@ -4612,6 +4621,15 @@ range_op_bitwise_and_tests () op_bitwise_and.op1_range (res, integer_type_node, i1, i2); ASSERT_TRUE (res == int_range<1> (integer_type_node)); + // For 0 = x & MASK, x is ~MASK. + { + int_range<2> zero (integer_zero_node, integer_zero_node); + int_range<2> mask = int_range<2> (INT (7), INT (7)); + op_bitwise_and.op1_range (res, integer_type_node, zero, mask); + wide_int inv = wi::shwi (~7U, TYPE_PRECISION (integer_type_node)); + ASSERT_TRUE (res.get_nonzero_bits () == inv); + } + // (NONZERO | X) is nonzero. i1.set_nonzero (integer_type_node); i2.set_varying (integer_type_node);