i965: Don't set UIP for ENDIF/WHILE.
authorMatt Turner <mattst88@gmail.com>
Tue, 17 Jun 2014 19:14:05 +0000 (12:14 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 26 Jun 2014 18:46:19 +0000 (11:46 -0700)
They don't have a UIP. We used UIP in an array dereference, which never
caused problems on Gen < 8, since UIP was a small integer (number of
instructions). On Gen 8 UIP is in bytes, so it's large enough that it
caused us to read out of bounds of the array.

Signed-off-by: Matt Turner <mattst88@gmail.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_eu_compact.c

index 69621dd4e5eeeb92f28f4c759b759f1b91bf30c1..a7d3595e3bdebfc2074d5bfe33cc0c4b2f05a66f 100644 (file)
@@ -658,6 +658,10 @@ update_uip_jip(struct brw_context *brw, brw_inst *insn,
    jip -= compacted_between(this_old_ip, this_old_ip + jip, compacted_counts);
    brw_inst_set_jip(brw, insn, jip);
 
+   if (brw_inst_opcode(brw, insn) == BRW_OPCODE_ENDIF ||
+       brw_inst_opcode(brw, insn) == BRW_OPCODE_WHILE)
+      return;
+
    int uip = brw_inst_uip(brw, insn);
    uip -= compacted_between(this_old_ip, this_old_ip + uip, compacted_counts);
    brw_inst_set_uip(brw, insn, uip);