On April 23, 2020 8:19:55 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> wrote:
>Hi!
>
>In the recent get_narrower change, I wanted it to be efficient and
>avoid
>recursion if there are many nested COMPOUND_EXPRs.  That builds the
>COMPOUND_EXPR nest with the right arguments, but as build2_loc computes
>some
>flags like TREE_SIDE_EFFECTS, TREE_CONSTANT and TREE_READONLY, when it
>is called with something that will not be the argument in the end,
>those
>flags are computed incorrectly.
>So, this patch instead uses an auto_vec and builds them in the reverse
>order
>so when they are built, they are built with the correct operands.
>
>Bootstrapped/regtested on powerpc64{,le}-linux, ok for trunk?

OK. 

Richard. 

>2020-04-23  Jakub Jelinek  <ja...@redhat.com>
>
>       PR middle-end/94724
>       * tree.c (get_narrower): Instead of creating COMPOUND_EXPRs
>       temporarily with non-final second operand and updating it later,
>       push COMPOUND_EXPRs into a vector and process it in reverse,
>       creating COMPOUND_EXPRs with the final operands.
>
>       * gcc.c-torture/execute/pr94724.c: New test.
>
>--- gcc/tree.c.jj      2020-04-04 09:14:29.808002636 +0200
>+++ gcc/tree.c 2020-04-23 11:07:34.003675831 +0200
>@@ -8881,18 +8881,22 @@ get_narrower (tree op, int *unsignedp_pt
> 
>   if (TREE_CODE (op) == COMPOUND_EXPR)
>     {
>-      while (TREE_CODE (op) == COMPOUND_EXPR)
>+      do
>       op = TREE_OPERAND (op, 1);
>+      while (TREE_CODE (op) == COMPOUND_EXPR);
>       tree ret = get_narrower (op, unsignedp_ptr);
>       if (ret == op)
>       return win;
>-      op = win;
>-      for (tree *p = &win; TREE_CODE (op) == COMPOUND_EXPR;
>-         op = TREE_OPERAND (op, 1), p = &TREE_OPERAND (*p, 1))
>-      *p = build2_loc (EXPR_LOCATION (op), COMPOUND_EXPR,
>-                       TREE_TYPE (ret), TREE_OPERAND (op, 0),
>-                       ret);
>-      return win;
>+      auto_vec <tree, 16> v;
>+      unsigned int i;
>+      for (tree op = win; TREE_CODE (op) == COMPOUND_EXPR;
>+         op = TREE_OPERAND (op, 1))
>+      v.safe_push (op);
>+      FOR_EACH_VEC_ELT_REVERSE (v, i, op)
>+      ret = build2_loc (EXPR_LOCATION (op), COMPOUND_EXPR,
>+                        TREE_TYPE (win), TREE_OPERAND (op, 0),
>+                        ret);
>+      return ret;
>     }
>   while (TREE_CODE (op) == NOP_EXPR)
>     {
>--- gcc/testsuite/gcc.c-torture/execute/pr94724.c.jj   2020-04-23
>11:11:52.470736940 +0200
>+++ gcc/testsuite/gcc.c-torture/execute/pr94724.c      2020-04-23
>11:14:27.999367103 +0200
>@@ -0,0 +1,12 @@
>+/* PR middle-end/94724 */
>+
>+short a, b;
>+
>+int
>+main ()
>+{
>+  (0, (0, (a = 0 >= 0, b))) != 53601;
>+  if (a != 1)
>+    __builtin_abort ();
>+  return 0;
>+}
>
>       Jakub

Reply via email to