re PR tree-optimization/88029 (ICE in execute_todo, at passes.c:1974)

2018-11-15  Richard Biener  <rguenther@suse.de>

        PR middle-end/88029
        * gimple.c (gimple_call_flags): Union flags from decl, type
        and call fntype.
        * trans-mem.c (is_tm_pure_call): Simplify.

        * gcc.dg/tree-ssa/pr88029.c: New testcase.

From-SVN: r266183
This commit is contained in:
Richard Biener 2018-11-15 13:44:34 +00:00 committed by Richard Biener
parent 22692f3ce9
commit 0e02fb2638
5 changed files with 35 additions and 20 deletions

View File

@ -1,3 +1,10 @@
2018-11-15 Richard Biener <rguenther@suse.de>
PR middle-end/88029
* gimple.c (gimple_call_flags): Union flags from decl, type
and call fntype.
* trans-mem.c (is_tm_pure_call): Simplify.
2018-11-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/88031

View File

@ -1446,15 +1446,17 @@ gimple_call_same_target_p (const gimple *c1, const gimple *c2)
int
gimple_call_flags (const gimple *stmt)
{
int flags;
tree decl = gimple_call_fndecl (stmt);
int flags = 0;
if (decl)
flags = flags_from_decl_or_type (decl);
else if (gimple_call_internal_p (stmt))
if (gimple_call_internal_p (stmt))
flags = internal_fn_flags (gimple_call_internal_fn (stmt));
else
flags = flags_from_decl_or_type (gimple_call_fntype (stmt));
{
tree decl = gimple_call_fndecl (stmt);
if (decl)
flags = flags_from_decl_or_type (decl);
flags |= flags_from_decl_or_type (gimple_call_fntype (stmt));
}
if (stmt->subcode & GF_CALL_NOTHROW)
flags |= ECF_NOTHROW;

View File

@ -1,3 +1,8 @@
2018-11-15 Richard Biener <rguenther@suse.de>
PR middle-end/88029
* gcc.dg/tree-ssa/pr88029.c: New testcase.
2018-11-15 Richard Biener <rguenther@suse.de>
PR tree-optimization/88031

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-O -w -fdump-tree-fre1-vops" } */
double foo (double) __attribute__ ((pure));
double (*fp) (double) __attribute__ ((const));
double f(double a)
{
fp = foo;
/* Verify when propagating foo to the call we preserve its constness. */
return fp (a);
}
/* { dg-final { scan-tree-dump "foo \\(a" "fre1" } } */
/* { dg-final { scan-tree-dump-times "VUSE" 1 "fre1" } } */

View File

@ -265,20 +265,7 @@ is_tm_safe (const_tree x)
static bool
is_tm_pure_call (gimple *call)
{
if (gimple_call_internal_p (call))
return (gimple_call_flags (call) & (ECF_CONST | ECF_TM_PURE)) != 0;
tree fn = gimple_call_fn (call);
if (TREE_CODE (fn) == ADDR_EXPR)
{
fn = TREE_OPERAND (fn, 0);
gcc_assert (TREE_CODE (fn) == FUNCTION_DECL);
}
else
fn = TREE_TYPE (fn);
return is_tm_pure (fn);
return (gimple_call_flags (call) & (ECF_CONST | ECF_TM_PURE)) != 0;
}
/* Return true if X has been marked TM_CALLABLE. */