From: Connor Abbott Date: Fri, 5 Jun 2015 23:20:57 +0000 (-0400) Subject: i965: fix cycle estimates when there's a pipeline stall X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6f231fddff1661c2ca2cfb7bb7a0e6a970bcbf40;p=mesa.git i965: fix cycle estimates when there's a pipeline stall The issue time for an instruction is how many cycles it takes to actually put it into the pipeline. If there's a pipeline stall that causes the instruction to be delayed, we should first take that into account to figure out when the instruction would start executing and *then* add the issue time. The old code had it backwards, and so we would underestimate the total time whenever we thought there would be a pipeline stall by up to the issue time of the instruction. Reviewed-by: Jason Ekstrand --- diff --git a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp index cd1f21e1253..3e86cb05cce 100644 --- a/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp +++ b/src/mesa/drivers/dri/i965/brw_schedule_instructions.cpp @@ -1405,18 +1405,19 @@ instruction_scheduler::schedule_instructions(bblock_t *block) instructions_to_schedule--; update_register_pressure(chosen->inst); + /* If we expected a delay for scheduling, then bump the clock to reflect + * that. In reality, the hardware will switch to another hyperthread + * and may not return to dispatching our thread for a while even after + * we're unblocked. After this, we have the time when the chosen + * instruction will start executing. + */ + time = MAX2(time, chosen->unblocked_time); + /* Update the clock for how soon an instruction could start after the * chosen one. */ time += issue_time(chosen->inst); - /* If we expected a delay for scheduling, then bump the clock to reflect - * that as well. In reality, the hardware will switch to another - * hyperthread and may not return to dispatching our thread for a while - * even after we're unblocked. - */ - time = MAX2(time, chosen->unblocked_time); - if (debug) { fprintf(stderr, "clock %4d, scheduled: ", time); bs->dump_instruction(chosen->inst);