aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2020-02-11 18:16:40 +0100
committerHans-Peter Nilsson <hp@axis.com>2020-02-11 18:16:40 +0100
commita5e3dd5d2e0073f585fa97d6b961752432c3d122 (patch)
tree4b74cbfe4e786b900513a0e9c6a27e81fc14a10e
parentc0e05505ffd58d3d0ed9c22e0cc6b954e25c8b1b (diff)
downloadgcc-a5e3dd5d2e0073f585fa97d6b961752432c3d122.zip
gcc-a5e3dd5d2e0073f585fa97d6b961752432c3d122.tar.gz
gcc-a5e3dd5d2e0073f585fa97d6b961752432c3d122.tar.bz2
regalloc/debug: fix buggy print_hard_reg_set
* ira-conflicts.c (print_hard_reg_set): Correct output for sets including FIRST_PSEUDO_REGISTER - 1. * ira-color.c (print_hard_reg_set): Ditto. Before, for a target with FIRST_PSEUDO_REGISTER 20, you'd get "19-18" for (1<<19). For (1<<18)|(1<<19), you'd get "18". I was using ira-conflicts.c:print_hard_reg_set with a local patch to gdbinit.in in a debug-session, and noticed the erroneous output. I see there's an almost identical function in ira-color.c and on top of that, there's another function by the same name and with similar semantics in sel-sched-dump.c, but the last one doesn't try to print ranges.
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ira-color.c22
-rw-r--r--gcc/ira-conflicts.c22
3 files changed, 30 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa4e59e..7ddb6c3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2020-02-11 Hans-Peter Nilsson <hp@axis.com>
+
+ * ira-conflicts.c (print_hard_reg_set): Correct output for sets
+ including FIRST_PSEUDO_REGISTER - 1.
+ * ira-color.c (print_hard_reg_set): Ditto.
+
2020-02-11 Stam Markianos-Wright <stam.markianos-wright@arm.com>
* config/arm/arm-builtins.c (enum arm_type_qualifiers):
diff --git a/gcc/ira-color.c b/gcc/ira-color.c
index 444cb1e..0bcc804 100644
--- a/gcc/ira-color.c
+++ b/gcc/ira-color.c
@@ -480,24 +480,26 @@ first_common_ancestor_node (allocno_hard_regs_node_t first,
static void
print_hard_reg_set (FILE *f, HARD_REG_SET set, bool new_line_p)
{
- int i, start;
+ int i, start, end;
- for (start = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ for (start = end = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{
- if (TEST_HARD_REG_BIT (set, i))
+ bool reg_included = TEST_HARD_REG_BIT (set, i);
+
+ if (reg_included)
{
- if (i == 0 || ! TEST_HARD_REG_BIT (set, i - 1))
+ if (start == -1)
start = i;
+ end = i;
}
- if (start >= 0
- && (i == FIRST_PSEUDO_REGISTER - 1 || ! TEST_HARD_REG_BIT (set, i)))
+ if (start >= 0 && (!reg_included || i == FIRST_PSEUDO_REGISTER - 1))
{
- if (start == i - 1)
+ if (start == end)
fprintf (f, " %d", start);
- else if (start == i - 2)
- fprintf (f, " %d %d", start, start + 1);
+ else if (start == end + 1)
+ fprintf (f, " %d %d", start, end);
else
- fprintf (f, " %d-%d", start, i - 1);
+ fprintf (f, " %d-%d", start, end);
start = -1;
}
}
diff --git a/gcc/ira-conflicts.c b/gcc/ira-conflicts.c
index 11d3a86..0220e72 100644
--- a/gcc/ira-conflicts.c
+++ b/gcc/ira-conflicts.c
@@ -611,25 +611,27 @@ build_conflicts (void)
static void
print_hard_reg_set (FILE *file, const char *title, HARD_REG_SET set)
{
- int i, start;
+ int i, start, end;
fputs (title, file);
- for (start = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+ for (start = end = -1, i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{
- if (TEST_HARD_REG_BIT (set, i))
+ bool reg_included = TEST_HARD_REG_BIT (set, i);
+
+ if (reg_included)
{
- if (i == 0 || ! TEST_HARD_REG_BIT (set, i - 1))
+ if (start == -1)
start = i;
+ end = i;
}
- if (start >= 0
- && (i == FIRST_PSEUDO_REGISTER - 1 || ! TEST_HARD_REG_BIT (set, i)))
+ if (start >= 0 && (!reg_included || i == FIRST_PSEUDO_REGISTER - 1))
{
- if (start == i - 1)
+ if (start == end)
fprintf (file, " %d", start);
- else if (start == i - 2)
- fprintf (file, " %d %d", start, start + 1);
+ else if (start == end + 1)
+ fprintf (file, " %d %d", start, end);
else
- fprintf (file, " %d-%d", start, i - 1);
+ fprintf (file, " %d-%d", start, end);
start = -1;
}
}