From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 37888 invoked by alias); 15 Jan 2016 17:14:57 -0000 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 Received: (qmail 37646 invoked by uid 89); 15 Jan 2016 17:14:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 spammy=244, Collect, translating, 1357,7 X-HELO: mail-ob0-f195.google.com Received: from mail-ob0-f195.google.com (HELO mail-ob0-f195.google.com) (209.85.214.195) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 15 Jan 2016 17:14:54 +0000 Received: by mail-ob0-f195.google.com with SMTP id x5so4129475obg.1 for ; Fri, 15 Jan 2016 09:14:54 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=1cCsxUjr56VXm6hHJMdhT7+psQbDNsRq2c1IgNeOjDk=; b=OIjtezyOwo8M3odI93gjf3jRDAbGh4TYBnb6t1upB0ypz01zIEaxJx9gmVGN8smIik 0Ewelo7fyk9eO/RunxpBQfLRHiRZ8sJhFeKzNACyPatwkQFSro8VPy358gaScwYnHTZ2 M8PG0B7hGr7++bF5LwWxEzfT55mn9WkbBn/1gg0/GPBh67sfZnqsZWCbDeU6H9L83S6/ ANXzXFFBanoyj2UvR2k0IKTyl9dd75ucmxJCfLwsMGHndeskgl9AYnk7tSiJdTOhwHhY m3Nudy7E0tm0ta6WqhT1lvTGRuvrPTVzoqBDWyGRlENamafAJxH7+ONpK1RVUlVOeXhE ZJNQ== X-Gm-Message-State: ALoCoQkiTxa+jkdwkW21oB4We9aBllF780poEZmCu+sYz0o1XB6vUg0B5vlfSbJ3E3BI0Vj+t0JiGrjqxvteAuLOw4aEJrd0Hw== X-Received: by 10.60.35.130 with SMTP id h2mr9284672oej.6.1452878092809; Fri, 15 Jan 2016 09:14:52 -0800 (PST) Received: from bo.sarc.sas (65-36-6-125.static.grandenetworks.net. [65.36.6.125]) by smtp.gmail.com with ESMTPSA id r63sm6618774oia.13.2016.01.15.09.14.51 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 15 Jan 2016 09:14:52 -0800 (PST) From: Sebastian Pop X-Google-Original-From: Sebastian Pop To: gcc-patches@gcc.gnu.org Cc: hiraditya@msn.com, sebpop@gmail.com, richard.guenther@gmail.com, Sebastian Pop Subject: [PATCH 06/15] fix codegen error exposed by compute isl flow patch Date: Fri, 15 Jan 2016 17:15:00 -0000 Message-Id: <1452878086-19297-6-git-send-email-sebpop@gmail.com> In-Reply-To: <1452878086-19297-1-git-send-email-sebpop@gmail.com> References: <1452878086-19297-1-git-send-email-sebpop@gmail.com> X-SW-Source: 2016-01/txt/msg01108.txt.bz2 From: Sebastian Pop we used to fail using an iv from a different loop. * graphite-isl-ast-to-gimple.c (enum phi_node_kind): New. (class translate_isl_ast_to_gimple): Use phi_node_kind instead of bool. (is_valid_rename): Same. (translate_isl_ast_to_gimple::get_rename): Same. (translate_isl_ast_to_gimple::rename_all_uses): Same. (translate_isl_ast_to_gimple::rename_uses): Same. (get_new_name): Check for close_phi nodes. (copy_loop_phi_args): Use phi_node_kind. (translate_isl_ast_to_gimple::copy_loop_close_phi_args): Same. (translate_isl_ast_to_gimple::copy_cond_phi_args): Same. gcc/testsuite * gfortran.dg/graphite/interchange-3.f90: Adjust pattern. --- gcc/graphite-isl-ast-to-gimple.c | 48 ++++++++++++++-------- .../gfortran.dg/graphite/interchange-3.f90 | 2 +- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c index b0da425..a196419 100644 --- a/gcc/graphite-isl-ast-to-gimple.c +++ b/gcc/graphite-isl-ast-to-gimple.c @@ -135,6 +135,14 @@ set_separate_option (__isl_take isl_schedule_node *node, void *user) return node; } +enum phi_node_kind +{ + unknown_phi, + loop_phi, + close_phi, + cond_phi +}; + class translate_isl_ast_to_gimple { public: @@ -317,14 +325,14 @@ class translate_isl_ast_to_gimple SSA form. */ bool is_valid_rename (tree rename, basic_block def_bb, basic_block use_bb, - bool loop_phi, tree old_name, basic_block old_bb) const; + phi_node_kind, tree old_name, basic_block old_bb) const; /* Returns the expression associated to OLD_NAME (which is used in OLD_BB), in NEW_BB from RENAME_MAP. LOOP_PHI is true when we want to rename OLD_NAME within a loop PHI instruction. */ tree get_rename (basic_block new_bb, tree old_name, - basic_block old_bb, bool loop_phi) const; + basic_block old_bb, phi_node_kind) const; /* For ops which are scev_analyzeable, we can regenerate a new name from its scalar evolution around LOOP. */ @@ -344,7 +352,7 @@ class translate_isl_ast_to_gimple true when we want to rename an OP within a loop PHI instruction. */ tree get_new_name (basic_block new_bb, tree op, - basic_block old_bb, bool loop_phi) const; + basic_block old_bb, phi_node_kind) const; /* Collect all the operands of NEW_EXPR by recursively visiting each operand. */ @@ -1349,7 +1357,7 @@ phi_uses_name (basic_block bb, tree name) bool translate_isl_ast_to_gimple:: is_valid_rename (tree rename, basic_block def_bb, basic_block use_bb, - bool loop_phi, tree old_name, basic_block old_bb) const + phi_node_kind phi_kind, tree old_name, basic_block old_bb) const { /* The def of the rename must either dominate the uses or come from a back-edge. Also the def must respect the loop closed ssa form. */ @@ -1367,7 +1375,7 @@ is_valid_rename (tree rename, basic_block def_bb, basic_block use_bb, if (dominated_by_p (CDI_DOMINATORS, use_bb, def_bb)) return true; - if (bb_contains_loop_phi_nodes (use_bb) && loop_phi) + if (bb_contains_loop_phi_nodes (use_bb) && phi_kind == loop_phi) { /* The loop-header dominates the loop-body. */ if (!dominated_by_p (CDI_DOMINATORS, def_bb, use_bb)) @@ -1386,14 +1394,13 @@ is_valid_rename (tree rename, basic_block def_bb, basic_block use_bb, } /* Returns the expression associated to OLD_NAME (which is used in OLD_BB), in - NEW_BB from RENAME_MAP. LOOP_PHI is true when we want to rename OLD_NAME - within a loop PHI instruction. */ + NEW_BB from RENAME_MAP. PHI_KIND determines the kind of phi node. */ tree translate_isl_ast_to_gimple::get_rename (basic_block new_bb, tree old_name, basic_block old_bb, - bool loop_phi) const + phi_node_kind phi_kind) const { gcc_assert (TREE_CODE (old_name) == SSA_NAME); vec *renames = region->rename_map->get (old_name); @@ -1407,7 +1414,9 @@ translate_isl_ast_to_gimple::get_rename (basic_block new_bb, if (TREE_CODE (rename) == SSA_NAME) { basic_block bb = gimple_bb (SSA_NAME_DEF_STMT (rename)); - if (is_valid_rename (rename, bb, new_bb, loop_phi, old_name, old_bb)) + if (is_valid_rename (rename, bb, new_bb, phi_kind, old_name, old_bb) + && (phi_kind == close_phi + || flow_bb_inside_loop_p (bb->loop_father, new_bb))) return rename; return NULL_TREE; } @@ -1435,6 +1444,9 @@ translate_isl_ast_to_gimple::get_rename (basic_block new_bb, if (!dominated_by_p (CDI_DOMINATORS, new_bb, t2_bb)) continue; + if (!flow_bb_inside_loop_p (t2_bb->loop_father, new_bb)) + continue; + /* Compute the nearest dominator. */ if (!t1 || dominated_by_p (CDI_DOMINATORS, t2_bb, t1_bb)) { @@ -1756,7 +1768,7 @@ translate_isl_ast_to_gimple::rename_all_uses (tree new_expr, basic_block new_bb, tree t; int i; FOR_EACH_VEC_ELT (ssa_names, i, t) - if (tree r = get_rename (new_bb, t, old_bb, false)) + if (tree r = get_rename (new_bb, t, old_bb, unknown_phi)) new_expr = substitute_ssa_name (new_expr, t, r); return new_expr; @@ -1887,7 +1899,7 @@ translate_isl_ast_to_gimple::rename_uses (gimple *copy, changed = true; tree new_expr = get_rename (gsi_tgt->bb, old_name, - old_bb, false); + old_bb, unknown_phi); if (new_expr) { @@ -1986,19 +1998,19 @@ translate_isl_ast_to_gimple::get_def_bb_for_const (basic_block bb, return b1; } -/* Get the new name of OP (from OLD_BB) to be used in NEW_BB. LOOP_PHI is true - when we want to rename an OP within a loop PHI instruction. */ +/* Get the new name of OP (from OLD_BB) to be used in NEW_BB. PHI_KIND + determines the kind of phi node. */ tree translate_isl_ast_to_gimple:: get_new_name (basic_block new_bb, tree op, - basic_block old_bb, bool loop_phi) const + basic_block old_bb, phi_node_kind phi_kind) const { /* For constants the names are the same. */ if (is_constant (op)) return op; - return get_rename (new_bb, op, old_bb, loop_phi); + return get_rename (new_bb, op, old_bb, phi_kind); } /* Return a debug location for OP. */ @@ -2053,7 +2065,7 @@ copy_loop_phi_args (gphi *old_phi, init_back_edge_pair_t &ibp_old_bb, tree old_name = gimple_phi_arg_def (old_phi, i); tree new_name = get_new_name (new_bb, old_name, - gimple_bb (old_phi), true); + gimple_bb (old_phi), loop_phi); if (new_name) { add_phi_arg (new_phi, new_name, e, get_loc (old_name)); @@ -2315,7 +2327,7 @@ translate_isl_ast_to_gimple::copy_loop_close_phi_args (basic_block old_bb, set_rename (res, new_res); tree old_name = gimple_phi_arg_def (old_close_phi, 0); - tree new_name = get_new_name (new_bb, old_name, old_bb, false); + tree new_name = get_new_name (new_bb, old_name, old_bb, close_phi); /* Predecessor basic blocks of a loop close phi should have been code generated before. FIXME: This is fixable by merging PHIs from inner @@ -2589,7 +2601,7 @@ translate_isl_ast_to_gimple::copy_cond_phi_args (gphi *phi, gphi *new_phi, for (unsigned i = 0; i < gimple_phi_num_args (phi); i++) { tree old_name = gimple_phi_arg_def (phi, i); - tree new_name = get_new_name (new_bb, old_name, old_bb, false); + tree new_name = get_new_name (new_bb, old_name, old_bb, cond_phi); old_phi_args[i] = old_name; if (new_name) { diff --git a/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 b/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 index 6c16a19..a66ddfd 100644 --- a/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 +++ b/gcc/testsuite/gfortran.dg/graphite/interchange-3.f90 @@ -24,4 +24,4 @@ Program FOO end Program FOO -! { dg-final { scan-tree-dump-times "unsuccessful in translating pending phis" "1" "graphite" } } +! { dg-final { scan-tree-dump-times "unsuccessful, reverting back to the original code." "1" "graphite" } } -- 2.5.0