SMS: Prevent the creation of reg-moves for definitions with MODE_CC
From-SVN: r182786
This commit is contained in:
parent
ba768e1850
commit
8b61e8631a
4 changed files with 68 additions and 1 deletions
|
@ -1,3 +1,9 @@
|
|||
2012-01-02 Revital Eres <revital.eres@linaro.org>
|
||||
|
||||
* ddg.c (def_has_ccmode_p): New function.
|
||||
(add_cross_iteration_register_deps,
|
||||
create_ddg_dep_from_intra_loop_link): Call it.
|
||||
|
||||
2012-01-02 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR other/51679
|
||||
|
|
22
gcc/ddg.c
22
gcc/ddg.c
|
@ -166,6 +166,24 @@ autoinc_var_is_used_p (rtx def_insn, rtx use_insn)
|
|||
return false;
|
||||
}
|
||||
|
||||
/* Return true if one of the definitions in INSN has MODE_CC. Otherwise
|
||||
return false. */
|
||||
static bool
|
||||
def_has_ccmode_p (rtx insn)
|
||||
{
|
||||
df_ref *def;
|
||||
|
||||
for (def = DF_INSN_DEFS (insn); *def; def++)
|
||||
{
|
||||
enum machine_mode mode = GET_MODE (DF_REF_REG (*def));
|
||||
|
||||
if (GET_MODE_CLASS (mode) == MODE_CC)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Computes the dependence parameters (latency, distance etc.), creates
|
||||
a ddg_edge and adds it to the given DDG. */
|
||||
static void
|
||||
|
@ -202,6 +220,7 @@ create_ddg_dep_from_intra_loop_link (ddg_ptr g, ddg_node_ptr src_node,
|
|||
whose register has multiple defs in the loop. */
|
||||
if (flag_modulo_sched_allow_regmoves
|
||||
&& (t == ANTI_DEP && dt == REG_DEP)
|
||||
&& !def_has_ccmode_p (dest_node->insn)
|
||||
&& !autoinc_var_is_used_p (dest_node->insn, src_node->insn))
|
||||
{
|
||||
rtx set;
|
||||
|
@ -335,7 +354,8 @@ add_cross_iteration_register_deps (ddg_ptr g, df_ref last_def)
|
|||
if (DF_REF_ID (last_def) != DF_REF_ID (first_def)
|
||||
|| !flag_modulo_sched_allow_regmoves
|
||||
|| JUMP_P (use_node->insn)
|
||||
|| autoinc_var_is_used_p (DF_REF_INSN (last_def), use_insn))
|
||||
|| autoinc_var_is_used_p (DF_REF_INSN (last_def), use_insn)
|
||||
|| def_has_ccmode_p (DF_REF_INSN (last_def)))
|
||||
create_ddg_dep_no_link (g, use_node, first_def_node, ANTI_DEP,
|
||||
REG_DEP, 1);
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2012-01-02 Revital Eres <revital.eres@linaro.org>
|
||||
|
||||
* gcc.dg/sms-11.c: New file.
|
||||
|
||||
2012-01-02 Tobias Burnus <burnus@net-b.de>
|
||||
|
||||
PR fortran/51682
|
||||
|
|
37
gcc/testsuite/gcc.dg/sms-11.c
Normal file
37
gcc/testsuite/gcc.dg/sms-11.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O2 -fmodulo-sched -fmodulo-sched-allow-regmoves -fdump-rtl-sms" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
float out[4][4] = { 6, 6, 7, 5, 6, 7, 5, 5, 6, 4, 4, 4, 6, 2, 3, 4 };
|
||||
|
||||
void
|
||||
invert (void)
|
||||
{
|
||||
int i, j, k = 0, swap;
|
||||
float tmp[4][4] = { 5, 6, 7, 5, 6, 7, 5, 5, 4, 4, 4, 4, 3, 2, 3, 4 };
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
for (j = i + 1; j < 4; j++)
|
||||
if (tmp[j][i] > tmp[i][i])
|
||||
swap = j;
|
||||
|
||||
if (swap != i)
|
||||
tmp[i][k] = tmp[swap][k];
|
||||
}
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
for (j = 0; j < 4; j++)
|
||||
if (tmp[i][j] != out[i][j])
|
||||
abort ();
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
invert ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* { dg-final { cleanup-rtl-dump "sms" } } */
|
Loading…
Add table
Reference in a new issue