summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2017-05-22 18:26:23 -0700
committerFrancisco Jerez <currojerez@riseup.net>2017-05-22 18:26:23 -0700
commit734d236b97d8e6b6f79b0cdc849124908883daa3 (patch)
tree3c9980812287c9c92fae86ebaf8faaca499eb321
parentd5579d42f1d45c0cc669aa623f7c70d36a92ed1c (diff)
util/ra: Conflict-aware round-robin heuristic to reduce likelihood of false dependencies.for-kayden
-rw-r--r--src/util/register_allocate.c10
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;