From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20200 invoked by alias); 29 Sep 2016 07:12: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 20177 invoked by uid 89); 29 Sep 2016 07:12:56 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-4.9 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=2016-09-29, interest 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 ESMTP; Thu, 29 Sep 2016 07:12:46 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 63526ABC3; Thu, 29 Sep 2016 07:12:44 +0000 (UTC) Date: Thu, 29 Sep 2016 07:36:00 -0000 From: Richard Biener To: Markus Trippelsdorf cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH][1/2] Fix PR77768 In-Reply-To: <20160929050648.GA9969@x4> Message-ID: References: <20160929050648.GA9969@x4> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2016-09/txt/msg02211.txt.bz2 On Thu, 29 Sep 2016, Markus Trippelsdorf wrote: > On 2016.09.28 at 13:33 +0200, Richard Biener wrote: > > > > I am testing the following patch to avoid useless VRP range allocations > > when we just ask for varying on stmts we don't know how to handle. > > I think it should fix the PR where we end up assigning to the > > static const vr_const_varying returned by get_value_range in the early VRP > > context. > > > > Eventually the VRP lattice needs to become sparse (or just growable, I > > have a patch for that as well). Not until early VRP gets some more > > capabilities though, it would be a waste otherwise. > > > > Bootstrap / regtest in progress on x86_64-unknown-linux-gnu. > > You probably noticed this yourself, but the patch causes conftests to > spin during stageprofile. For example libiberty: > > configure:6516: checking for working fork > configure:6538: /home/trippels/gcc_build_dir_/./prev-gcc/xgcc -B/home/trippels/gcc_build_dir_/./prev-gcc/ -B/usr/local/powerpc64le-unknown-linux-gnu/bin/ -B/usr/local/powerpc64le-unknown-linux-gnu/bin/ -B/usr/local/powerpc64le-unknown-linux-gnu/lib/ -isystem /usr/local/powerpc64le-unknown-linux-gnu/include -isystem /usr/local/powerpc64le-unknown-linux-gnu/sys-include -o conftest -mcpu=power8 -O3 -pipe -gtoggle -fprofile-generate -static-libstdc++ -static-libgcc conftest.c >&5 > configure:6538: $? = 0 > configure:6538: ./conftest > <> I did. The following is what I have installed (not allocating the ranges doesn't work - they end up UNDEFINED, but we can avoid storing to already VR_VARYING ones). Bootstrapped / tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2016-09-29 Richard Biener * tree-vrp.c (set_defs_to_varying): New helper avoiding writing to vr_const_varying. (vrp_initialize): Call it. (vrp_visit_stmt): Likewise. (evrp_dom_walker::before_dom_children): Likewise. Index: gcc/tree-vrp.c =================================================================== --- gcc/tree-vrp.c (revision 240568) +++ gcc/tree-vrp.c (working copy) @@ -710,6 +710,23 @@ get_value_range (const_tree var) return vr; } +/* Set value-ranges of all SSA names defined by STMT to varying. */ + +static void +set_defs_to_varying (gimple *stmt) +{ + ssa_op_iter i; + tree def; + FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF) + { + value_range *vr = get_value_range (def); + /* Avoid writing to vr_const_varying get_value_range may return. */ + if (vr->type != VR_VARYING) + set_value_range_to_varying (vr); + } +} + + /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */ static inline bool @@ -7022,10 +7039,7 @@ vrp_initialize () prop_set_simulate_again (stmt, true); else if (!stmt_interesting_for_vrp (stmt)) { - ssa_op_iter i; - tree def; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, i, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); + set_defs_to_varying (stmt); prop_set_simulate_again (stmt, false); } else @@ -7901,8 +7915,6 @@ vrp_visit_stmt (gimple *stmt, edge *take { value_range vr = VR_INITIALIZER; tree lhs = gimple_get_lhs (stmt); - tree def; - ssa_op_iter iter; extract_range_from_stmt (stmt, taken_edge_p, output_p, &vr); if (*output_p) @@ -7997,8 +8009,7 @@ vrp_visit_stmt (gimple *stmt, edge *take /* All other statements produce nothing of interest for VRP, so mark their outputs varying and prevent further simulation. */ - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); + set_defs_to_varying (stmt); return (*taken_edge_p) ? SSA_PROP_INTERESTING : SSA_PROP_VARYING; } @@ -10726,12 +10737,7 @@ evrp_dom_walker::before_dom_children (ba && (vr.type == VR_RANGE || vr.type == VR_ANTI_RANGE)) update_value_range (output, &vr); else - { - tree def; - ssa_op_iter iter; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); - } + set_defs_to_varying (stmt); /* Try folding stmts with the VR discovered. */ bool did_replace @@ -10780,12 +10786,7 @@ evrp_dom_walker::before_dom_children (ba } } else - { - tree def; - ssa_op_iter iter; - FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) - set_value_range_to_varying (get_value_range (def)); - } + set_defs_to_varying (stmt); } bb->flags |= BB_VISITED; return NULL;