From: Dave Airlie <airl...@redhat.com>

This has some hacks in it that in the end make heaven run
---
 src/gallium/drivers/r600/sb/sb_bc_builder.cpp  |  2 +-
 src/gallium/drivers/r600/sb/sb_bc_decoder.cpp  |  1 +
 src/gallium/drivers/r600/sb/sb_bc_finalize.cpp | 10 +++++++-
 src/gallium/drivers/r600/sb/sb_gcm.cpp         | 32 +++++++++++++++++---------
 src/gallium/drivers/r600/sb/sb_gvn.cpp         |  3 +++
 src/gallium/drivers/r600/sb/sb_liveness.cpp    |  4 ++++
 src/gallium/drivers/r600/sb/sb_pass.h          |  6 ++---
 src/gallium/drivers/r600/sb/sb_ra_checker.cpp  |  5 +++-
 src/gallium/drivers/r600/sb/sb_sched.cpp       |  4 ++--
 src/gallium/drivers/r600/sb/sb_ssa_builder.cpp |  4 +++-
 src/gallium/drivers/r600/sb/sb_valtable.cpp    |  2 +-
 11 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/r600/sb/sb_bc_builder.cpp 
b/src/gallium/drivers/r600/sb/sb_bc_builder.cpp
index ea91e197c0..40d950e857 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_builder.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_builder.cpp
@@ -398,7 +398,7 @@ int bc_builder::build_alu(alu_node* n) {
                        .LDS_OP((bc.op_ptr->opcode[1] >> 8) & 0xff)
                        .IDX_OFFSET_0((bc.lds_idx_offset >> 0) & 1)
                        .IDX_OFFSET_2((bc.lds_idx_offset >> 2) & 1)
-                       .DST_CHAN(bc.dst_chan)
+                       .DST_CHAN(0)
                        .IDX_OFFSET_3((bc.lds_idx_offset >> 3) & 1);
 
                return 0;
diff --git a/src/gallium/drivers/r600/sb/sb_bc_decoder.cpp 
b/src/gallium/drivers/r600/sb/sb_bc_decoder.cpp
index 1fa580e66d..823b927881 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_decoder.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_decoder.cpp
@@ -329,6 +329,7 @@ int bc_decoder::decode_alu(unsigned & i, bc_alu& bc) {
                        bc.src[2].sel = iw1.get_SRC2_SEL();
                        bc.src[2].rel = iw1.get_SRC2_REL();
                        bc.dst_chan = iw1.get_DST_CHAN();
+                       bc.dst_gpr = 0;
                        // TODO: clean up
                        for (size_t k = 0, e = r600_alu_op_table_size(); k != 
e; k++) {
                                if (((r600_alu_op_table[k].opcode[1] >> 8) & 
0xff) == iw1.get_LDS_OP()) {
diff --git a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp 
b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
index 099b295f18..5b202c3737 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_finalize.cpp
@@ -293,6 +293,10 @@ void bc_finalizer::finalize_alu_group(alu_group_node* g, 
node *prev_node) {
                unsigned slot = n->bc.slot;
                value *d = n->dst.empty() ? NULL : n->dst[0];
 
+               if (n->bc.op == LDS_OP1_LDS_READ_RET && !d) {
+                       n->remove();
+                       continue;
+               }
                if (d && d->is_special_reg()) {
                        assert((n->bc.op_ptr->flags & AF_MOVA) || 
d->is_geometry_emit() || d->is_lds_oq() || d->is_lds_access());
                        d = NULL;
@@ -339,7 +343,8 @@ void bc_finalizer::finalize_alu_group(alu_group_node* g, 
node *prev_node) {
                        insert_rv6xx_load_ar_workaround(g);
                }
        }
-       last->bc.last = 1;
+       if (last)
+               last->bc.last = 1;
 }
 
 bool bc_finalizer::finalize_alu_src(alu_group_node* g, alu_node* a, 
alu_group_node *prev) {
@@ -358,6 +363,9 @@ bool bc_finalizer::finalize_alu_src(alu_group_node* g, 
alu_node* a, alu_group_no
                assert(v);
 
                bc_alu_src &src = a->bc.src[si];
+
+               if (si >= 3)
+                       continue;
                sel_chan sc;
                src.rel = 0;
 
diff --git a/src/gallium/drivers/r600/sb/sb_gcm.cpp 
b/src/gallium/drivers/r600/sb/sb_gcm.cpp
index 7776a10fc8..c08648ba4a 100644
--- a/src/gallium/drivers/r600/sb/sb_gcm.cpp
+++ b/src/gallium/drivers/r600/sb/sb_gcm.cpp
@@ -158,18 +158,19 @@ void gcm::sched_early(container_node *n) {
        }
 }
 
-void gcm::td_schedule(bb_node *bb, node *n) {
+bool gcm::td_schedule(bb_node *bb, node *n) {
+       bool pushed_front = false;
        GCM_DUMP(
                sblog << "scheduling : ";
                dump::dump_op(n);
                sblog << "\n";
        );
-       td_release_uses(n->dst);
+       pushed_front = td_release_uses(n->dst);
 
        bb->push_back(n);
 
        op_map[n].top_bb = bb;
-
+       return pushed_front;
 }
 
 void gcm::td_sched_bb(bb_node* bb) {
@@ -181,8 +182,10 @@ void gcm::td_sched_bb(bb_node* bb) {
                for (sq_iterator N, I = ready.begin(), E = ready.end(); I != E;
                                I = N) {
                        N = I; ++N;
-                       td_schedule(bb, *I);
+                       bool pushed_front = td_schedule(bb, *I);
                        ready.erase(I);
+                       if (pushed_front)
+                               break;
                }
        }
 }
@@ -191,7 +194,7 @@ bool gcm::td_is_ready(node* n) {
        return uses[n] == 0;
 }
 
-void gcm::td_release_val(value *v) {
+bool gcm::td_release_val(value *v) {
 
        GCM_DUMP(
                sblog << "td checking uses: ";
@@ -199,6 +202,7 @@ void gcm::td_release_val(value *v) {
                sblog << "\n";
        );
 
+       bool pushed_front = false;
        for (uselist::iterator I = v->uses.begin(), E = v->uses.end(); I != E; 
++I) {
                node *op = *I;
                if (op->parent != &pending) {
@@ -220,23 +224,29 @@ void gcm::td_release_val(value *v) {
                        );
 
                        pending.remove_node(op);
-                       ready.push_back(op);
+                       if (op->produces_lds_oq() || op->consumes_lds_oq()) {
+                               ready.push_front(op);
+                               pushed_front = true;
+                       } else
+                               ready.push_back(op);
                }
        }
-
+       return pushed_front;
 }
 
-void gcm::td_release_uses(vvec& v) {
+bool gcm::td_release_uses(vvec& v) {
+       bool pushed_front = false;
        for (vvec::iterator I = v.begin(), E = v.end(); I != E; ++I) {
                value *v = *I;
                if (!v)
                        continue;
 
                if (v->is_rel())
-                       td_release_uses(v->mdef);
+                       pushed_front |= td_release_uses(v->mdef);
                else
-                       td_release_val(v);
+                       pushed_front |= td_release_val(v);
        }
+       return pushed_front;
 }
 
 void gcm::sched_late(container_node *n) {
@@ -637,7 +647,7 @@ void gcm::add_ready(node *n) {
        sched_queue_id sq = sh.get_queue_id(n);
        if (n->flags & NF_SCHEDULE_EARLY)
                bu_ready_early[sq].push_back(n);
-       else if (sq == SQ_ALU && n->is_copy_mov())
+       else if (sq == SQ_ALU && (n->is_copy_mov() || n->consumes_lds_oq() || 
n->produces_lds_oq()))
                bu_ready[sq].push_front(n);
        else if (n->is_alu_inst()) {
                alu_node *a = static_cast<alu_node*>(n);
diff --git a/src/gallium/drivers/r600/sb/sb_gvn.cpp 
b/src/gallium/drivers/r600/sb/sb_gvn.cpp
index caea4ec666..bf7b915e7a 100644
--- a/src/gallium/drivers/r600/sb/sb_gvn.cpp
+++ b/src/gallium/drivers/r600/sb/sb_gvn.cpp
@@ -133,6 +133,9 @@ bool gvn::visit(region_node& n, bool enter) {
 }
 
 bool gvn::process_src(value* &v, bool rewrite) {
+
+       if (v->is_lds_oq() || v->is_lds_access())
+               return false;
        if (!v->gvn_source)
                sh.vt.add_value(v);
 
diff --git a/src/gallium/drivers/r600/sb/sb_liveness.cpp 
b/src/gallium/drivers/r600/sb/sb_liveness.cpp
index 8ecc9a5987..2c52581054 100644
--- a/src/gallium/drivers/r600/sb/sb_liveness.cpp
+++ b/src/gallium/drivers/r600/sb/sb_liveness.cpp
@@ -217,6 +217,10 @@ void liveness::update_interferences() {
 }
 
 bool liveness::remove_val(value *v) {
+  if (v->is_lds_access()) {
+    v->flags &= ~VLF_DEAD;
+    return true;
+  }
        if (live.remove_val(v)) {
                v->flags &= ~VLF_DEAD;
                return true;
diff --git a/src/gallium/drivers/r600/sb/sb_pass.h 
b/src/gallium/drivers/r600/sb/sb_pass.h
index a21b0bf997..b62fbaedf9 100644
--- a/src/gallium/drivers/r600/sb/sb_pass.h
+++ b/src/gallium/drivers/r600/sb/sb_pass.h
@@ -278,9 +278,9 @@ private:
        void sched_early(container_node *n);
        void td_sched_bb(bb_node *bb);
        bool td_is_ready(node *n);
-       void td_release_uses(vvec &v);
-       void td_release_val(value *v);
-       void td_schedule(bb_node *bb, node *n);
+       bool td_release_uses(vvec &v);
+       bool td_release_val(value *v);
+       bool td_schedule(bb_node *bb, node *n);
 
        void sched_late(container_node *n);
        void bu_sched_bb(bb_node *bb);
diff --git a/src/gallium/drivers/r600/sb/sb_ra_checker.cpp 
b/src/gallium/drivers/r600/sb/sb_ra_checker.cpp
index 9681e69f6c..563b92a580 100644
--- a/src/gallium/drivers/r600/sb/sb_ra_checker.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ra_checker.cpp
@@ -214,7 +214,10 @@ void ra_checker::check_alu_group(alu_group_node *g) {
                process_op_dst(a);
 
                unsigned slot = a->bc.slot;
-               prev_dst[slot] = a->dst[0];
+               if (a->dst.size())
+                       prev_dst[slot] = a->dst[0];
+               else
+                       prev_dst[slot] = NULL;
        }
 }
 
diff --git a/src/gallium/drivers/r600/sb/sb_sched.cpp 
b/src/gallium/drivers/r600/sb/sb_sched.cpp
index f5fd84d54a..bf8f1308ee 100644
--- a/src/gallium/drivers/r600/sb/sb_sched.cpp
+++ b/src/gallium/drivers/r600/sb/sb_sched.cpp
@@ -1556,7 +1556,7 @@ void post_scheduler::recolor_locals() {
 
        for (unsigned s = 0; s < ctx.num_slots; ++s) {
                alu_node *n = rt.slot(s);
-               if (n) {
+               if (n && n->dst.size()) {
                        value *d = n->dst[0];
                        if (d && d->is_sgpr() && !d->is_prealloc()) {
                                recolor_local(d);
@@ -1910,7 +1910,7 @@ void post_scheduler::release_op(node *n) {
 
        if (n->is_copy_mov()) {
                ready_copies.push_back(n);
-       } else if (n->is_mova() || n->is_pred_set()) {
+       } else if (n->is_mova() || n->is_pred_set() || n->consumes_lds_oq() || 
n->produces_lds_oq()) {
                ready.push_front(n);
        } else {
                ready.push_back(n);
diff --git a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp 
b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
index 5cd41c2aab..239fad9d84 100644
--- a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
@@ -53,6 +53,8 @@ void ssa_prepare::add_defs(node &n) {
                if (!v)
                        continue;
 
+               if (v->is_lds_access() || v->is_lds_oq())
+                       continue;
                if (v->is_rel()) {
                        s.add_vec(v->mdef);
                } else
@@ -167,7 +169,7 @@ bool ssa_rename::visit(alu_node& n, bool enter) {
 
                node *psi = NULL;
 
-               if (n.pred && n.dst[0]) {
+               if (n.pred && n.dst[0] && !n.dst[0]->is_lds_access() && 
!n.dst[0]->is_lds_oq()) {
 
                        value *d = n.dst[0];
                        unsigned index = get_index(rename_stack.top(), d);
diff --git a/src/gallium/drivers/r600/sb/sb_valtable.cpp 
b/src/gallium/drivers/r600/sb/sb_valtable.cpp
index 41cfbf0946..22ef1164c0 100644
--- a/src/gallium/drivers/r600/sb/sb_valtable.cpp
+++ b/src/gallium/drivers/r600/sb/sb_valtable.cpp
@@ -185,7 +185,7 @@ value_hash value::hash() {
                return ghash;
        if (is_rel())
                ghash = rel_hash();
-       else if (def)
+       else if (def && !is_dead())
                ghash = def->hash();
        else
                ghash = ((uintptr_t)this) | 1;
-- 
2.14.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to