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