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? 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