From: Roman Zhuykov Date: Fri, 20 Dec 2019 15:05:12 +0000 (+0000) Subject: modulo-sched: backport PR92591 fix from mainline X-Git-Tag: releases/gcc-9.3.0~304 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=944838ac15df56068c5925ed8f369d28bc6cab0f;p=thirdparty%2Fgcc.git modulo-sched: backport PR92591 fix from mainline 2019-12-20 Roman Zhuykov 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. * params.def (sms-dfa-history): Limit to 16. gcc/testsuite: PR rtl-optimization/92591 * gcc.dg/pr92951-1.c: New test. * gcc.dg/pr92951-2.c: New test. From-SVN: r279642 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e01e58d3a0a4..9b5b4a0cf5b9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2019-12-20 Roman Zhuykov + + Backport from mainline + 2019-12-13 Roman Zhuykov + + PR rtl-optimization/92591 + * modulo-sched.c (ps_add_node_check_conflicts): Improve checking + for history > 0 case. + * params.def (sms-dfa-history): Limit to 16. + 2019-12-19 Georg-Johann Lay Backport support for some AVR devices from avrxmega3 family diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index 9954ea5cfa14..059b5440123d 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -3201,7 +3201,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 @@ -3209,23 +3209,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/params.def b/gcc/params.def index 813dc55d94c6..8e4887e50a2f 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -419,7 +419,7 @@ DEFPARAM(PARAM_SMS_MIN_SC, DEFPARAM(PARAM_SMS_DFA_HISTORY, "sms-dfa-history", "The number of cycles the swing modulo scheduler considers when checking conflicts using DFA.", - 0, 0, 0) + 0, 0, 16) DEFPARAM(PARAM_SMS_LOOP_AVERAGE_COUNT_THRESHOLD, "sms-loop-average-count-threshold", "A threshold on the average loop count considered by the swing modulo scheduler.", diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dcee8381c861..2b340a38ff27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2019-12-20 Roman Zhuykov + + Backport from mainline + 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-17 Andreas Krebbel Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr92951-1.c b/gcc/testsuite/gcc.dg/pr92951-1.c new file mode 100644 index 000000000000..0f9365d06e5f --- /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 000000000000..04a80924650b --- /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"