From patchwork Mon Jul 25 21:46:58 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Pop X-Patchwork-Id: 106758 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 D4948B712A for ; Tue, 26 Jul 2011 07:47:23 +1000 (EST) Received: (qmail 17176 invoked by alias); 25 Jul 2011 21:47:21 -0000 Received: (qmail 17168 invoked by uid 22791); 25 Jul 2011 21:47:21 -0000 X-SWARE-Spam-Status: No, hits=-2.3 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-yi0-f47.google.com (HELO mail-yi0-f47.google.com) (209.85.218.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 25 Jul 2011 21:47:05 +0000 Received: by yib18 with SMTP id 18so2934482yib.20 for ; Mon, 25 Jul 2011 14:47:05 -0700 (PDT) Received: by 10.236.155.161 with SMTP id j21mr6999480yhk.347.1311630425086; Mon, 25 Jul 2011 14:47:05 -0700 (PDT) Received: from napoca ([163.181.251.115]) by mx.google.com with ESMTPS id z28sm290461yhn.63.2011.07.25.14.47.02 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 25 Jul 2011 14:47:03 -0700 (PDT) Received: by napoca (sSMTP sendmail emulation); Mon, 25 Jul 2011 16:47:01 -0500 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: rguenther@suse.de, Sebastian Pop Subject: [PATCH] Fix PR47046: correct evolution_function_is_affine_p Date: Mon, 25 Jul 2011 16:46:58 -0500 Message-Id: <1311630418-18576-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 "Bug 47046 - gcc.target/i386/sse4_1-movntdqa.c ICEs with -fgraphite-identity" The problem here is that we are left with the following code to be translated in the new representation following the transform that Graphite has chosen: D.2709_14 = j_33 * i_32; D.2710_15 = D.2709_14 * i_32; D.2711_16 = D.2710_15 * sign_34; *D.2708_13 = D.2711_16; In this particular case we have a nonlinear expression "i * i" for which we have to generate code following the new graphite_iv variables. The patch fixes the function that detects whether we are passing non linear stuff to graphite: evolution_function_is_affine_p. It seems like for the moment evolution_function_is_affine_p is testing whether an evolution function is affine only in the innermost loop, without looking recursively at what happens in outer loops. The chrec for this case is: {0, +, {0, +, {1, +, 2}_1}_1}_2 and we are testing whether the evolution is affine only for the loop_2, which is true as we have {0, +, blah}_2 with blah invariant in loop_2. The patch adds the recursive call to evolution_function_is_affine_p. Bootstrapped and tested on amd64-linux. 2011-07-23 Sebastian Pop PR middle-end/47046 * tree-chrec.h (evolution_function_is_affine_p): Recursively call evolution_function_is_affine_p on CHREC_RIGHT. * gcc.dg/graphite/id-pr47046.c: New. --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/graphite/id-pr47046.c | 13 +++++++++++++ gcc/tree-chrec.h | 4 +++- 4 files changed, 27 insertions(+), 1 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/id-pr47046.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index feffc6b..2237954 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2011-07-23 Sebastian Pop + PR middle-end/47046 + * tree-chrec.h (evolution_function_is_affine_p): Recursively call + evolution_function_is_affine_p on CHREC_RIGHT. + +2011-07-23 Sebastian Pop + PR middle-end/47594 * graphite-sese-to-poly.c (scan_tree_for_params_right_scev): Sign extend constants. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index af1211a..919484b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-07-23 Sebastian Pop + PR middle-end/47046 + * gcc.dg/graphite/id-pr47046.c: New. + +2011-07-23 Sebastian Pop + PR middle-end/47594 * gfortran.dg/graphite/run-id-pr47594.f90: New. diff --git a/gcc/testsuite/gcc.dg/graphite/id-pr47046.c b/gcc/testsuite/gcc.dg/graphite/id-pr47046.c new file mode 100644 index 0000000..aba38ed --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/id-pr47046.c @@ -0,0 +1,13 @@ +void +init_movntdqa (int *src) +{ + int i, j, sign = 1; + + for (i = 0; i < 20; i++) + for (j = 0; j < 4; j++) + { + src[i * 4 + j] = j * i * i * sign; + sign = -sign; + } +} + diff --git a/gcc/tree-chrec.h b/gcc/tree-chrec.h index b9bf71e..9b971bd 100644 --- a/gcc/tree-chrec.h +++ b/gcc/tree-chrec.h @@ -205,7 +205,9 @@ evolution_function_is_affine_p (const_tree chrec) return chrec && TREE_CODE (chrec) == POLYNOMIAL_CHREC && evolution_function_is_invariant_p (CHREC_RIGHT (chrec), - CHREC_VARIABLE (chrec)); + CHREC_VARIABLE (chrec)) + && (TREE_CODE (CHREC_RIGHT (chrec)) != POLYNOMIAL_CHREC + || evolution_function_is_affine_p (CHREC_RIGHT (chrec))); } /* Determines whether EXPR does not contains chrec expressions. */