re PR tree-optimization/88029 (ICE in execute_todo, at passes.c:1974)
authorRichard Biener <rguenther@suse.de>
Thu, 15 Nov 2018 13:44:34 +0000 (13:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 15 Nov 2018 13:44:34 +0000 (13:44 +0000)
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

gcc/ChangeLog
gcc/gimple.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr88029.c [new file with mode: 0644]
gcc/trans-mem.c

index df86323..f60b321 100644 (file)
@@ -1,5 +1,12 @@
 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
        * tree-vect-loop.c (vectorizable_reduction): Move check
        for multiple types earlier so we get the expected dump.
index 41d9f67..23ccbae 100644 (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;
index ee0d920..c947fa9 100644 (file)
@@ -1,5 +1,10 @@
 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
        * gcc.dg/pr88031.c: New testcase.
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr88029.c b/gcc/testsuite/gcc.dg/tree-ssa/pr88029.c
new file mode 100644 (file)
index 0000000..c169dd5
--- /dev/null
@@ -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" } } */
index 938f4e2..bb7146b 100644 (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.  */