diff options
author | Ian Romanick <[email protected]> | 2014-09-10 17:57:54 -0700 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2014-09-11 11:18:36 -0700 |
commit | 7aeb853c90c2e84fdd4b6b0af97566562c912861 (patch) | |
tree | 8916d3b7482da224a96b0576704ccacaa88612ff | |
parent | a46d7579e9b92a48e391ef63be7129a957bf155a (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.cpp | 20 |
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; + } } } } |