diff options
author | Gert Wollny <[email protected]> | 2017-12-06 17:42:02 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2017-12-07 09:48:41 +1000 |
commit | 6c268ea79af80a65a89a23854bdbe8bc1e99ab23 (patch) | |
tree | d47712bf68d78d62ff515fc77394c0d6285f8188 | |
parent | 81683c3d42b3383e894b204d024abfa2fa547764 (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.cpp | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/sb/sb_ir.cpp | 2 | ||||
-rw-r--r-- | src/gallium/drivers/r600/sb/sb_ir.h | 3 |
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(); }; |