From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1666) id 7A0B2383D81F; Thu, 19 May 2022 14:03:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7A0B2383D81F MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Biener To: gcc-cvs@gcc.gnu.org Subject: [gcc r11-10015] tree-optimization/105163 - abnormal SSA coalescing and reassoc X-Act-Checkin: gcc X-Git-Author: Richard Biener X-Git-Refname: refs/heads/releases/gcc-11 X-Git-Oldrev: 64b3a86d33e08072ea78f2a87c8a275bd15f07cb X-Git-Newrev: 132c3bb06a90887f5c173e00b7f2c5163e054ac1 Message-Id: <20220519140309.7A0B2383D81F@sourceware.org> Date: Thu, 19 May 2022 14:03:09 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 19 May 2022 14:03:09 -0000 https://gcc.gnu.org/g:132c3bb06a90887f5c173e00b7f2c5163e054ac1 commit r11-10015-g132c3bb06a90887f5c173e00b7f2c5163e054ac1 Author: Richard Biener Date: Wed Apr 6 09:36:38 2022 +0200 tree-optimization/105163 - abnormal SSA coalescing and reassoc The negate propagation optimizations in reassoc did not look out for abnormal SSA coalescing issues. The following fixes that. 2022-04-06 Richard Biener PR tree-optimization/105163 * tree-ssa-reassoc.c (repropagate_negates): Avoid propagating negated abnormals. * gcc.dg/torture/pr105163.c: New testcase. (cherry picked from commit 44fe49401725055a740ce47e80561b6932b8cd01) Diff: --- gcc/testsuite/gcc.dg/torture/pr105163.c | 17 +++++++++++++++++ gcc/tree-ssa-reassoc.c | 25 +++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/gcc/testsuite/gcc.dg/torture/pr105163.c b/gcc/testsuite/gcc.dg/torture/pr105163.c new file mode 100644 index 00000000000..23e04107f68 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr105163.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target nonlocal_goto } */ + +#include + +extern int bar (unsigned int *); +extern jmp_buf *baz (void); +struct C { int c1; }; +void foo (struct C *x, int *z, int e) +{ + unsigned int d = 0; + long f; + setjmp (*baz()); + f = 1 + ~d; + d = 8; + if ((!0) && !e && bar(z)) *z = 1 + f; +} diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 32e1632705b..4e2bef916db 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -5838,10 +5838,14 @@ repropagate_negates (void) FOR_EACH_VEC_ELT (plus_negates, i, negate) { gimple *user = get_single_immediate_use (negate); - if (!user || !is_gimple_assign (user)) continue; + tree negateop = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (negate)); + if (TREE_CODE (negateop) == SSA_NAME + && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (negateop)) + continue; + /* The negate operand can be either operand of a PLUS_EXPR (it can be the LHS if the RHS is a constant for example). @@ -5864,9 +5868,9 @@ repropagate_negates (void) if (gimple_assign_rhs2 (user) == negate) { tree rhs1 = gimple_assign_rhs1 (user); - tree rhs2 = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (negate)); gimple_stmt_iterator gsi = gsi_for_stmt (user); - gimple_assign_set_rhs_with_ops (&gsi, MINUS_EXPR, rhs1, rhs2); + gimple_assign_set_rhs_with_ops (&gsi, MINUS_EXPR, rhs1, + negateop); update_stmt (user); } } @@ -5875,21 +5879,20 @@ repropagate_negates (void) if (gimple_assign_rhs1 (user) == negate) { /* We have - x = -a + x = -negateop y = x - b which we transform into - x = a + b + x = negateop + b y = -x . This pushes down the negate which we possibly can merge into some other operation, hence insert it into the plus_negates vector. */ gimple *feed = SSA_NAME_DEF_STMT (negate); - tree a = gimple_assign_rhs1 (feed); tree b = gimple_assign_rhs2 (user); gimple_stmt_iterator gsi = gsi_for_stmt (feed); gimple_stmt_iterator gsi2 = gsi_for_stmt (user); tree x = make_ssa_name (TREE_TYPE (gimple_assign_lhs (feed))); - gimple *g = gimple_build_assign (x, PLUS_EXPR, a, b); + gimple *g = gimple_build_assign (x, PLUS_EXPR, negateop, b); gsi_insert_before (&gsi2, g, GSI_SAME_STMT); gimple_assign_set_rhs_with_ops (&gsi2, NEGATE_EXPR, x); user = gsi_stmt (gsi2); @@ -5900,13 +5903,11 @@ repropagate_negates (void) } else { - /* Transform "x = -a; y = b - x" into "y = b + a", getting - rid of one operation. */ - gimple *feed = SSA_NAME_DEF_STMT (negate); - tree a = gimple_assign_rhs1 (feed); + /* Transform "x = -negateop; y = b - x" into "y = b + negateop", + getting rid of one operation. */ tree rhs1 = gimple_assign_rhs1 (user); gimple_stmt_iterator gsi = gsi_for_stmt (user); - gimple_assign_set_rhs_with_ops (&gsi, PLUS_EXPR, rhs1, a); + gimple_assign_set_rhs_with_ops (&gsi, PLUS_EXPR, rhs1, negateop); update_stmt (gsi_stmt (gsi)); } }