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 <[email protected]>
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