From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 81813 invoked by alias); 8 Mar 2018 09:22:43 -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 81672 invoked by uid 89); 8 Mar 2018 09:22:19 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-10.6 required=5.0 tests=BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,KAM_NUMSUBJECT,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=12269, Hx-languages-length:5667 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, 08 Mar 2018 09:22:17 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 84D94ACF6 for ; Thu, 8 Mar 2018 09:22:15 +0000 (UTC) Date: Thu, 08 Mar 2018 09:22:00 -0000 From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] Fix PR84746 Message-ID: User-Agent: Alpine 2.20 (LSU 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-SW-Source: 2018-03/txt/msg00373.txt.bz2 The following fixes a bug where we lookup simplified expression results in the ANTIC_IN sets but we've simplified aready translated expressions so that lookup is bogus - we have to lookup in ANTIC_OUT instead. The following does this and makes sure the (partially constructed) set is available. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2018-03-08 Richard Biener * tree-ssa-pre.c (find_leader_in_sets): Deal with SET1 being NULL. (phi_translate): Pass in destination ANTIC_OUT set. (phi_translate_1): Likewise. For a simplified result lookup a leader in ANTIC_OUT and AVAIL_OUT, not the ANTIC_IN sets. (phi_translate_set): Adjust. (do_pre_regular_insertion): Likewise. (do_pre_partial_partial_insertion): Likewise. * gcc.dg/torture/pr84746.c: New testcase. Index: gcc/tree-ssa-pre.c =================================================================== --- gcc/tree-ssa-pre.c (revision 258317) +++ gcc/tree-ssa-pre.c (working copy) @@ -1226,9 +1226,10 @@ static inline pre_expr find_leader_in_sets (unsigned int val, bitmap_set_t set1, bitmap_set_t set2, bitmap_set_t set3 = NULL) { - pre_expr result; + pre_expr result = NULL; - result = bitmap_find_leader (set1, val); + if (set1) + result = bitmap_find_leader (set1, val); if (!result && set2) result = bitmap_find_leader (set2, val); if (!result && set3) @@ -1332,14 +1333,15 @@ get_representative_for (const pre_expr e static pre_expr -phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, edge e); +phi_translate (bitmap_set_t, pre_expr, bitmap_set_t, bitmap_set_t, edge); /* Translate EXPR using phis in PHIBLOCK, so that it has the values of the phis in PRED. Return NULL if we can't find a leader for each part of the translated expression. */ static pre_expr -phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, edge e) +phi_translate_1 (bitmap_set_t dest, + pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, edge e) { basic_block pred = e->src; basic_block phiblock = e->dest; @@ -1363,10 +1365,11 @@ phi_translate_1 (pre_expr expr, bitmap_s pre_expr leader, result; unsigned int op_val_id = VN_INFO (newnary->op[i])->value_id; leader = find_leader_in_sets (op_val_id, set1, set2); - result = phi_translate (leader, set1, set2, e); + result = phi_translate (dest, leader, set1, set2, e); if (result && result != leader) - /* Force a leader as well as we are simplifying this - expression. */ + /* If op has a leader in the sets we translate make + sure to use the value of the translated expression. + We might need a new representative for that. */ newnary->op[i] = get_representative_for (result, pred); else if (!result) return NULL; @@ -1399,7 +1402,12 @@ phi_translate_1 (pre_expr expr, bitmap_s else { unsigned value_id = get_expr_value_id (constant); - constant = find_leader_in_sets (value_id, set1, set2, + /* We want a leader in ANTIC_OUT or AVAIL_OUT here. + dest has what we computed into ANTIC_OUT sofar + so pick from that - since topological sorting + by sorted_array_from_bitmap_set isn't perfect + we may lose some cases here. */ + constant = find_leader_in_sets (value_id, dest, AVAIL_OUT (pred)); if (constant) return constant; @@ -1485,7 +1493,7 @@ phi_translate_1 (pre_expr expr, bitmap_s } op_val_id = VN_INFO (op[n])->value_id; leader = find_leader_in_sets (op_val_id, set1, set2); - opresult = phi_translate (leader, set1, set2, e); + opresult = phi_translate (dest, leader, set1, set2, e); if (opresult && opresult != leader) { tree name = get_representative_for (opresult); @@ -1635,7 +1643,8 @@ phi_translate_1 (pre_expr expr, bitmap_s /* Wrapper around phi_translate_1 providing caching functionality. */ static pre_expr -phi_translate (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, edge e) +phi_translate (bitmap_set_t dest, pre_expr expr, + bitmap_set_t set1, bitmap_set_t set2, edge e) { expr_pred_trans_t slot = NULL; pre_expr phitrans; @@ -1661,7 +1670,7 @@ phi_translate (pre_expr expr, bitmap_set } /* Translate. */ - phitrans = phi_translate_1 (expr, set1, set2, e); + phitrans = phi_translate_1 (dest, expr, set1, set2, e); if (slot) { @@ -1698,7 +1707,7 @@ phi_translate_set (bitmap_set_t dest, bi FOR_EACH_VEC_ELT (exprs, i, expr) { pre_expr translated; - translated = phi_translate (expr, set, NULL, e); + translated = phi_translate (dest, expr, set, NULL, e); if (!translated) continue; @@ -3199,7 +3212,7 @@ do_pre_regular_insertion (basic_block bl gcc_assert (!(pred->flags & EDGE_FAKE)); bprime = pred->src; /* We are looking at ANTIC_OUT of bprime. */ - eprime = phi_translate (expr, ANTIC_IN (block), NULL, pred); + eprime = phi_translate (NULL, expr, ANTIC_IN (block), NULL, pred); /* eprime will generally only be NULL if the value of the expression, translated @@ -3354,7 +3367,7 @@ do_pre_partial_partial_insertion (basic_ and so not come across fake pred edges. */ gcc_assert (!(pred->flags & EDGE_FAKE)); bprime = pred->src; - eprime = phi_translate (expr, ANTIC_IN (block), + eprime = phi_translate (NULL, expr, ANTIC_IN (block), PA_IN (block), pred); /* eprime will generally only be NULL if the Index: gcc/testsuite/gcc.dg/torture/pr84746.c =================================================================== --- gcc/testsuite/gcc.dg/torture/pr84746.c (nonexistent) +++ gcc/testsuite/gcc.dg/torture/pr84746.c (working copy) @@ -0,0 +1,26 @@ +/* { dg-do compile } */ + +int a, b, c, d, e; +char f, g; + +void fn1 () +{ + while (1) + { + if (d) + goto L1; + if (e) + goto L3; + int q = (c && a) % (f * (d || a)) && b; + e = q; + if (b) + break; +L1: +L2: + c = f; +L3: + f = g; + while (a) + goto L2; + } +}