From patchwork Fri Nov 2 20:18:44 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeff Law X-Patchwork-Id: 196755 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 CD4682C00B2 for ; Sat, 3 Nov 2012 07:19:01 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1352492343; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=xnl3MhD dNBCIZLlTxO5NSLbhCnU=; b=t1Fl0rtJoB/zRXOk4vyzr7vYEiQ8XyPXPxxOabK w7uwSwiKMVIXjtKQsXq44IGepA/TYuV5NeNtjH8DLbt+9tEt0CvvGxehh2iyKbGs oFFsl2b4nHGNmFVwYggffjkeJzsTL2IeG+KineBRDogN66hchTn7MfnmIB8Ud5T7 qbxU= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:Subject:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=kgjTDP0/fcNhYciFIrZjf+lqvVwrAqzuCKu4jzMsR4b1iXOxSsmfIJE4nC9qTZ pGTGwaeJsAXZIyv5OumXkvRFQ30MQTwHXYFYT3O5DwYSndMt2/TMS8jeOnGiSYwR xX1nE+8RXuShuUWMT8IX1YNcBjK6SLRBQlAnNXJsKn4Pg=; Received: (qmail 14679 invoked by alias); 2 Nov 2012 20:18:55 -0000 Received: (qmail 14664 invoked by uid 22791); 2 Nov 2012 20:18:53 -0000 X-SWARE-Spam-Status: No, hits=-6.9 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS, TW_TM 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; Fri, 02 Nov 2012 20:18:46 +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 qA2KIjqJ018706 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 2 Nov 2012 16:18:45 -0400 Received: from stumpy.slc.redhat.com (ovpn-113-78.phx2.redhat.com [10.3.113.78]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id qA2KIi6K031167 for ; Fri, 2 Nov 2012 16:18:45 -0400 Message-ID: <50942AA4.40109@redhat.com> Date: Fri, 02 Nov 2012 14:18:44 -0600 From: Jeff Law User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:16.0) Gecko/20121016 Thunderbird/16.0.1 MIME-Version: 1.0 To: gcc-patches Subject: [4.7 branch] Backport fix for 54985 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 Just backporting the fix for 54985 from the trunk to gcc-4_7-branch. Bootstrapped and regression tested on x86_64-unknown-linux-gnu. 2012-11-02 Jeff Law PR tree-optimization/54985 * tree-ssa-threadedge.c (cond_arg_set_in_bb): New function extracted from thread_across_edge. (thread_across_edge): Use it in all cases where we might thread across a back edge. * gcc.c-torture/execute/pr54985.c: New test. Index: gcc/testsuite/gcc.c-torture/execute/pr54985.c =================================================================== --- gcc/testsuite/gcc.c-torture/execute/pr54985.c (revision 0) +++ gcc/testsuite/gcc.c-torture/execute/pr54985.c (working copy) @@ -0,0 +1,36 @@ + +typedef struct st { + int a; +} ST; + +int __attribute__((noinline,noclone)) +foo(ST *s, int c) +{ + int first = 1; + int count = c; + ST *item = s; + int a = s->a; + int x; + + while (count--) + { + x = item->a; + if (first) + first = 0; + else if (x >= a) + return 1; + a = x; + item++; + } + return 0; +} + +extern void abort (void); + +int main () +{ + ST _1[2] = {{2}, {1}}; + if (foo(_1, 2) != 0) + abort (); + return 0; +} Index: gcc/tree-ssa-threadedge.c =================================================================== --- gcc/tree-ssa-threadedge.c (revision 193086) +++ gcc/tree-ssa-threadedge.c (working copy) @@ -574,6 +574,44 @@ return cached_lhs; } +/* Return TRUE if the statement at the end of e->dest depends on + the output of any statement in BB. Otherwise return FALSE. + + This is used when we are threading a backedge and need to ensure + that temporary equivalences from BB do not affect the condition + in e->dest. */ + +static bool +cond_arg_set_in_bb (edge e, basic_block bb) +{ + ssa_op_iter iter; + use_operand_p use_p; + gimple last = last_stmt (e->dest); + + /* E->dest does not have to end with a control transferring + instruction. This can occurr when we try to extend a jump + threading opportunity deeper into the CFG. In that case + it is safe for this check to return false. */ + if (!last) + return false; + + if (gimple_code (last) != GIMPLE_COND + && gimple_code (last) != GIMPLE_GOTO + && gimple_code (last) != GIMPLE_SWITCH) + return false; + + FOR_EACH_SSA_USE_OPERAND (use_p, last, iter, SSA_OP_USE | SSA_OP_VUSE) + { + tree use = USE_FROM_PTR (use_p); + + if (TREE_CODE (use) == SSA_NAME + && gimple_code (SSA_NAME_DEF_STMT (use)) != GIMPLE_PHI + && gimple_bb (SSA_NAME_DEF_STMT (use)) == bb) + return true; + } + return false; +} + /* TAKEN_EDGE represents the an edge taken as a result of jump threading. See if we can thread around TAKEN_EDGE->dest as well. If so, return the edge out of TAKEN_EDGE->dest that we can statically compute will be @@ -707,19 +745,8 @@ safe to thread this edge. */ if (e->flags & EDGE_DFS_BACK) { - ssa_op_iter iter; - use_operand_p use_p; - gimple last = gsi_stmt (gsi_last_bb (e->dest)); - - FOR_EACH_SSA_USE_OPERAND (use_p, last, iter, SSA_OP_USE | SSA_OP_VUSE) - { - tree use = USE_FROM_PTR (use_p); - - if (TREE_CODE (use) == SSA_NAME - && gimple_code (SSA_NAME_DEF_STMT (use)) != GIMPLE_PHI - && gimple_bb (SSA_NAME_DEF_STMT (use)) == e->dest) - goto fail; - } + if (cond_arg_set_in_bb (e, e->dest)) + goto fail; } stmt_count = 0; @@ -760,7 +787,9 @@ address. If DEST is not null, then see if we can thread through it as well, this helps capture secondary effects of threading without having to re-run DOM or VRP. */ - if (dest) + if (dest + && ((e->flags & EDGE_DFS_BACK) == 0 + || ! cond_arg_set_in_bb (taken_edge, e->dest))) { /* We don't want to thread back to a block we have already visited. This may be overly conservative. */ @@ -818,11 +847,16 @@ e3 = taken_edge; do { - e2 = thread_around_empty_block (e3, - dummy_cond, - handle_dominating_asserts, - simplify, - visited); + if ((e->flags & EDGE_DFS_BACK) == 0 + || ! cond_arg_set_in_bb (e3, e->dest)) + e2 = thread_around_empty_block (e3, + dummy_cond, + handle_dominating_asserts, + simplify, + visited); + else + e2 = NULL; + if (e2) { e3 = e2;