r600/sb: use different stacks for tracking lds and queue usage.
authorDave Airlie <airlied@redhat.com>
Wed, 10 Jan 2018 05:49:16 +0000 (05:49 +0000)
committerDave Airlie <airlied@redhat.com>
Thu, 18 Jan 2018 03:38:09 +0000 (03:38 +0000)
The normal ssa renumbering isn't sufficient for LDS queue access,
this uses two stacks, one for the lds queue, and one for the
lds r/w ordering.

The LDS oq values are incremented in their use in a linear
fashion.
The LDS rw values are incremented in their definitions and used
in the next lds operation to ensure reordering doesn't occur.

Acked-By: Roland Scheidegger <sroland@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/sb/sb_pass.h
src/gallium/drivers/r600/sb/sb_ssa_builder.cpp

index b581803..a21b0bf 100644 (file)
@@ -634,7 +634,11 @@ class ssa_rename : public vpass {
        typedef sb_map<value*, unsigned> def_map;
 
        def_map def_count;
+       def_map lds_oq_count;
+       def_map lds_rw_count;
        std::stack<def_map> rename_stack;
+       std::stack<def_map> rename_lds_oq_stack;
+       std::stack<def_map> rename_lds_rw_stack;
 
        typedef std::map<uint32_t, value*> val_map;
        val_map values;
index 3ad628b..5cd41c2 100644 (file)
@@ -132,6 +132,8 @@ bool ssa_prepare::visit(depart_node& n, bool enter) {
 
 int ssa_rename::init() {
        rename_stack.push(def_map());
+       rename_lds_oq_stack.push(def_map());
+       rename_lds_rw_stack.push(def_map());
        return 0;
 }
 
@@ -287,8 +289,16 @@ void ssa_rename::pop() {
 value* ssa_rename::rename_use(node *n, value* v) {
        if (v->version)
                return v;
+       unsigned index;
+       if (v->is_lds_access()) {
+               index = get_index(rename_lds_rw_stack.top(), v);
+       } else if (v->is_lds_oq()) {
+               index = new_index(lds_oq_count, v);
+               set_index(rename_lds_oq_stack.top(), v, index);
+       } else {
+               index = get_index(rename_stack.top(), v);
+       }
 
-       unsigned index = get_index(rename_stack.top(), v);
        v = sh.get_value_version(v, index);
 
        // if (alu) instruction is predicated and source arg comes from psi node
@@ -313,8 +323,15 @@ value* ssa_rename::rename_use(node *n, value* v) {
 }
 
 value* ssa_rename::rename_def(node *n, value* v) {
-       unsigned index = new_index(def_count, v);
-       set_index(rename_stack.top(), v, index);
+       unsigned index;
+
+       if (v->is_lds_access()) {
+               index = new_index(lds_rw_count, v);
+               set_index(rename_lds_rw_stack.top(), v, index);
+       } else {
+               index = new_index(def_count, v);
+               set_index(rename_stack.top(), v, index);
+       }
        value *r = sh.get_value_version(v, index);
        return r;
 }