From faab8a70f2c40758c8bb15303098f3b824bafb60 Mon Sep 17 00:00:00 2001 From: Roman Zhuykov Date: Fri, 13 Dec 2019 17:33:38 +0000 Subject: [PATCH] modulo-sched: fix branch rescheduling issue (PR92591) PR rtl-optimization/92591 * modulo-sched.c (ps_add_node_check_conflicts): Improve checking for history > 0 case. testsuite: PR rtl-optimization/92591 * gcc.dg/pr92951-1.c: New test. * gcc.dg/pr92951-2.c: New test. From-SVN: r279377 --- gcc/ChangeLog | 7 ++++++ gcc/modulo-sched.c | 39 ++++++++++++++++++++------------ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gcc.dg/pr92951-1.c | 11 +++++++++ gcc/testsuite/gcc.dg/pr92951-2.c | 5 ++++ 5 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr92951-1.c create mode 100644 gcc/testsuite/gcc.dg/pr92951-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 56d05cc4986..f8a56a4c289 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-12-13 Roman Zhuykov + + PR rtl-optimization/92591 + * modulo-sched.c (ps_add_node_check_conflicts): Improve checking + for history > 0 case. + 2019-12-13 Roman Zhuykov * modulo-sched.c (sms_schedule): Use param_sms_max_ii_factor @@ -8,6 +14,7 @@ 2019-12-13 Roman Zhuykov + PR rtl-optimization/90001 * ddg.c (create_ddg): Init max_dist array for each node. (free_ddg): Free max_dist array. (create_ddg_edge): Use bool field instead of aux union. diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 2dc9af70930..ddc2874fc7d 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -3197,7 +3197,7 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n, int c, sbitmap must_precede, sbitmap must_follow) { - int has_conflicts = 0; + int i, first, amount, has_conflicts = 0; ps_insn_ptr ps_i; /* First add the node to the PS, if this succeeds check for @@ -3205,23 +3205,32 @@ ps_add_node_check_conflicts (partial_schedule_ptr ps, int n, if (! (ps_i = add_node_to_ps (ps, n, c, must_precede, must_follow))) return NULL; /* Failed to insert the node at the given cycle. */ - has_conflicts = ps_has_conflicts (ps, c, c) - || (ps->history > 0 - && ps_has_conflicts (ps, - c - ps->history, - c + ps->history)); - - /* Try different issue slots to find one that the given node can be - scheduled in without conflicts. */ - while (has_conflicts) + while (1) { + has_conflicts = ps_has_conflicts (ps, c, c); + if (ps->history > 0 && !has_conflicts) + { + /* Check all 2h+1 intervals, starting from c-2h..c up to c..2h, + but not more than ii intervals. */ + first = c - ps->history; + amount = 2 * ps->history + 1; + if (amount > ps->ii) + amount = ps->ii; + for (i = first; i < first + amount; i++) + { + has_conflicts = ps_has_conflicts (ps, + i - ps->history, + i + ps->history); + if (has_conflicts) + break; + } + } + if (!has_conflicts) + break; + /* Try different issue slots to find one that the given node can be + scheduled in without conflicts. */ if (! ps_insn_advance_column (ps, ps_i, must_follow)) break; - has_conflicts = ps_has_conflicts (ps, c, c) - || (ps->history > 0 - && ps_has_conflicts (ps, - c - ps->history, - c + ps->history)); } if (has_conflicts) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7ea9f58c920..2a4d9a09b49 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-12-13 Roman Zhuykov + + PR rtl-optimization/92591 + * gcc.dg/pr92951-1.c: New test. + * gcc.dg/pr92951-2.c: New test. + 2019-12-13 Dennis Zhang * gcc.target/aarch64/pragma_cpp_predefs_2.c: Add tests for i8mm diff --git a/gcc/testsuite/gcc.dg/pr92951-1.c b/gcc/testsuite/gcc.dg/pr92951-1.c new file mode 100644 index 00000000000..0f9365d06e5 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr92951-1.c @@ -0,0 +1,11 @@ +/* PR rtl-optimization/92591 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fmodulo-sched -fweb -fno-dce -fno-ivopts -fno-sched-pressure -fno-tree-loop-distribute-patterns --param sms-dfa-history=1" } */ +/* { dg-additional-options "-mcpu=e500mc" { target { powerpc-*-* } } } */ + +void +wf (char *mr, int tc) +{ + while (tc-- > 0) + *mr++ = 0; +} diff --git a/gcc/testsuite/gcc.dg/pr92951-2.c b/gcc/testsuite/gcc.dg/pr92951-2.c new file mode 100644 index 00000000000..04a80924650 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr92951-2.c @@ -0,0 +1,5 @@ +/* PR rtl-optimization/92591 */ +/* { dg-do compile } */ +/* { dg-options "-Os -fmodulo-sched -fmodulo-sched-allow-regmoves --param sms-dfa-history=8" } */ + +#include "../gcc.c-torture/execute/pr61682.c" -- 2.30.2