From: Gert Wollny Date: Wed, 6 Dec 2017 16:42:02 +0000 (+0100) Subject: r600/sb: do not convert if-blocks that contain indirect array access X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6c268ea79af80a65a89a23854bdbe8bc1e99ab23;p=mesa.git 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 Cc: Signed-off-by: Dave Airlie --- 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(); };