On Thursday, August 18, 2016 10:23:01 PM PDT Matt Turner wrote: > var_range_end(v, n) loops over the n components of variable number v and > finds the maximum value, giving the last use of any component of v. > Therefore it expects v to correspond to the variable associated with the > .x channel of the VGRF. > > var_from_reg() however returns the variable for the first channel of the > VGRF, post-swizzle. > > So, if the last register had a swizzle with y, z, or w in the swizzle > component, we would read out of bounds. For any other register, we would > read liveness information from the next register. > > The fix is to convert the src_reg to a dst_reg in order to call the > dst_reg version of var_from_reg() that doesn't consider the swizzle. > > Cc: mesa-sta...@lists.freedesktop.org > --- > src/mesa/drivers/dri/i965/brw_vec4.cpp | 2 +- > src/mesa/drivers/dri/i965/brw_vec4_cse.cpp | 2 +- > 2 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp > b/src/mesa/drivers/dri/i965/brw_vec4.cpp > index 2cf0e17..a7398a7 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp > @@ -1111,7 +1111,7 @@ vec4_visitor::opt_register_coalesce() > /* Can't coalesce this GRF if someone else was going to > * read it later. > */ > - if (var_range_end(var_from_reg(alloc, inst->src[0]), 4) > ip) > + if (var_range_end(var_from_reg(alloc, dst_reg(inst->src[0])), 4) > ip) > continue; > > /* We need to check interference with the final destination between > this > diff --git a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp > b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp > index 0c1f0c3..10898a5 100644 > --- a/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp > +++ b/src/mesa/drivers/dri/i965/brw_vec4_cse.cpp > @@ -246,7 +246,7 @@ vec4_visitor::opt_cse_local(bblock_t *block) > * more -- a sure sign they'll fail operands_match(). > */ > if (src->file == VGRF) { > - if (var_range_end(var_from_reg(alloc, *src), 4) < ip) { > + if (var_range_end(var_from_reg(alloc, dst_reg(*src)), 4) < > ip) { > entry->remove(); > ralloc_free(entry); > break; >
Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev