diff options
author | Francisco Jerez <currojerez@riseup.net> | 2017-05-22 18:26:23 -0700 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2017-05-22 18:26:23 -0700 |
commit | 734d236b97d8e6b6f79b0cdc849124908883daa3 (patch) | |
tree | 3c9980812287c9c92fae86ebaf8faaca499eb321 | |
parent | d5579d42f1d45c0cc669aa623f7c70d36a92ed1c (diff) |
util/ra: Conflict-aware round-robin heuristic to reduce likelihood of false dependencies.for-kayden
-rw-r--r-- | src/util/register_allocate.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/util/register_allocate.c b/src/util/register_allocate.c index 8af93c0406c..035993db48a 100644 --- a/src/util/register_allocate.c +++ b/src/util/register_allocate.c @@ -563,7 +563,8 @@ ra_select(struct ra_graph *g) */ for (ri = 0; ri < g->regs->count; ri++) { r = (start_search_reg + ri) % g->regs->count; - if (!reg_belongs_to_class(r, c)) + if (!reg_belongs_to_class(r, c) || + BITSET_TEST(g->regs->regs[r].conflicts, start_search_reg)) continue; /* Check if any of our neighbors conflict with this register choice. */ @@ -600,8 +601,11 @@ ra_select(struct ra_graph *g) * dense packing strategy. */ if (g->regs->round_robin && - g->stack_count - 1 <= g->stack_optimistic_start) - start_search_reg = r + 1; + g->stack_count - 1 <= g->stack_optimistic_start) { + for (start_search_reg = r; + BITSET_TEST(g->regs->regs[r].conflicts, start_search_reg); + start_search_reg++); + } } return true; |