diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-01-09 09:03:45 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-01-09 09:03:45 +0100 |
commit | 3a123ed751451a4f2aebbe74226fd92272da4477 (patch) | |
tree | 48d8bdcdf51e28737bb09e301b3fc04ef341f348 /gcc | |
parent | 5190f1f98d7c14c0a0bf4f003da0f3a38b31ad14 (diff) | |
download | gcc-3a123ed751451a4f2aebbe74226fd92272da4477.zip gcc-3a123ed751451a4f2aebbe74226fd92272da4477.tar.gz gcc-3a123ed751451a4f2aebbe74226fd92272da4477.tar.bz2 |
re PR target/83507 (ICE in internal_dfa_insn_code_* for powerpc targets)
PR target/83507
* modulo-sched.c (schedule_reg_moves): Punt if we'd need to move
hard registers. Formatting fixes.
* gcc.dg/sms-13.c: New test.
From-SVN: r256368
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/modulo-sched.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/sms-13.c | 32 |
4 files changed, 48 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a7736f..084b0d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2018-01-09 Jakub Jelinek <jakub@redhat.com> + PR target/83507 + * modulo-sched.c (schedule_reg_moves): Punt if we'd need to move + hard registers. Formatting fixes. + PR preprocessor/83722 * gcc.c (try_generate_repro): Pass &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1] rather than diff --git a/gcc/modulo-sched.c b/gcc/modulo-sched.c index d5ad2334..9a27365 100644 --- a/gcc/modulo-sched.c +++ b/gcc/modulo-sched.c @@ -687,9 +687,9 @@ schedule_reg_moves (partial_schedule_ptr ps) rtx set = single_set (u->insn); /* Skip instructions that do not set a register. */ - if ((set && !REG_P (SET_DEST (set)))) + if (set && !REG_P (SET_DEST (set))) continue; - + /* Compute the number of reg_moves needed for u, by looking at life ranges started at u (excluding self-loops). */ distances[0] = distances[1] = false; @@ -743,7 +743,10 @@ schedule_reg_moves (partial_schedule_ptr ps) first_move += ps->g->num_nodes; /* Generate each move. */ - old_reg = prev_reg = SET_DEST (single_set (u->insn)); + old_reg = prev_reg = SET_DEST (set); + if (HARD_REGISTER_P (old_reg)) + return false; + for (i_reg_move = 0; i_reg_move < nreg_moves; i_reg_move++) { ps_reg_move_info *move = ps_reg_move (ps, first_move + i_reg_move); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 034c30f..c73af5e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ +2018-01-09 Jakub Jelinek <jakub@redhat.com> + + PR target/83507 + * gcc.dg/sms-13.c: New test. + 2018-01-08 Steven G. Kargl <kargl@gcc.gnu.org> - PR Fortran/83741 + PR fortran/83741 * gfortran.dg/allocate_assumed_charlen_3.f90: New test. 2018-01-08 Chih-Mao Chen <pkmx.tw@gmail.com> diff --git a/gcc/testsuite/gcc.dg/sms-13.c b/gcc/testsuite/gcc.dg/sms-13.c new file mode 100644 index 0000000..cd7bb62 --- /dev/null +++ b/gcc/testsuite/gcc.dg/sms-13.c @@ -0,0 +1,32 @@ +/* PR target/83507 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fmodulo-sched -fno-tree-ter -fno-tree-coalesce-vars" } */ + +void +foo (unsigned short int x, unsigned char y) +{ + unsigned char *a = &y; + unsigned short int b; + int c; + + while (y < 3) + { + if (x != 0) + ++y; + ++y; + } + + for (c = 0; c < 5; ++c) + { + int d = 1; + d += b > x; + y &= d; + } + + do + { + c += y; + x = c; + } + while (x != 0); +} |