From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 67028 invoked by alias); 28 Sep 2016 11:36:10 -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 67009 invoked by uid 89); 28 Sep 2016 11:36:09 -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=liberty 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:35:59 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 41A56ADB6 for ; Wed, 28 Sep 2016 11:35:57 +0000 (UTC) Date: Wed, 28 Sep 2016 11:42:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH][2/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/msg02117.txt.bz2 The following patch makes VN not choke on code that stores to readonly memory it knows the constant value of. I took the liberty to clean up the surrounding code a bit as well. Bootstrap / regtest in progress on x86_64-unknown-linux-gnu. Richard. 2016-09-28 Richard Biener PR tree-optimization/77768 * tree-ssa-sccvn.c (visit_reference_op_store): Properly deal with stores to a place we know has a constant value. Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 240566) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -3575,7 +3575,7 @@ visit_reference_op_store (tree lhs, tree { bool changed = false; vn_reference_t vnresult = NULL; - tree result, assign; + tree assign; bool resultsame = false; tree vuse = gimple_vuse (stmt); tree vdef = gimple_vdef (stmt); @@ -3599,9 +3599,11 @@ visit_reference_op_store (tree lhs, tree Otherwise, the vdefs for the store are used when inserting into the table, since the store generates a new memory state. */ - result = vn_reference_lookup (lhs, vuse, VN_NOWALK, &vnresult, false); - if (result) + vn_reference_lookup (lhs, vuse, VN_NOWALK, &vnresult, false); + if (vnresult + && vnresult->result) { + tree result = vnresult->result; if (TREE_CODE (result) == SSA_NAME) result = SSA_VAL (result); resultsame = expressions_equal_p (result, op); @@ -3616,22 +3618,21 @@ visit_reference_op_store (tree lhs, tree } } - if ((!result || !resultsame) + if (!resultsame) + { /* Only perform the following when being called from PRE which embeds tail merging. */ - && default_vn_walk_kind == VN_WALK) - { - assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op); - vn_reference_lookup (assign, vuse, VN_NOWALK, &vnresult, false); - if (vnresult) + if (default_vn_walk_kind == VN_WALK) { - VN_INFO (vdef)->use_processed = true; - return set_ssa_val_to (vdef, vnresult->result_vdef); + assign = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, op); + vn_reference_lookup (assign, vuse, VN_NOWALK, &vnresult, false); + if (vnresult) + { + VN_INFO (vdef)->use_processed = true; + return set_ssa_val_to (vdef, vnresult->result_vdef); + } } - } - if (!result || !resultsame) - { if (dump_file && (dump_flags & TDF_DETAILS)) { fprintf (dump_file, "No store match\n"); @@ -3644,9 +3645,7 @@ visit_reference_op_store (tree lhs, tree /* Have to set value numbers before insert, since insert is going to valueize the references in-place. */ if (vdef) - { - changed |= set_ssa_val_to (vdef, vdef); - } + changed |= set_ssa_val_to (vdef, vdef); /* Do not insert structure copies into the tables. */ if (is_gimple_min_invariant (op)