summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/r600/sb/sb_pass.h4
-rw-r--r--src/gallium/drivers/r600/sb/sb_ssa_builder.cpp23
2 files changed, 24 insertions, 3 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_pass.h b/src/gallium/drivers/r600/sb/sb_pass.h
index b5818039c2e..a21b0bf9971 100644
--- a/src/gallium/drivers/r600/sb/sb_pass.h
+++ b/src/gallium/drivers/r600/sb/sb_pass.h
@@ -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;
diff --git a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
index 3ad628bb68c..5cd41c2aabd 100644
--- a/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ssa_builder.cpp
@@ -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;
}