Commit bca558de by Jakub Jelinek

tree: Fix up get_narrower [PR94724]

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.

2020-04-23  Jakub Jelinek  <jakub@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.
parent 06eca1ac
2020-04-23 Jakub Jelinek <jakub@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.
2020-04-23 Szabolcs Nagy <szabolcs.nagy@arm.com> 2020-04-23 Szabolcs Nagy <szabolcs.nagy@arm.com>
PR target/94697 PR target/94697
......
2020-04-23 Jakub Jelinek <jakub@redhat.com>
PR middle-end/94724
* gcc.c-torture/execute/pr94724.c: New test.
2020-04-23 Thomas Koenig <tkoenig@gcc.gnu.org> 2020-04-23 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/93956 PR fortran/93956
* gfortran.dg/pointer_assign_13.f90: New test. * gfortran.dg/pointer_assign_13.f90: New test.
2020-04-23 Iain Sandoe <iain@sandoe.co.uk> 2020-04-23 Iain Sandoe <iain@sandoe.co.uk>
* g++.dg/coroutines/coro-bad-alloc-00-bad-op-new.C: Adjust for * g++.dg/coroutines/coro-bad-alloc-00-bad-op-new.C: Adjust for
changed inline namespace. changed inline namespace.
......
/* PR middle-end/94724 */
short a, b;
int
main ()
{
(0, (0, (a = 0 >= 0, b))) != 53601;
if (a != 1)
__builtin_abort ();
return 0;
}
...@@ -8881,18 +8881,22 @@ get_narrower (tree op, int *unsignedp_ptr) ...@@ -8881,18 +8881,22 @@ get_narrower (tree op, int *unsignedp_ptr)
if (TREE_CODE (op) == COMPOUND_EXPR) if (TREE_CODE (op) == COMPOUND_EXPR)
{ {
while (TREE_CODE (op) == COMPOUND_EXPR) do
op = TREE_OPERAND (op, 1); op = TREE_OPERAND (op, 1);
while (TREE_CODE (op) == COMPOUND_EXPR);
tree ret = get_narrower (op, unsignedp_ptr); tree ret = get_narrower (op, unsignedp_ptr);
if (ret == op) if (ret == op)
return win; return win;
op = win; auto_vec <tree, 16> v;
for (tree *p = &win; TREE_CODE (op) == COMPOUND_EXPR; unsigned int i;
op = TREE_OPERAND (op, 1), p = &TREE_OPERAND (*p, 1)) for (tree op = win; TREE_CODE (op) == COMPOUND_EXPR;
*p = build2_loc (EXPR_LOCATION (op), COMPOUND_EXPR, op = TREE_OPERAND (op, 1))
TREE_TYPE (ret), TREE_OPERAND (op, 0), 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); ret);
return win; return ret;
} }
while (TREE_CODE (op) == NOP_EXPR) while (TREE_CODE (op) == NOP_EXPR)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment