This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Tighten PRE/FRE elimination
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 3 Dec 2018 16:12:04 +0100 (CET)
- Subject: [PATCH] Tighten PRE/FRE elimination
It happily inserted int->float casts if sth goes wrong in VN or
elimination. The following restricts it to the expected
re-instantiation of function pointer casts.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard.
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.
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c (revision 266733)
+++ gcc/tree-ssa-sccvn.c (working copy)
@@ -4984,10 +4984,6 @@ eliminate_dom_walker::eliminate_stmt (ba
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 (ba
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);