From c275297bdd09468bb84ab839e89f585ca9541fee Mon Sep 17 00:00:00 2001 From: Maxim Kuvyrkov Date: Wed, 6 Aug 2008 06:23:47 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/haifa-sched.c | 26 -------------------------- gcc/sched-deps.c | 40 ++++++++++++++++++++++++++++++++++++++++ gcc/sched-int.h | 2 +- 4 files changed, 50 insertions(+), 27 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb238345559..7b50bdf77ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2008-08-06 Maxim Kuvyrkov + 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. + +2008-08-06 Maxim Kuvyrkov + * haifa-sched.c (extend_global): Split to extend_global_data and extend_region_data. Update all uses. (extend_all): Rename to extend_block_data. diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index db1d66f49b8..76282bd0ced 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -4019,32 +4019,6 @@ change_pattern (rtx insn, rtx new_pat) dfa_clear_single_insn_cache (insn); } -/* 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) - && may_trap_p (PATTERN (insn))) - return false; - - return true; -} - /* -1 - can't speculate, 0 - for speculation with REQUEST mode it is OK to use current instruction pattern, 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. diff --git a/gcc/sched-int.h b/gcc/sched-int.h index f2e39bf4fc3..bfbb8612456 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -805,6 +805,7 @@ enum INSN_TRAP_CLASS /* Functions in sched-deps.c. */ extern bool sched_insns_conditions_mutex_p (const_rtx, const_rtx); +extern bool sched_insn_is_legitimate_for_speculation_p (const_rtx, ds_t); extern void add_dependence (rtx, rtx, enum reg_note); extern void sched_analyze (struct deps *, rtx, rtx); extern bool deps_pools_are_empty_p (void); @@ -838,7 +839,6 @@ extern void sched_finish (void); extern int try_ready (rtx); extern void * xrecalloc (void *, size_t, size_t, size_t); -extern bool sched_insn_is_legitimate_for_speculation_p (const_rtx, ds_t); extern void unlink_bb_notes (basic_block, basic_block); extern void add_block (basic_block, basic_block); extern rtx bb_note (basic_block); -- 2.11.4.GIT