From patchwork Thu Dec 2 19:15:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Pop X-Patchwork-Id: 74014 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 F1908B7080 for ; Fri, 3 Dec 2010 06:15:41 +1100 (EST) Received: (qmail 16271 invoked by alias); 2 Dec 2010 19:15:37 -0000 Received: (qmail 16262 invoked by uid 22791); 2 Dec 2010 19:15:34 -0000 X-SWARE-Spam-Status: No, hits=-2.2 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-yx0-f175.google.com (HELO mail-yx0-f175.google.com) (209.85.213.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 02 Dec 2010 19:15:25 +0000 Received: by mail-yx0-f175.google.com with SMTP id 5so4775519yxd.20 for ; Thu, 02 Dec 2010 11:15:25 -0800 (PST) Received: by 10.101.165.22 with SMTP id s22mr760314ano.24.1291317325299; Thu, 02 Dec 2010 11:15:25 -0800 (PST) Received: from napoca ([163.181.251.115]) by mx.google.com with ESMTPS id x36sm837808anx.34.2010.12.02.11.15.23 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 02 Dec 2010 11:15:24 -0800 (PST) Received: by napoca (sSMTP sendmail emulation); Thu, 02 Dec 2010 13:15:22 -0600 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: rguenther@suse.de, Sebastian Pop Subject: [PATCH] Fix PR45948: Handle COND_EXPR in expression_expensive_p. Date: Thu, 2 Dec 2010 13:15:15 -0600 Message-Id: <1291317315-6140-1-git-send-email-sebpop@gmail.com> 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 Hi, this patch makes SCEV const propagation handle COND_EXPRs: previously they were considered expensive to generate, and now we look at its operands to decide if it is expensive. I am testing this on amd64-linux. Ok for trunk after test? Thanks, Sebastian 2010-12-02 Sebastian Pop PR middle-end/45948 * tree-scalar-evolution.c (expression_expensive_p): Handle COND_EXPR. * gcc.dg/tree-ssa/ldist-pr45948.c: New. --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c | 23 +++++++++++++++++++++++ gcc/tree-scalar-evolution.c | 6 ++++++ 4 files changed, 39 insertions(+), 0 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da56fb6..7502bc5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2010-12-02 Sebastian Pop + PR middle-end/45948 + * tree-scalar-evolution.c (expression_expensive_p): Handle COND_EXPR. + +2010-12-02 Sebastian Pop + PR middle-end/45297 * tree-scalar-evolution.c (interpret_rhs_expr): Handle ADDR_EXPR with MEM_REFs as POINTER_PLUS_EXPR. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3eeee83..43b1ae5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2010-12-02 Sebastian Pop + PR middle-end/45948 + * gcc.dg/tree-ssa/ldist-pr45948.c: New. + +2010-12-02 Sebastian Pop + PR tree-optimization/45199 * gcc.dg/tree-ssa/ldist-15.c: New. * gcc.dg/tree-ssa/ldist-16.c: New. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c new file mode 100644 index 0000000..f0d07cc --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ldist-pr45948.c @@ -0,0 +1,23 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */ + +extern void bar(int); + +void +foo (int i, int n) +{ + int a[30]; + int b[30]; + for (; i < n; i++) + a[i] = b[i] = 0; + + while (1) + if (b[0]) + bar (a[i - 1]); +} + +/* We should apply loop distribution and generate 2 memset (0). */ + +/* { dg-final { scan-tree-dump "distributed: split to 2" "ldist" } } */ +/* { dg-final { scan-tree-dump-times "__builtin_memset" 4 "ldist" } } */ +/* { dg-final { cleanup-tree-dump "ldist" } } */ diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c index 4a4bda9..ab21092 100644 --- a/gcc/tree-scalar-evolution.c +++ b/gcc/tree-scalar-evolution.c @@ -3253,6 +3253,12 @@ expression_expensive_p (tree expr) return false; code = TREE_CODE (expr); + + if (code == COND_EXPR) + return expression_expensive_p (TREE_OPERAND (expr, 0)) + || expression_expensive_p (TREE_OPERAND (expr, 1)) + || expression_expensive_p (TREE_OPERAND (expr, 2)); + if (code == TRUNC_DIV_EXPR || code == CEIL_DIV_EXPR || code == FLOOR_DIV_EXPR