summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGert Wollny <[email protected]>2017-12-06 17:42:02 +0100
committerDave Airlie <[email protected]>2017-12-07 09:48:41 +1000
commit6c268ea79af80a65a89a23854bdbe8bc1e99ab23 (patch)
treed47712bf68d78d62ff515fc77394c0d6285f8188
parent81683c3d42b3383e894b204d024abfa2fa547764 (diff)
r600/sb: do not convert if-blocks that contain indirect array access
If an array is accessed within an if block, then currently it is not known whether the value in the address register is involved in the evaluation of the if condition, and converting the if condition may actually result in out-of-bounds array access. Consequently, if blocks that contain indirect array access should not be converted. Fixes piglits on r600/BARTS: spec/glsl-1.10/execution/variable-indexing/ vs-output-array-float-index-wr vs-output-array-vec3-index-wr vs-output-array-vec4-index-wr Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104143 Signed-off-by: Gert Wollny <[email protected]> Cc: <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
-rw-r--r--src/gallium/drivers/r600/sb/sb_if_conversion.cpp2
-rw-r--r--src/gallium/drivers/r600/sb/sb_ir.cpp2
-rw-r--r--src/gallium/drivers/r600/sb/sb_ir.h3
3 files changed, 5 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_if_conversion.cpp b/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
index 3f2b1b1b925..3f6431b80f5 100644
--- a/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
+++ b/src/gallium/drivers/r600/sb/sb_if_conversion.cpp
@@ -136,7 +136,7 @@ bool if_conversion::check_and_convert(region_node *r) {
);
if (s.region_count || s.fetch_count || s.alu_kill_count ||
- s.if_count != 1 || s.repeat_count)
+ s.if_count != 1 || s.repeat_count || s.uses_ar)
return false;
unsigned real_alu_count = s.alu_count - s.alu_copy_mov_count;
diff --git a/src/gallium/drivers/r600/sb/sb_ir.cpp b/src/gallium/drivers/r600/sb/sb_ir.cpp
index d989dce62c9..fe068ab99b7 100644
--- a/src/gallium/drivers/r600/sb/sb_ir.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ir.cpp
@@ -461,6 +461,8 @@ void container_node::collect_stats(node_stats& s) {
++s.alu_kill_count;
else if (a->is_copy_mov())
++s.alu_copy_mov_count;
+ if (a->uses_ar())
+ s.uses_ar = true;
} else if (n->is_fetch_inst())
++s.fetch_count;
else if (n->is_cf_inst())
diff --git a/src/gallium/drivers/r600/sb/sb_ir.h b/src/gallium/drivers/r600/sb/sb_ir.h
index ec973e7bfc2..67c7cd8aa48 100644
--- a/src/gallium/drivers/r600/sb/sb_ir.h
+++ b/src/gallium/drivers/r600/sb/sb_ir.h
@@ -726,11 +726,12 @@ struct node_stats {
unsigned depart_count;
unsigned repeat_count;
unsigned if_count;
+ bool uses_ar;
node_stats() : alu_count(), alu_kill_count(), alu_copy_mov_count(),
cf_count(), fetch_count(), region_count(),
loop_count(), phi_count(), loop_phi_count(), depart_count(),
- repeat_count(), if_count() {}
+ repeat_count(), if_count(), uses_ar(false) {}
void dump();
};