From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1373 invoked by alias); 29 Nov 2012 15:39:07 -0000 Received: (qmail 1242 invoked by uid 22791); 29 Nov 2012 15:39:06 -0000 X-SWARE-Spam-Status: No, hits=-6.6 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,RCVD_IN_HOSTKARMA_W,RP_MATCHES_RCVD,SPF_HELO_PASS 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; Thu, 29 Nov 2012 15:38:58 +0000 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id qATFcuNV009473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 29 Nov 2012 10:38:56 -0500 Received: from redhat.com (ovpn-116-24.ams2.redhat.com [10.36.116.24]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qATFcqkm021232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 29 Nov 2012 10:38:55 -0500 Date: Thu, 29 Nov 2012 15:39:00 -0000 From: Marek Polacek To: Richard Biener Cc: Eric Botcazou , gcc-patches@gcc.gnu.org Subject: Re: [PATCH] Don't bypass blocks with multiple latch edges (PR middle-end/54838) Message-ID: <20121129153852.GC10621@redhat.com> References: <20121126142843.GH17362@redhat.com> <1544820.Re9E01eJrW@polaris> <20121128182457.GB26585@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) 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 X-SW-Source: 2012-11/txt/msg02450.txt.bz2 On Thu, Nov 29, 2012 at 09:34:31AM +0100, Richard Biener wrote: > Definitely not - that means to not preserve loops until after cprop. The goal > is to preserve loops everywhere! Yikes, sorry, it wasn't clear to me what PROP_loops really does. Anyway, I think I have a better fix now. The problem is just that when removing BB 4 (which was a header), we have to zap ->header and ->latch. We already have code for this: if (current_loops != NULL && e->src->loop_father->latch == e->src) { /* ??? Now we are creating (or may create) a loop with multiple entries. Simply mark it for removal. Alternatively we could not do this threading. */ e->src->loop_father->header = NULL; e->src->loop_father->latch = NULL; } but the thing is that when there are multiple latch edges, then ->latch is NULL. So we need to keep track of how many latch edges the header has. Regtested/bootstrapped on x86_64, ok for trunk? Can I get rid of may_be_loop_header (and just use n_latch_edges > 0 instead at that one place) in a followup? 2012-11-29 Marek Polacek PR middle-end/54838 * cprop.c (bypass_block): Set header and latch to NULL when BB has more than one latch edge. (n_latches): New variable. * gcc.dg/pr54838.c: New test. --- gcc/cprop.c.mp 2012-11-29 15:49:53.120524295 +0100 +++ gcc/cprop.c 2012-11-29 15:50:01.421547832 +0100 @@ -1499,6 +1499,7 @@ bypass_block (basic_block bb, rtx setcc, int may_be_loop_header; unsigned removed_p; unsigned i; + unsigned n_latch_edges; edge_iterator ei; insn = (setcc != NULL) ? setcc : jump; @@ -1510,13 +1511,12 @@ bypass_block (basic_block bb, rtx setcc, if (note) find_used_regs (&XEXP (note, 0), NULL); - may_be_loop_header = false; + n_latch_edges = 0; FOR_EACH_EDGE (e, ei, bb->preds) if (e->flags & EDGE_DFS_BACK) - { - may_be_loop_header = true; - break; - } + n_latch_edges++; + + may_be_loop_header = n_latch_edges > 0; change = 0; for (ei = ei_start (bb->preds); (e = ei_safe_edge (ei)); ) @@ -1605,7 +1605,8 @@ bypass_block (basic_block bb, rtx setcc, && dest != EXIT_BLOCK_PTR) { if (current_loops != NULL - && e->src->loop_father->latch == e->src) + && (e->src->loop_father->latch == e->src + || n_latch_edges > 1)) { /* ??? Now we are creating (or may create) a loop with multiple entries. Simply mark it for --- gcc/testsuite/gcc.dg/pr54838.c.mp 2012-11-26 14:48:43.783980854 +0100 +++ gcc/testsuite/gcc.dg/pr54838.c 2012-11-26 14:49:51.051158719 +0100 @@ -0,0 +1,24 @@ +/* PR middle-end/54838 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-forward-propagate -ftracer" } */ + +void bar (void); + +void +foo (void *b, int *c) +{ +again: + switch (*c) + { + case 1: + if (!b) + { + bar (); + return; + } + goto again; + case 3: + if (!b) + goto again; + } +} Marek