From patchwork Fri Jul 22 23:01:19 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Pop X-Patchwork-Id: 106399 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 03D7BB6F70 for ; Sat, 23 Jul 2011 09:01:44 +1000 (EST) Received: (qmail 25424 invoked by alias); 22 Jul 2011 23:01:41 -0000 Received: (qmail 25415 invoked by uid 22791); 22 Jul 2011 23:01:40 -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, TW_TM, T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: sourceware.org Received: from mail-gx0-f175.google.com (HELO mail-gx0-f175.google.com) (209.85.161.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 22 Jul 2011 23:01:25 +0000 Received: by gxk3 with SMTP id 3so1790818gxk.20 for ; Fri, 22 Jul 2011 16:01:25 -0700 (PDT) Received: by 10.236.184.37 with SMTP id r25mr3312253yhm.155.1311375684922; Fri, 22 Jul 2011 16:01:24 -0700 (PDT) Received: from napoca ([163.181.251.115]) by mx.google.com with ESMTPS id f4sm109746yhn.27.2011.07.22.16.01.22 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 22 Jul 2011 16:01:23 -0700 (PDT) Received: by napoca (sSMTP sendmail emulation); Fri, 22 Jul 2011 18:01:21 -0500 From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: rguenther@suse.de, tobias@grosser.es, Sebastian Pop Subject: [PATCH] Fix PR48648: Handle CLAST assignments. Date: Fri, 22 Jul 2011 18:01:19 -0500 Message-Id: <1311375679-23072-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 The CLAST produced by CLooG-ISL contains an assignment and GCC chokes on it. The exact CLAST contains an assignment followed by an if: scat_1 = max(0,ceild(T_4-7,8)); if (scat_1 <= min(1,floord(T_4-1,8))) { S7(scat_1); } This is equivalent to a loop that iterates only once, and so CLooG generates an assignment followed by an if instead of a loop. This is an important optimization that was improved in ISL, that allows if-conversion: imagine GCC having to figure out that a loop like the following actually iterates only once, and can be converted to an if: for (scat_1 = max(0,ceild(T_4-7,8)); scat_1 <= min(1,floord(T_4-1,8)); scat_1++) S7(scat_1); This patch implements the translation of CLAST assignments. Bootstrapped and tested on amd64-linux. Sebastian 2011-07-22 Sebastian Pop PR middle-end/48648 * graphite-clast-to-gimple.c (clast_get_body_of_loop): Handle CLAST assignments. (translate_clast): Same. (translate_clast_assignment): New. * gcc.dg/graphite/id-pr48648.c: New. --- gcc/ChangeLog | 8 ++++ gcc/graphite-clast-to-gimple.c | 49 ++++++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/graphite/id-pr48648.c | 21 ++++++++++++ 4 files changed, 83 insertions(+), 0 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/graphite/id-pr48648.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9cfa21b..303c9c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2011-07-22 Sebastian Pop + + PR middle-end/48648 + * graphite-clast-to-gimple.c (clast_get_body_of_loop): Handle + CLAST assignments. + (translate_clast): Same. + (translate_clast_assignment): New. + 2011-07-21 Sebastian Pop PR middle-end/47654 diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c index ddf6d3d..a4668d3 100644 --- a/gcc/graphite-clast-to-gimple.c +++ b/gcc/graphite-clast-to-gimple.c @@ -812,6 +812,9 @@ clast_get_body_of_loop (struct clast_stmt *stmt) if (CLAST_STMT_IS_A (stmt, stmt_block)) return clast_get_body_of_loop (((struct clast_block *) stmt)->body); + if (CLAST_STMT_IS_A (stmt, stmt_ass)) + return clast_get_body_of_loop (stmt->next); + gcc_unreachable (); } @@ -1121,6 +1124,48 @@ translate_clast_for (loop_p context_loop, struct clast_for *stmt, edge next_e, return last_e; } +/* Translates a clast assignment STMT to gimple. + + - NEXT_E is the edge where new generated code should be attached. + - BB_PBB_MAPPING is is a basic_block and it's related poly_bb_p mapping. */ + +static edge +translate_clast_assignment (struct clast_assignment *stmt, edge next_e, + int level, ivs_params_p ip) +{ + gimple_seq stmts; + mpz_t v1, v2; + tree type, new_name, var; + edge res = single_succ_edge (split_edge (next_e)); + struct clast_expr *expr = (struct clast_expr *) stmt->RHS; + struct clast_user_stmt *body + = clast_get_body_of_loop ((struct clast_stmt *) stmt); + poly_bb_p pbb = (poly_bb_p) cloog_statement_usr (body->statement); + + mpz_init (v1); + mpz_init (v2); + type = type_for_clast_expr (expr, ip, v1, v2); + var = create_tmp_var (type, "graphite_var"); + new_name = force_gimple_operand (clast_to_gcc_expression (type, expr, ip), + &stmts, true, var); + add_referenced_var (var); + if (stmts) + { + gsi_insert_seq_on_edge (next_e, stmts); + gsi_commit_edge_inserts (); + } + + compute_bounds_for_level (pbb, level, v1, v2); + save_clast_name_index (ip->newivs_index, stmt->LHS, + VEC_length (tree, *(ip->newivs)), level, v1, v2); + VEC_safe_push (tree, heap, *(ip->newivs), new_name); + + mpz_clear (v1); + mpz_clear (v2); + + return res; +} + /* Translates a clast guard statement STMT to gimple. - NEXT_E is the edge where new generated code should be attached. @@ -1171,6 +1216,10 @@ translate_clast (loop_p context_loop, struct clast_stmt *stmt, edge next_e, else if (CLAST_STMT_IS_A (stmt, stmt_block)) next_e = translate_clast (context_loop, ((struct clast_block *) stmt)->body, next_e, bb_pbb_mapping, level, ip); + + else if (CLAST_STMT_IS_A (stmt, stmt_ass)) + next_e = translate_clast_assignment ((struct clast_assignment *) stmt, + next_e, level, ip); else gcc_unreachable(); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a63b647..bfdbcfb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-07-22 Sebastian Pop + + PR middle-end/48648 + * gcc.dg/graphite/id-pr48648.c: New. + 2011-07-21 Sebastian Pop PR middle-end/47654 diff --git a/gcc/testsuite/gcc.dg/graphite/id-pr48648.c b/gcc/testsuite/gcc.dg/graphite/id-pr48648.c new file mode 100644 index 0000000..ff58ec2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/graphite/id-pr48648.c @@ -0,0 +1,21 @@ +/* { dg-options "-O -fgraphite-identity" } */ + +void *foo(const void *a); + +void bug48648() +{ + unsigned char a[2]; + long b; + int i; + + for(i = 0; i < 2; i++) { + if (b <= 0) + a[i] = 0; + else if (b >= 8) + a[i] = 0; + else + a[i] = 0; + b -= 8; + } + foo(&a); +}