mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 11:08:03 +02:00
i965/fs: Improve register coalescing interference check.
I always thought that the is_control_flow() -> return false check was a bad hack, and some previous attempts to remove it have failed and have been reverted. The previous two patches fix some problems that caused register coalescing to not notice some interference between registers, which the is_control_flow() check apparently works around. With that fixed, we can calculate interference more accurately. total instructions in shared programs: 6261319 -> 6257917 (-0.05%) instructions in affected programs: 346282 -> 342880 (-0.98%) helped: 1552 Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
f3d0a894af
commit
f2f8c43af9
1 changed files with 11 additions and 8 deletions
|
|
@ -110,27 +110,30 @@ can_coalesce_vars(brw::fs_live_variables *live_intervals,
|
|||
(end_from > end_to && start_to < start_from))
|
||||
return false;
|
||||
|
||||
int start_ip = MIN2(start_to, start_from);
|
||||
/* Check for a write to either register in the intersection of their live
|
||||
* ranges.
|
||||
*/
|
||||
int start_ip = MAX2(start_to, start_from);
|
||||
int end_ip = MIN2(end_to, end_from);
|
||||
int scan_ip = -1;
|
||||
|
||||
foreach_block_and_inst(block, fs_inst, scan_inst, cfg) {
|
||||
scan_ip++;
|
||||
|
||||
/* Ignore anything before the intersection of the live ranges */
|
||||
if (scan_ip < start_ip)
|
||||
continue;
|
||||
|
||||
if (scan_inst->is_control_flow())
|
||||
return false;
|
||||
|
||||
if (scan_ip <= live_intervals->start[var_to])
|
||||
/* Ignore the copying instruction itself */
|
||||
if (scan_inst == inst)
|
||||
continue;
|
||||
|
||||
if (scan_ip > live_intervals->end[var_to])
|
||||
return true;
|
||||
if (scan_ip > end_ip)
|
||||
return true; /* registers do not interfere */
|
||||
|
||||
if (scan_inst->overwrites_reg(inst->dst) ||
|
||||
scan_inst->overwrites_reg(inst->src[0]))
|
||||
return false;
|
||||
return false; /* registers interfere */
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue