diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2017-04-18 18:49:19 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-04-18 12:49:19 -0600 |
commit | f380f6082268c9e88fe635b198d9e6e735f07c5f (patch) | |
tree | 86328766c42bef50f00c651acba10464363486b4 | |
parent | 7754ee35771c049bf48b1bf8d8da4c5d19209866 (diff) | |
download | gcc-f380f6082268c9e88fe635b198d9e6e735f07c5f.zip gcc-f380f6082268c9e88fe635b198d9e6e735f07c5f.tar.gz gcc-f380f6082268c9e88fe635b198d9e6e735f07c5f.tar.bz2 |
re PR rtl-optimization/80357 (ICE in model_update_limit_points_in_group, at haifa-sched.c:1982 on powerpc64le-linux-gnu)
gcc/
PR rtl-optimization/80357
* haifa-sched.c (tmp_bitmap): New variable.
(model_recompute): Handle duplicate use records.
(alloc_global_sched_pressure_data): Initialize tmp_bitmap.
(free_global_sched_pressure_data): Free it.
gcc/testsuite/
PR rtl-optimization/80357
* gcc.c-torture/compile/pr80357.c: New test.
From-SVN: r246980
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/haifa-sched.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr80357.c | 18 |
4 files changed, 40 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 621ec58..0278e49 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-04-18 Richard Sandiford <richard.sandiford@arm.com> + + PR rtl-optimization/80357 + * haifa-sched.c (tmp_bitmap): New variable. + (model_recompute): Handle duplicate use records. + (alloc_global_sched_pressure_data): Initialize tmp_bitmap. + (free_global_sched_pressure_data): Free it. + 2017-04-18 Bernd Edlinger <bernd.edlinger@hotmail.de> Revert: diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 07de1bb..0ebf110 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -930,6 +930,9 @@ static bitmap saved_reg_live; /* Registers mentioned in the current region. */ static bitmap region_ref_regs; +/* Temporary bitmap used for SCHED_PRESSURE_MODEL. */ +static bitmap tmp_bitmap; + /* Effective number of available registers of a given class (see comment in sched_pressure_start_bb). */ static int sched_class_regs_num[N_REG_CLASSES]; @@ -2135,10 +2138,11 @@ model_recompute (rtx_insn *insn) registers that will be born in the range [model_curr_point, POINT). */ num_uses = 0; num_pending_births = 0; + bitmap_clear (tmp_bitmap); for (use = INSN_REG_USE_LIST (insn); use != NULL; use = use->next_insn_use) { new_last = model_last_use_except (use); - if (new_last < point) + if (new_last < point && bitmap_set_bit (tmp_bitmap, use->regno)) { gcc_assert (num_uses < ARRAY_SIZE (uses)); uses[num_uses].last_use = new_last; @@ -7241,6 +7245,8 @@ alloc_global_sched_pressure_data (void) saved_reg_live = BITMAP_ALLOC (NULL); region_ref_regs = BITMAP_ALLOC (NULL); } + if (sched_pressure == SCHED_PRESSURE_MODEL) + tmp_bitmap = BITMAP_ALLOC (NULL); /* Calculate number of CALL_SAVED_REGS and FIXED_REGS in register classes that we calculate register pressure for. */ @@ -7274,6 +7280,8 @@ free_global_sched_pressure_data (void) BITMAP_FREE (region_ref_regs); BITMAP_FREE (saved_reg_live); } + if (sched_pressure == SCHED_PRESSURE_MODEL) + BITMAP_FREE (tmp_bitmap); BITMAP_FREE (curr_reg_live); free (sched_regno_pressure_class); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cf5d0be..05c5e23 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-04-18 Richard Sandiford <richard.sandiford@arm.com> + + PR rtl-optimization/80357 + * gcc.c-torture/compile/pr80357.c: New test. + 2017-04-18 Jeff Law <law@redhat.com> PR middle-end/80422 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr80357.c b/gcc/testsuite/gcc.c-torture/compile/pr80357.c new file mode 100644 index 0000000..a3c6ab0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr80357.c @@ -0,0 +1,18 @@ +typedef char a; +a b, c; +int d, e; +void f(void *g) { *(volatile int *)g; } +void j() { + a h, i; + for (; b; b += 2) { + d = b; + i = i >> b; + if (i) + continue; + f(&c + (b >> 2)); + h = 0; + for (; h < 8 / 2; h++) + if (i << h) + e = 0; + } +} |