aboutsummaryrefslogtreecommitdiff
path: root/gcc/sched-deps.c
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim@codesourcery.com>2008-08-06 06:23:47 +0000
committerMaxim Kuvyrkov <mkuvyrkov@gcc.gnu.org>2008-08-06 06:23:47 +0000
commitc275297bdd09468bb84ab839e89f585ca9541fee (patch)
tree8f3b78a1d1981ab8d1ecf8b75384494399203c58 /gcc/sched-deps.c
parenta0d33ff828f123b1682eeb346885b2f40e2db224 (diff)
downloadgcc-c275297bdd09468bb84ab839e89f585ca9541fee.zip
gcc-c275297bdd09468bb84ab839e89f585ca9541fee.tar.gz
gcc-c275297bdd09468bb84ab839e89f585ca9541fee.tar.bz2
re PR target/35659 (Miscompiled code with -O2 (but not with -O2 -funroll-loops) on ia64)
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. From-SVN: r138759
Diffstat (limited to 'gcc/sched-deps.c')
-rw-r--r--gcc/sched-deps.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index b8b3a44..bbd7a36 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.