From: Bernd Schmidt <bernds@codesourcery.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>
Subject: C6X port 5/11: Track predication conditions more accurately
Date: Tue, 10 May 2011 15:54:00 -0000 [thread overview]
Message-ID: <4DC95BA3.504@codesourcery.com> (raw)
In-Reply-To: <4DC956D0.3040306@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 635 bytes --]
The scheduler knows that insns with different COND_EXEC conditions don't
conflict and can be scheduled independently. Unfortunately, sched-deps.c
does not try to keep the conditions valid as it progresses. For example,
[B0] A0 = [A1]
B0 = something
[!B0] [A2] = A0
The first and third insns have opposite conditions, so the scheduler
decides they are independent. For most targets this isn't a problem, as
the insn in the middle will produce enough dependencies to ensure the
right order. However, on C6X, order alone isn't sufficient due to the
exposed pipeline: we also need to ensure that the latencies are observed.
Bernd
[-- Attachment #2: insn-cond.diff --]
[-- Type: text/plain, Size: 4996 bytes --]
* sched-int.h (struct _haifa_deps_insn_data): New members cond
and reverse_cond.
(INSN_COND, INSN_REVERSE_COND): New macros.
* sched-deps.c (deps_analyze_insn): Call sched_get_condition_with_rev
once.
(sched_get_condition_with_rev): Cache the results, and look them up
if possible.
(sched_analyze_insn): Destroy INSN_COND of previous insns if they
are clobbered by the current insn.
Index: gcc/sched-deps.c
===================================================================
--- gcc.orig/sched-deps.c
+++ gcc/sched-deps.c
@@ -489,13 +489,27 @@ deps_may_trap_p (const_rtx mem)
/* Find the condition under which INSN is executed. If REV is not NULL,
it is set to TRUE when the returned comparison should be reversed
- to get the actual condition. */
+ to get the actual condition.
+ We only do actual work the first time we come here for an insn; the
+ results are cached in INSN_COND and INSN_REVERSE_COND. */
static rtx
sched_get_condition_with_rev (const_rtx insn, bool *rev)
{
rtx pat = PATTERN (insn);
rtx src;
+ if (INSN_COND (insn) == const_true_rtx)
+ return NULL_RTX;
+
+ if (INSN_COND (insn) != NULL_RTX)
+ {
+ if (rev)
+ *rev = INSN_REVERSE_COND (insn);
+ return INSN_COND (insn);
+ }
+
+ INSN_COND (insn) = const_true_rtx;
+ INSN_REVERSE_COND (insn) = false;
if (pat == 0)
return 0;
@@ -503,7 +517,10 @@ sched_get_condition_with_rev (const_rtx
*rev = false;
if (GET_CODE (pat) == COND_EXEC)
- return COND_EXEC_TEST (pat);
+ {
+ INSN_COND (insn) = COND_EXEC_TEST (pat);
+ return COND_EXEC_TEST (pat);
+ }
if (!any_condjump_p (insn) || !onlyjump_p (insn))
return 0;
@@ -511,7 +528,10 @@ sched_get_condition_with_rev (const_rtx
src = SET_SRC (pc_set (insn));
if (XEXP (src, 2) == pc_rtx)
- return XEXP (src, 0);
+ {
+ INSN_COND (insn) = XEXP (src, 0);
+ return XEXP (src, 0);
+ }
else if (XEXP (src, 1) == pc_rtx)
{
rtx cond = XEXP (src, 0);
@@ -522,6 +542,8 @@ sched_get_condition_with_rev (const_rtx
if (rev)
*rev = true;
+ INSN_COND (insn) = cond;
+ INSN_REVERSE_COND (insn) = true;
return cond;
}
@@ -2841,6 +2863,8 @@ sched_analyze_insn (struct deps_desc *de
}
else
{
+ regset_head set_or_clobbered;
+
EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
{
struct deps_reg *reg_last = &deps->reg_last[i];
@@ -2871,6 +2895,21 @@ sched_analyze_insn (struct deps_desc *de
}
}
+ INIT_REG_SET (&set_or_clobbered);
+ bitmap_ior (&set_or_clobbered, reg_pending_clobbers, reg_pending_sets);
+ EXECUTE_IF_SET_IN_REG_SET (&set_or_clobbered, 0, i, rsi)
+ {
+ struct deps_reg *reg_last = &deps->reg_last[i];
+ rtx list;
+ for (list = reg_last->uses; list; list = XEXP (list, 1))
+ {
+ rtx other = XEXP (list, 0);
+ if (INSN_COND (other) != const_true_rtx
+ && refers_to_regno_p (i, i + 1, INSN_COND (other), NULL))
+ INSN_COND (other) = const_true_rtx;
+ }
+ }
+
/* If the current insn is conditional, we can't free any
of the lists. */
if (sched_has_condition_p (insn))
@@ -3245,6 +3284,10 @@ deps_analyze_insn (struct deps_desc *dep
if (sched_deps_info->start_insn)
sched_deps_info->start_insn (insn);
+ /* Record the condition for this insn. */
+ if (NONDEBUG_INSN_P (insn))
+ sched_get_condition_with_rev (insn, NULL);
+
if (NONJUMP_INSN_P (insn) || DEBUG_INSN_P (insn) || JUMP_P (insn))
{
/* Make each JUMP_INSN (but not a speculative check)
Index: gcc/sched-int.h
===================================================================
--- gcc.orig/sched-int.h
+++ gcc/sched-int.h
@@ -716,6 +716,17 @@ struct _haifa_deps_insn_data
search in 'forw_deps'. */
deps_list_t resolved_forw_deps;
+ /* If the insn is conditional (either through COND_EXEC, or because
+ it is a conditional branch), this records the condition. NULL
+ for insns that haven't been seen yet or don't have a condition;
+ const_true_rtx to mark an insn without a condition, or with a
+ condition that has been clobbered by a subsequent insn. */
+ rtx cond;
+
+ /* True if the condition in 'cond' should be reversed to get the actual
+ condition. */
+ unsigned int reverse_cond : 1;
+
/* Some insns (e.g. call) are not allowed to move across blocks. */
unsigned int cant_move : 1;
};
@@ -891,6 +902,8 @@ extern VEC(haifa_deps_insn_data_def, hea
#define INSN_RESOLVED_FORW_DEPS(INSN) (HDID (INSN)->resolved_forw_deps)
#define INSN_HARD_BACK_DEPS(INSN) (HDID (INSN)->hard_back_deps)
#define INSN_SPEC_BACK_DEPS(INSN) (HDID (INSN)->spec_back_deps)
+#define INSN_COND(INSN) (HDID (INSN)->cond)
+#define INSN_REVERSE_COND(INSN) (HDID (INSN)->reverse_cond)
#define CANT_MOVE(INSN) (HDID (INSN)->cant_move)
#define CANT_MOVE_BY_LUID(LUID) (VEC_index (haifa_deps_insn_data_def, h_d_i_d, \
LUID)->cant_move)
next prev parent reply other threads:[~2011-05-10 15:38 UTC|newest]
Thread overview: 99+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-10 15:36 The TI C6X port Bernd Schmidt
2011-05-10 15:38 ` C6X port 1/11: Reorganize schedule_block Bernd Schmidt
2011-05-10 15:40 ` C6X port 2/11: Use a structure for schedule_block variables Bernd Schmidt
2011-05-10 15:41 ` C6X port 3/11: Cache dependency costs Bernd Schmidt
2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
2011-05-11 9:14 ` Richard Sandiford
2011-05-11 11:24 ` Bernd Schmidt
2011-05-25 10:16 ` Hans-Peter Nilsson
2011-05-10 15:54 ` Bernd Schmidt [this message]
2011-05-11 12:26 ` C6X port 5/11: Track predication conditions more accurately Alexander Monakov
2011-05-12 18:31 ` Bernd Schmidt
2011-05-31 20:34 ` Steve Ellcey
[not found] ` <4DE5489F.4020005@hotbox.ru>
2011-06-01 8:19 ` Andrey Belevantsev
2011-06-01 15:40 ` Steve Ellcey
2011-06-02 11:30 ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Alexander Monakov
2011-06-02 11:35 ` Initialize INSN_COND Bernd Schmidt
2011-06-03 17:44 ` Alexander Monakov
2011-06-03 17:50 ` Bernd Schmidt
2011-06-07 17:40 ` Alexander Monakov
2011-06-07 18:11 ` Gary Funck
2011-06-07 18:28 ` Gary Funck
2011-06-07 18:35 ` Gary Funck
2011-06-07 18:56 ` Alexander Monakov
2011-06-07 20:45 ` Bernd Schmidt
2011-06-02 22:30 ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Steve Ellcey
2011-06-03 17:38 ` Steve Ellcey
2011-06-03 18:04 ` Steve Ellcey
2011-05-10 16:16 ` C6X port 6/11: REG_WORDS_BIG_ENDIAN Bernd Schmidt
2011-05-10 16:51 ` C6X port 8/11: A new FUNCTION_ARG macro Bernd Schmidt
2011-05-10 18:55 ` Joseph S. Myers
2011-05-12 18:20 ` Bernd Schmidt
2011-05-17 7:19 ` Paolo Bonzini
2011-05-27 17:40 ` Bernd Schmidt
2011-05-27 23:26 ` Paolo Bonzini
2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
2011-05-16 18:35 ` Bernd Schmidt
2011-05-25 10:27 ` Hans-Peter Nilsson
2011-05-25 12:03 ` Bernd Schmidt
2011-05-25 14:22 ` Hans-Peter Nilsson
2011-05-26 13:51 ` Bernd Schmidt
2011-05-10 16:56 ` C6X port 11/11: Testcases Bernd Schmidt
2011-07-15 10:06 ` Bernd Schmidt
2011-07-15 12:48 ` H.J. Lu
2011-07-15 12:50 ` Bernd Schmidt
2011-07-15 18:23 ` Mike Stump
2011-05-10 17:02 ` C6X port 10/11: The port Bernd Schmidt
2011-05-10 22:51 ` Joseph S. Myers
2011-05-13 13:59 ` Bernd Schmidt
2011-05-13 15:52 ` Joseph S. Myers
2011-05-13 16:00 ` Bernd Schmidt
2011-05-13 16:08 ` Joseph S. Myers
2011-05-16 18:45 ` Bernd Schmidt
2011-06-16 21:45 ` Joseph S. Myers
2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
2011-05-11 12:18 ` Bernd Schmidt
2011-05-11 12:21 ` Joseph S. Myers
2011-05-13 14:57 ` C6X port 13/11: MAINTAINERS Bernd Schmidt
2011-05-22 18:26 ` Gerald Pfeifer
2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
2011-05-13 15:23 ` Joseph S. Myers
2011-05-13 18:24 ` Bernd Schmidt
2011-05-25 14:00 ` H.J. Lu
2011-05-25 14:20 ` Bernd Schmidt
2011-05-25 14:26 ` H.J. Lu
2011-05-25 14:29 ` Bernd Schmidt
2011-05-25 15:14 ` Jakub Jelinek
2011-05-25 17:28 ` H.J. Lu
2011-05-25 17:30 ` Bernd Schmidt
2011-05-17 7:20 ` Paolo Bonzini
2011-05-24 10:33 ` Ian Lance Taylor
2011-05-26 12:56 ` Bernd Schmidt
2011-05-27 6:23 ` Jack Howarth
2011-05-27 9:59 ` Bernd Schmidt
2011-05-13 14:26 ` C6X port 12/11: htdocs Bernd Schmidt
2011-05-13 15:53 ` Joseph S. Myers
2011-05-13 16:28 ` Bernd Schmidt
2011-05-14 0:53 ` Gerald Pfeifer
2011-05-23 10:26 ` The TI C6X port Bernd Schmidt
2011-05-25 7:15 ` Vladimir Makarov
2011-05-27 16:33 ` Bernd Schmidt
2011-07-13 10:26 ` Bernd Schmidt
2011-05-23 10:33 ` Ping: C6X miscellaneous new hooks Bernd Schmidt
2011-05-23 10:44 ` Ping: C6X libgcc changes Bernd Schmidt
2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
2011-06-06 11:26 ` Bernd Schmidt
2011-06-14 11:18 ` Bernd Schmidt
2011-06-19 1:10 ` Richard Henderson
2011-06-27 10:20 ` Bernd Schmidt
2011-07-07 22:32 ` Bernd Schmidt
2011-07-07 22:36 ` Richard Henderson
2011-07-07 22:37 ` Richard Henderson
2011-06-14 21:33 ` Vladimir Makarov
2011-07-14 12:15 ` Bernd Schmidt
2011-06-06 12:54 ` Gerald Pfeifer
2011-06-06 13:02 ` Bernd Schmidt
2011-07-11 11:03 ` Bernd Schmidt
2011-07-11 16:05 ` Mike Stump
2011-07-11 16:24 ` Gerald Pfeifer
2011-07-15 9:42 ` Bernd Schmidt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DC95BA3.504@codesourcery.com \
--to=bernds@codesourcery.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).