diff options
author | Tom de Vries <tdevries@suse.de> | 2020-10-04 13:23:37 +0200 |
---|---|---|
committer | Tom de Vries <tdevries@suse.de> | 2020-10-06 11:23:08 +0200 |
commit | 9d63e3ab40778a7dfd20605c8741becbb22b9014 (patch) | |
tree | b90e6ffb081010ee070d2d61d641ae2f87020dbc | |
parent | 9065c4adab0b1280f5707d53833d195d0d350fd2 (diff) | |
download | gcc-9d63e3ab40778a7dfd20605c8741becbb22b9014.zip gcc-9d63e3ab40778a7dfd20605c8741becbb22b9014.tar.gz gcc-9d63e3ab40778a7dfd20605c8741becbb22b9014.tar.bz2 |
[ftracer] Factor out can_duplicate_bb_p
Factor out can_duplicate_bb_p out of ignore_bb_p.
Also factor out can_duplicate_insn_p and can_duplicate_bb_no_insn_iter_p to
expose the parts of can_duplicate_bb_p that are per-bb and per-insn.
Bootstrapped and reg-tested on x86_64-linux.
gcc/ChangeLog:
2020-10-05 Tom de Vries <tdevries@suse.de>
* tracer.c (can_duplicate_insn_p, can_duplicate_bb_no_insn_iter_p)
(can_duplicate_bb_p): New function, factored out of ...
(ignore_bb_p): ... here.
-rw-r--r-- | gcc/tracer.c | 72 |
1 files changed, 49 insertions, 23 deletions
diff --git a/gcc/tracer.c b/gcc/tracer.c index 7f32ccb..107b446 100644 --- a/gcc/tracer.c +++ b/gcc/tracer.c @@ -84,49 +84,75 @@ bb_seen_p (basic_block bb) return bitmap_bit_p (bb_seen, bb->index); } -/* Return true if we should ignore the basic block for purposes of tracing. */ -bool -ignore_bb_p (const_basic_block bb) +/* Return true if gimple stmt G can be duplicated. */ +static bool +can_duplicate_insn_p (gimple *g) +{ + /* An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be + duplicated as part of its group, or not at all. + The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a + group, so the same holds there. */ + if (is_gimple_call (g) + && (gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC) + || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT) + || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY) + || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY) + || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_IDX))) + return false; + + return true; +} + +/* Return true if BB can be duplicated. Avoid iterating over the insns. */ +static bool +can_duplicate_bb_no_insn_iter_p (const_basic_block bb) { if (bb->index < NUM_FIXED_BLOCKS) - return true; - if (optimize_bb_for_size_p (bb)) - return true; + return false; if (gimple *g = last_stmt (CONST_CAST_BB (bb))) { /* A transaction is a single entry multiple exit region. It must be duplicated in its entirety or not at all. */ if (gimple_code (g) == GIMPLE_TRANSACTION) - return true; + return false; /* An IFN_UNIQUE call must be duplicated as part of its group, or not at all. */ if (is_gimple_call (g) && gimple_call_internal_p (g) && gimple_call_internal_unique_p (g)) - return true; + return false; } + return true; +} + +/* Return true if BB can be duplicated. */ +static bool +can_duplicate_bb_p (const_basic_block bb) +{ + if (!can_duplicate_bb_no_insn_iter_p (bb)) + return false; + for (gimple_stmt_iterator gsi = gsi_start_bb (CONST_CAST_BB (bb)); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple *g = gsi_stmt (gsi); + if (!can_duplicate_insn_p (gsi_stmt (gsi))) + return false; - /* An IFN_GOMP_SIMT_ENTER_ALLOC/IFN_GOMP_SIMT_EXIT call must be - duplicated as part of its group, or not at all. - The IFN_GOMP_SIMT_VOTE_ANY and IFN_GOMP_SIMT_XCHG_* are part of such a - group, so the same holds there. */ - if (is_gimple_call (g) - && (gimple_call_internal_p (g, IFN_GOMP_SIMT_ENTER_ALLOC) - || gimple_call_internal_p (g, IFN_GOMP_SIMT_EXIT) - || gimple_call_internal_p (g, IFN_GOMP_SIMT_VOTE_ANY) - || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_BFLY) - || gimple_call_internal_p (g, IFN_GOMP_SIMT_XCHG_IDX))) - return true; - } + return true; +} + +/* Return true if we should ignore the basic block for purposes of tracing. */ +bool +ignore_bb_p (const_basic_block bb) +{ + if (bb->index < NUM_FIXED_BLOCKS) + return true; + if (optimize_bb_for_size_p (bb)) + return true; - return false; + return !can_duplicate_bb_p (bb); } /* Return number of instructions in the block. */ |