From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 38773 invoked by alias); 11 Nov 2015 14:15:39 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 38749 invoked by uid 89); 11 Nov 2015 14:15:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 X-HELO: gate.crashing.org Received: from gate.crashing.org (HELO gate.crashing.org) (63.228.1.57) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Wed, 11 Nov 2015 14:15:30 +0000 Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.13.8) with ESMTP id tABEFIuw005524; Wed, 11 Nov 2015 08:15:18 -0600 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id tABEFHEp005523; Wed, 11 Nov 2015 08:15:17 -0600 Date: Wed, 11 Nov 2015 14:15:00 -0000 From: Segher Boessenkool To: Bernd Schmidt Cc: gcc-patches@gcc.gnu.org, dje.gcc@gmail.com Subject: Re: [PATCH 1/2] simplify-rtx: Simplify trunc of and of shiftrt Message-ID: <20151111141517.GA747@gate.crashing.org> References: <1d3e9ff999e20e4eb13a5825ac084074bd05a397.1447053652.git.segher@kernel.crashing.org> <5641D1F9.3090104@redhat.com> <20151110174411.GB23305@gate.crashing.org> <56425BDE.9040604@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <56425BDE.9040604@redhat.com> User-Agent: Mutt/1.4.2.3i X-IsSubscribed: yes X-SW-Source: 2015-11/txt/msg01376.txt.bz2 On Tue, Nov 10, 2015 at 10:04:30PM +0100, Bernd Schmidt wrote: > On 11/10/2015 06:44 PM, Segher Boessenkool wrote: > > >Yes I know. All the rest of the code around is it like this though. > >Do you want this written in a saner way? > > I won't object to leaving it as-is for now, but in the future it would > be good to keep this in mind. With the trunc_int_for_mode it ended up hugging the righthand margin, so I did clean it up after all. Please see attached (committed). Segher diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 17568ba..c4fc42a 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -714,6 +714,34 @@ simplify_truncation (machine_mode mode, rtx op, return simplify_gen_binary (ASHIFT, mode, XEXP (XEXP (op, 0), 0), XEXP (op, 1)); + /* Likewise (truncate:QI (and:SI (lshiftrt:SI (x:SI) C) C2)) into + (and:QI (lshiftrt:QI (truncate:QI (x:SI)) C) C2) for suitable C + and C2. */ + if (GET_CODE (op) == AND + && (GET_CODE (XEXP (op, 0)) == LSHIFTRT + || GET_CODE (XEXP (op, 0)) == ASHIFTRT) + && CONST_INT_P (XEXP (XEXP (op, 0), 1)) + && CONST_INT_P (XEXP (op, 1))) + { + rtx op0 = (XEXP (XEXP (op, 0), 0)); + rtx shift_op = XEXP (XEXP (op, 0), 1); + rtx mask_op = XEXP (op, 1); + unsigned HOST_WIDE_INT shift = UINTVAL (shift_op); + unsigned HOST_WIDE_INT mask = UINTVAL (mask_op); + + if (shift < precision + /* If doing this transform works for an X with all bits set, + it works for any X. */ + && ((GET_MODE_MASK (mode) >> shift) & mask) + == ((GET_MODE_MASK (op_mode) >> shift) & mask) + && (op0 = simplify_gen_unary (TRUNCATE, mode, op0, op_mode)) + && (op0 = simplify_gen_binary (LSHIFTRT, mode, op0, shift_op))) + { + mask_op = GEN_INT (trunc_int_for_mode (mask, mode)); + return simplify_gen_binary (AND, mode, op0, mask_op); + } + } + /* Recognize a word extraction from a multi-word subreg. */ if ((GET_CODE (op) == LSHIFTRT || GET_CODE (op) == ASHIFTRT) -- 1.9.3