tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt): Only allow expected function...
authorRichard Biener <rguenther@suse.de>
Mon, 3 Dec 2018 15:13:04 +0000 (15:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 3 Dec 2018 15:13:04 +0000 (15:13 +0000)
2018-12-03  Richard Biener  <rguenther@suse.de>

* tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt): Only
allow expected function-pointer cast re-instantiation.

From-SVN: r266742

gcc/ChangeLog
gcc/tree-ssa-sccvn.c

index 2ac32608a45721f067799b87b2834df5dd416a34..bde3cd4f042a5f0bcff29bc387c281dfd170d0c3 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-03  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_stmt): Only
+       allow expected function-pointer cast re-instantiation.
+
 2018-12-03  Ilya Leoshkevich  <iii@linux.ibm.com>
 
        * common/config/s390/s390-common.c (s390_option_init_struct):
index 8f2b4608b5c5ded98fafb59eaf3853bb3c7a3489..700aa1fadc5954fa95526e07970c1eae603dd2a8 100644 (file)
@@ -4984,10 +4984,6 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
            return;
 
          /* Else replace its RHS.  */
-         bool can_make_abnormal_goto
-             = is_gimple_call (stmt)
-             && stmt_can_make_abnormal_goto (stmt);
-
          if (dump_file && (dump_flags & TDF_DETAILS))
            {
              fprintf (dump_file, "Replaced ");
@@ -4997,12 +4993,23 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi)
              fprintf (dump_file, " in ");
              print_gimple_stmt (dump_file, stmt, 0);
            }
-
          eliminations++;
+
+         bool can_make_abnormal_goto = (is_gimple_call (stmt)
+                                        && stmt_can_make_abnormal_goto (stmt));
          gimple *orig_stmt = stmt;
          if (!useless_type_conversion_p (TREE_TYPE (lhs),
                                          TREE_TYPE (sprime)))
-           sprime = fold_convert (TREE_TYPE (lhs), sprime);
+           {
+             /* We preserve conversions to but not from function or method
+                types.  This asymmetry makes it necessary to re-instantiate
+                conversions here.  */
+             if (POINTER_TYPE_P (TREE_TYPE (lhs))
+                 && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (lhs))))
+               sprime = fold_convert (TREE_TYPE (lhs), sprime);
+             else
+               gcc_unreachable ();
+           }
          tree vdef = gimple_vdef (stmt);
          tree vuse = gimple_vuse (stmt);
          propagate_tree_value_into_stmt (gsi, sprime);