From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 90392 invoked by alias); 13 Aug 2015 07:03:53 -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 90376 invoked by uid 89); 13 Aug 2015 07:03:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_50,KAM_ASCII_DIVIDERS,RP_MATCHES_RCVD,SPF_PASS autolearn=no version=3.3.2 X-HELO: mx2.suse.de Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (CAMELLIA256-SHA encrypted) ESMTPS; Thu, 13 Aug 2015 07:03:51 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9963BAD14 for ; Thu, 13 Aug 2015 07:03:47 +0000 (UTC) Date: Thu, 13 Aug 2015 07:46:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PRs 66502 and 67167 Message-ID: User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2015-08/txt/msg00677.txt.bz2 Given there is now PR67167 I am going forward with the earlier posted patch to switch SCCVN to PHI elimination in favor of another PHI (to remove IVs) rather than in favor of its only executable edge value. I still see no way to capture both cases without detecting the choice and re-numbering the SCC twice, eventually choosing the "better" outcome. And then the situation where both cases happen in the same SCC is not handled either. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2015-08-13 Richard Biener PR tree-optimization/66502 PR tree-optimization/67167 * tree-ssa-sccvn.c (vn_phi_compute_hash): Do not include backedge arguments. (vn_phi_lookup): Adjust. (vn_phi_insert): Likewise. (visit_phi): Prefer to value-number to another PHI node over value-numbering to a PHI argument. (init_scc_vn): Mark DFS back edges. * gcc.dg/tree-ssa/ssa-fre-46.c: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 226807) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -2655,17 +2655,24 @@ static inline hashval_t vn_phi_compute_hash (vn_phi_t vp1) { inchash::hash hstate (vp1->block->index); - int i; tree phi1op; tree type; + edge e; + edge_iterator ei; /* If all PHI arguments are constants we need to distinguish the PHI node via its type. */ type = vp1->type; hstate.merge_hash (vn_hash_type (type)); - FOR_EACH_VEC_ELT (vp1->phiargs, i, phi1op) + FOR_EACH_EDGE (e, ei, vp1->block->preds) { + /* Don't hash backedge values they need to be handled as VN_TOP + for optimistic value-numbering. */ + if (e->flags & EDGE_DFS_BACK) + continue; + + phi1op = vp1->phiargs[e->dest_idx]; if (phi1op == VN_TOP) continue; inchash::add_expr (phi1op, hstate); @@ -2718,16 +2725,18 @@ vn_phi_lookup (gimple phi) { vn_phi_s **slot; struct vn_phi_s vp1; - unsigned i; + edge e; + edge_iterator ei; shared_lookup_phiargs.truncate (0); + shared_lookup_phiargs.safe_grow (gimple_phi_num_args (phi)); /* Canonicalize the SSA_NAME's to their value number. */ - for (i = 0; i < gimple_phi_num_args (phi); i++) + FOR_EACH_EDGE (e, ei, gimple_bb (phi)->preds) { - tree def = PHI_ARG_DEF (phi, i); + tree def = PHI_ARG_DEF_FROM_EDGE (phi, e); def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def; - shared_lookup_phiargs.safe_push (def); + shared_lookup_phiargs[e->dest_idx] = def; } vp1.type = TREE_TYPE (gimple_phi_result (phi)); vp1.phiargs = shared_lookup_phiargs; @@ -2751,15 +2760,18 @@ vn_phi_insert (gimple phi, tree result) { vn_phi_s **slot; vn_phi_t vp1 = current_info->phis_pool->allocate (); - unsigned i; vec args = vNULL; + edge e; + edge_iterator ei; + + args.safe_grow (gimple_phi_num_args (phi)); /* Canonicalize the SSA_NAME's to their value number. */ - for (i = 0; i < gimple_phi_num_args (phi); i++) + FOR_EACH_EDGE (e, ei, gimple_bb (phi)->preds) { - tree def = PHI_ARG_DEF (phi, i); + tree def = PHI_ARG_DEF_FROM_EDGE (phi, e); def = TREE_CODE (def) == SSA_NAME ? SSA_VAL (def) : def; - args.safe_push (def); + args[e->dest_idx] = def; } vp1->value_id = VN_INFO (result)->value_id; vp1->type = TREE_TYPE (gimple_phi_result (phi)); @@ -3244,28 +3256,23 @@ visit_phi (gimple phi) if (def == VN_TOP) continue; if (sameval == VN_TOP) + sameval = def; + else if (!expressions_equal_p (def, sameval)) { - sameval = def; - } - else - { - if (!expressions_equal_p (def, sameval)) - { - allsame = false; - break; - } + allsame = false; + break; } } - /* If all value numbered to the same value, the phi node has that - value. */ - if (allsame) - return set_ssa_val_to (PHI_RESULT (phi), sameval); - - /* Otherwise, see if it is equivalent to a phi node in this block. */ + /* First see if it is equivalent to a phi node in this block. We prefer + this as it allows IV elimination - see PRs 66502 and 67167. */ result = vn_phi_lookup (phi); if (result) changed = set_ssa_val_to (PHI_RESULT (phi), result); + /* Otherwise all value numbered to the same value, the phi node has that + value. */ + else if (allsame) + changed = set_ssa_val_to (PHI_RESULT (phi), sameval); else { vn_phi_insert (phi, PHI_RESULT (phi)); @@ -4155,6 +4162,8 @@ init_scc_vn (void) int *rpo_numbers_temp; calculate_dominance_info (CDI_DOMINATORS); + mark_dfs_back_edges (); + sccstack.create (0); constant_to_value_id = new hash_table (23); Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-46.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-46.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-46.c (working copy) @@ -0,0 +1,22 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-fre1-details" } */ + +int x[1024]; +int foo (int a, int s, unsigned int k) +{ + int i = a, j = a; + int sum = 0; + do + { + sum += x[i]; + sum += x[j]; + i += s; + j += s; + } + while (k--); + return sum; +} + +/* We want to remove the redundant induction variable and thus its PHI node. */ + +/* { dg-final { scan-tree-dump "Removing dead stmt \[^\r\n\]*PHI" "fre1" } } */