From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 63871 invoked by alias); 28 Sep 2016 11:33:13 -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 63781 invoked by uid 89); 28 Sep 2016 11:33:12 -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=MIN, capabilities, 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; Wed, 28 Sep 2016 11:33:02 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 1AEF7ADB6 for ; Wed, 28 Sep 2016 11:33:00 +0000 (UTC) Date: Wed, 28 Sep 2016 11:37:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH][1/2] Fix PR77768 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: 2016-09/txt/msg02116.txt.bz2 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. Richard. 2016-09-28 Richard Biener * tree-vrp.c (set_defs_to_varying): New helper. (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) @@ -343,6 +343,24 @@ set_value_range_to_varying (value_range } +/* 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) + { + unsigned ver = SSA_NAME_VERSION (def); + /* Avoid needlessly allocating value-ranges. */ + if (num_vr_values >= ver + && vr_value[ver]) + set_value_range_to_varying (vr_value[ver]); + } +} + + /* Set value range VR to {T, MIN, MAX, EQUIV}. */ static void @@ -7022,10 +7040,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 +7916,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 +8010,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 +10738,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 +10787,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;