summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2014-09-10 17:57:54 -0700
committerIan Romanick <[email protected]>2014-09-11 11:18:36 -0700
commit7aeb853c90c2e84fdd4b6b0af97566562c912861 (patch)
tree8916d3b7482da224a96b0576704ccacaa88612ff
parenta46d7579e9b92a48e391ef63be7129a957bf155a (diff)
i965/vec4: Only examine virtual_grf_end for GRF sources
If the source is not a GRF, it could have a register >= virtual_grf_count. Accessing virtual_grf_end with such a register would lead to out-of-bounds access. Make sure the source is a GRF before accessing virtual_grf_end. Fixes Valgrind complaints while compiling some shaders. Signed-off-by: Ian Romanick <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]> Cc: [email protected]
-rw-r--r--src/mesa/drivers/dri/i965/brw_vec4_cse.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
index a0f6e77f577..a9265530d17 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp
@@ -224,14 +224,18 @@ vec4_visitor::opt_cse_local(bblock_t *block)
/* Kill any AEB entries using registers that don't get reused any
* more -- a sure sign they'll fail operands_match().
*/
- int last_reg_use = MAX2(MAX2(virtual_grf_end[src->reg * 4 + 0],
- virtual_grf_end[src->reg * 4 + 1]),
- MAX2(virtual_grf_end[src->reg * 4 + 2],
- virtual_grf_end[src->reg * 4 + 3]));
- if (src->file == GRF && last_reg_use < ip) {
- entry->remove();
- ralloc_free(entry);
- break;
+ if (src->file == GRF) {
+ assert((src->reg * 4 + 3) < (virtual_grf_count * 4));
+
+ int last_reg_use = MAX2(MAX2(virtual_grf_end[src->reg * 4 + 0],
+ virtual_grf_end[src->reg * 4 + 1]),
+ MAX2(virtual_grf_end[src->reg * 4 + 2],
+ virtual_grf_end[src->reg * 4 + 3]));
+ if (last_reg_use < ip) {
+ entry->remove();
+ ralloc_free(entry);
+ break;
+ }
}
}
}