summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Turner <[email protected]>2014-06-17 12:14:05 -0700
committerKenneth Graunke <[email protected]>2014-06-26 11:46:19 -0700
commita382b4cb7aab046ce80140973f07bac71451b9ef (patch)
tree6c9f727b4b57ddf5c3358f7e8c2b078697d1e6df
parent92233aee47a0c7debfd2db5242fa8792e4c9db07 (diff)
i965: Don't set UIP for ENDIF/WHILE.
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 <[email protected]> Reviewed-by: Kenneth Graunke <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_eu_compact.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_eu_compact.c b/src/mesa/drivers/dri/i965/brw_eu_compact.c
index 69621dd4e5e..a7d3595e3bd 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_compact.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_compact.c
@@ -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);