From patchwork Wed Nov 3 08:31:29 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 69946 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 81905B70AF for ; Wed, 3 Nov 2010 19:32:04 +1100 (EST) Received: (qmail 31751 invoked by alias); 3 Nov 2010 08:32:02 -0000 Received: (qmail 31739 invoked by uid 22791); 3 Nov 2010 08:32:01 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI, SPF_HELO_PASS, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 03 Nov 2010 08:31:54 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oA38VUbw003525 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 3 Nov 2010 04:31:31 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (tyan-ft48-01.lab.bos.redhat.com [10.16.42.4]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oA38VUIG030359 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 3 Nov 2010 04:31:30 -0400 Received: from tyan-ft48-01.lab.bos.redhat.com (localhost.localdomain [127.0.0.1]) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4) with ESMTP id oA38VTTR015321; Wed, 3 Nov 2010 09:31:29 +0100 Received: (from jakub@localhost) by tyan-ft48-01.lab.bos.redhat.com (8.14.4/8.14.4/Submit) id oA38VT5X015320; Wed, 3 Nov 2010 09:31:29 +0100 Date: Wed, 3 Nov 2010 09:31:29 +0100 From: Jakub Jelinek To: Eric Botcazou Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Fix combiner (PRs rtl-optimization/46034, rtl-optimization/46212, rtl-optimization/46248) Message-ID: <20101103083129.GP29412@tyan-ft48-01.lab.bos.redhat.com> Reply-To: Jakub Jelinek References: <20101101210903.GD29412@tyan-ft48-01.lab.bos.redhat.com> <201011022127.29192.ebotcazou@adacore.com> <20101102204817.GJ29412@tyan-ft48-01.lab.bos.redhat.com> <201011022201.32657.ebotcazou@adacore.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <201011022201.32657.ebotcazou@adacore.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Tue, Nov 02, 2010 at 10:01:32PM +0100, Eric Botcazou wrote: > > I think you are right, if !i1_feeds_i2_n then the copy is not needed, > > because it will not be used. If !i0dest_in_i0src, I think > > the copy is not strictily needed, because it shouldn't matter whether > > i0dest is replaced with i0src just once or more than once, but if you > > prefer the if (i0_feeds_i1_n && added_sets_2 && i1_feeds_i2_n) > > condition, I can bootstrap/regtest it with that. > > Yes, I think this is easier to understand that way. OK with this change if it > successfully completes the testing cycle. Here is what I have committed after bootstrap/regtest. Thanks. 2010-11-03 Jakub Jelinek PR rtl-optimization/46034 PR rtl-optimization/46212 PR rtl-optimization/46248 * combine.c (try_combine): If added_sets_2 where i0dest_in_i0src and i0 feeds i1 and i1 feeds i2 or i0 feeds i2, make a copy of i1src before i0dest -> i0src substitution and pass 1 instead of 0 as last argument to subst on i2pat. * gcc.c-torture/compile/pr46034.c: New test. * gcc.c-torture/compile/pr46248.c: New test. * gcc.dg/pr46212.c: New test. Jakub --- gcc/combine.c.jj 2010-11-01 09:07:24.000000000 +0100 +++ gcc/combine.c 2010-11-01 12:01:15.000000000 +0100 @@ -2502,6 +2502,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx rtx i3dest_killed = 0; /* SET_DEST and SET_SRC of I2, I1 and I0. */ rtx i2dest = 0, i2src = 0, i1dest = 0, i1src = 0, i0dest = 0, i0src = 0; + rtx i1src_copy = 0; /* Set if I2DEST was reused as a scratch register. */ bool i2scratch = false; /* The PATTERNs of I0, I1, and I2, or a copy of them in certain cases. */ @@ -3128,6 +3129,11 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx return 0; } + /* Following subst may modify i1src, make a copy of it + before it is for added_sets_2 handling if needed. */ + if (i0_feeds_i1_n && added_sets_2 && i1_feeds_i2_n) + i1src_copy = copy_rtx (i1src); + n_occurrences = 0; subst_low_luid = DF_INSN_LUID (i0); newpat = subst (newpat, i0dest, i0src, 0, @@ -3200,11 +3206,10 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx if (added_sets_2) { rtx t = i2pat; - if (i0_feeds_i2_n) - t = subst (t, i0dest, i0src, 0, 0); if (i1_feeds_i2_n) - t = subst (t, i1dest, i1src, 0, 0); - if (i0_feeds_i1_n && i1_feeds_i2_n) + t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, + i0_feeds_i1_n && i0dest_in_i0src); + if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n) t = subst (t, i0dest, i0src, 0, 0); XVECEXP (newpat, 0, --total_sets) = t; --- gcc/testsuite/gcc.c-torture/compile/pr46034.c.jj 2010-11-01 12:14:56.000000000 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr46034.c 2010-11-01 12:06:58.000000000 +0100 @@ -0,0 +1,14 @@ +/* PR rtl-optimization/46034 */ + +void bar (int); + +void +foo (int x, int y) +{ + int i; + for (i = 0; i < x; i++) + { + y = __builtin_abs (y); + bar (y / 2); + } +} --- gcc/testsuite/gcc.c-torture/compile/pr46248.c.jj 2010-11-01 12:14:59.000000000 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr46248.c 2010-11-01 12:14:11.000000000 +0100 @@ -0,0 +1,32 @@ +/* PR rtl-optimization/46248 */ + +struct S +{ + int s; +}; + +void +foo (unsigned char *x, int y, struct S *z) +{ + const int l1 = y; + const int l2 = y + l1; + const int l3 = y + l2; + const int l4 = y + l3; + const int l5 = y + l4; + const int l6 = y + l5; + const int l7 = y + l6; + int i; + for (i = 0; i < 8; i++) + { + int a = x[l3] - x[l4]; + int b = x[l4] - x[l5]; + int c = x[l5] - x[l6]; + int d = (b >= 0 ? b : -b) - (((a >= 0 ? a : -a) + (c >= 0 ? c : -c)) >> 1); + if (d < z->s * 2) + { + int v = d * (-b > 0 ? 1 : -1); + x[l2] += v >> 3; + x[l7] -= v >> 3; + } + } +} --- gcc/testsuite/gcc.dg/pr46212.c.jj 2010-11-01 12:15:14.000000000 +0100 +++ gcc/testsuite/gcc.dg/pr46212.c 2010-11-01 12:17:55.000000000 +0100 @@ -0,0 +1,23 @@ +/* PR rtl-optimization/46212 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -funroll-loops" } */ +/* { dg-options "-O3 -funroll-loops -march=i386" { target { { i686-*-* x86_64-*-* } && ilp32 } } } */ + +static inline unsigned +foo (void *x) +{ + unsigned y = *(volatile unsigned *) (x); + return (y >> 24) | ((y >> 8) & 0xff00) | ((y & 0xff00) << 8) | (y << 24); +} + +void +bar (void *x, void *y, int z) +{ + unsigned c; + while (z--) + { + c = foo (y); + *(unsigned *) x = (c & 0xf80000) >> 9 | (c & 0xf800) >> 6 + | (c & 0xf8) >> 3 | (c & 0x80000000) >> 16; + } +}