mirror of git://gcc.gnu.org/git/gcc.git
Skip ubsan/asan internal fns with different location in tail-merge
2016-03-07 Tom de Vries <tom@codesourcery.com> PR tree-optimization/70116 * tree-ssa-tail-merge.c (merge_stmts_p): New function, handling is_tm_ending stmts and ubsan/asan internal functions. (find_duplicate): Use it. Don't test is_tm_ending here. From-SVN: r234029
This commit is contained in:
parent
57548bf579
commit
3c137fc947
|
|
@ -1,3 +1,10 @@
|
||||||
|
2016-03-07 Tom de Vries <tom@codesourcery.com>
|
||||||
|
|
||||||
|
PR tree-optimization/70116
|
||||||
|
* tree-ssa-tail-merge.c (merge_stmts_p): New function, handling
|
||||||
|
is_tm_ending stmts and ubsan/asan internal functions.
|
||||||
|
(find_duplicate): Use it. Don't test is_tm_ending here.
|
||||||
|
|
||||||
2016-03-07 Richard Biener <rguenther@suse.de>
|
2016-03-07 Richard Biener <rguenther@suse.de>
|
||||||
|
|
||||||
PR tree-optimization/70115
|
PR tree-optimization/70115
|
||||||
|
|
|
||||||
|
|
@ -1207,6 +1207,42 @@ gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true if equal (in the sense of gimple_equal_p) statements STMT1 and
|
||||||
|
STMT2 are allowed to be merged. */
|
||||||
|
|
||||||
|
static bool
|
||||||
|
merge_stmts_p (gimple *stmt1, gimple *stmt2)
|
||||||
|
{
|
||||||
|
/* What could be better than this here is to blacklist the bb
|
||||||
|
containing the stmt, when encountering the stmt f.i. in
|
||||||
|
same_succ_hash. */
|
||||||
|
if (is_tm_ending (stmt1))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (is_gimple_call (stmt1)
|
||||||
|
&& gimple_call_internal_p (stmt1))
|
||||||
|
switch (gimple_call_internal_fn (stmt1))
|
||||||
|
{
|
||||||
|
case IFN_UBSAN_NULL:
|
||||||
|
case IFN_UBSAN_BOUNDS:
|
||||||
|
case IFN_UBSAN_VPTR:
|
||||||
|
case IFN_UBSAN_CHECK_ADD:
|
||||||
|
case IFN_UBSAN_CHECK_SUB:
|
||||||
|
case IFN_UBSAN_CHECK_MUL:
|
||||||
|
case IFN_UBSAN_OBJECT_SIZE:
|
||||||
|
case IFN_ASAN_CHECK:
|
||||||
|
/* For these internal functions, gimple_location is an implicit
|
||||||
|
parameter, which will be used explicitly after expansion.
|
||||||
|
Merging these statements may cause confusing line numbers in
|
||||||
|
sanitizer messages. */
|
||||||
|
return gimple_location (stmt1) == gimple_location (stmt2);
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Determines whether BB1 and BB2 (members of same_succ) are duplicates. If so,
|
/* Determines whether BB1 and BB2 (members of same_succ) are duplicates. If so,
|
||||||
clusters them. */
|
clusters them. */
|
||||||
|
|
||||||
|
|
@ -1226,14 +1262,10 @@ find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2)
|
||||||
gimple *stmt1 = gsi_stmt (gsi1);
|
gimple *stmt1 = gsi_stmt (gsi1);
|
||||||
gimple *stmt2 = gsi_stmt (gsi2);
|
gimple *stmt2 = gsi_stmt (gsi2);
|
||||||
|
|
||||||
/* What could be better than this here is to blacklist the bb
|
if (!gimple_equal_p (same_succ, stmt1, stmt2))
|
||||||
containing the stmt, when encountering the stmt f.i. in
|
|
||||||
same_succ_hash. */
|
|
||||||
if (is_tm_ending (stmt1)
|
|
||||||
|| is_tm_ending (stmt2))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!gimple_equal_p (same_succ, stmt1, stmt2))
|
if (!merge_stmts_p (stmt1, stmt2))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gsi_prev_nondebug (&gsi1);
|
gsi_prev_nondebug (&gsi1);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue