diff options
author | Tom de Vries <tom@codesourcery.com> | 2016-03-07 14:50:13 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2016-03-07 14:50:13 +0000 |
commit | 3c137fc947c89349bf1afe51a14a86afbfb3f674 (patch) | |
tree | 3ebf552658d52b307645a69d810b8f70c237c9c0 /gcc/tree-ssa-tail-merge.c | |
parent | 57548bf579a86a1e80a0b2e4a385f18dc65e0057 (diff) | |
download | gcc-3c137fc947c89349bf1afe51a14a86afbfb3f674.zip gcc-3c137fc947c89349bf1afe51a14a86afbfb3f674.tar.gz gcc-3c137fc947c89349bf1afe51a14a86afbfb3f674.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-tail-merge.c')
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index 5d32790..e95879f 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -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, clusters them. */ @@ -1226,14 +1262,10 @@ find_duplicate (same_succ *same_succ, basic_block bb1, basic_block bb2) gimple *stmt1 = gsi_stmt (gsi1); gimple *stmt2 = gsi_stmt (gsi2); - /* 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) - || is_tm_ending (stmt2)) + if (!gimple_equal_p (same_succ, stmt1, stmt2)) return; - if (!gimple_equal_p (same_succ, stmt1, stmt2)) + if (!merge_stmts_p (stmt1, stmt2)) return; gsi_prev_nondebug (&gsi1); |