diff options
author | mkuvyrkov <mkuvyrkov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-08-06 06:23:47 +0000 |
---|---|---|
committer | mkuvyrkov <mkuvyrkov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-08-06 06:23:47 +0000 |
commit | 86265ed0b5d4c20d9485b0aac92e10d5008605c6 (patch) | |
tree | 8f3b78a1d1981ab8d1ecf8b75384494399203c58 /gcc/sched-deps.c | |
parent | 97ba552253e2473141a58a0829fe797af9660601 (diff) | |
download | gcc-86265ed0b5d4c20d9485b0aac92e10d5008605c6.tar.gz |
PR target/35659
* haifa-sched.c (sched_insn_is_legitimate_for_speculation_p): Move ...
* sched-deps.c (sched_insn_is_legitimate_for_speculation_p): ... here.
Don't allow predicated instructions for data speculation.
* sched-int.h (sched_insn_is_legitimate_for_speculation_p): Move
declaration.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138759 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sched-deps.c')
-rw-r--r-- | gcc/sched-deps.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index b8b3a4418df..bbd7a36a441 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -536,6 +536,46 @@ sched_insns_conditions_mutex_p (const_rtx insn1, const_rtx insn2) } +/* Return true if INSN can potentially be speculated with type DS. */ +bool +sched_insn_is_legitimate_for_speculation_p (const_rtx insn, ds_t ds) +{ + if (HAS_INTERNAL_DEP (insn)) + return false; + + if (!NONJUMP_INSN_P (insn)) + return false; + + if (SCHED_GROUP_P (insn)) + return false; + + if (IS_SPECULATION_CHECK_P (insn)) + return false; + + if (side_effects_p (PATTERN (insn))) + return false; + + if (ds & BE_IN_SPEC) + /* The following instructions, which depend on a speculatively scheduled + instruction, cannot be speculatively scheduled along. */ + { + if (may_trap_p (PATTERN (insn))) + /* If instruction might trap, it cannot be speculatively scheduled. + For control speculation it's obvious why and for data speculation + it's because the insn might get wrong input if speculation + wasn't successful. */ + return false; + + if ((ds & BE_IN_DATA) + && sched_get_condition (insn) != NULL_RTX) + /* If this is a predicated instruction, then it cannot be + speculatively scheduled. See PR35659. */ + return false; + } + + return true; +} + /* Initialize LIST_PTR to point to one of the lists present in TYPES_PTR, initialize RESOLVED_P_PTR with true if that list consists of resolved deps, and remove the type of returned [through LIST_PTR] list from TYPES_PTR. |