i965/vec4: refactor brw_vec4_copy_propagation.
authorAlejandro Piñeiro <apinheiro@igalia.com>
Wed, 16 Sep 2015 15:19:50 +0000 (17:19 +0200)
committerAlejandro Piñeiro <apinheiro@igalia.com>
Tue, 22 Sep 2015 17:30:18 +0000 (19:30 +0200)
commit1bd89db921105dbe76047144b4719d4617aee1d8
tree573149d74296e0849ea6109e079f9d3fcb9a93f3
parent4a03066e5a23058d8cf5a3c34b889ec484c36034
i965/vec4: refactor brw_vec4_copy_propagation.

Now it is more similar to brw_fs_copy_propagation, with three
clear stages:

1) Build up the value we are propagating as if it were the source of a
single MOV:
2) Check that we can propagate that value
3) Build the final value

Previously everything was somewhat messed up, making the
implementation on some specific cases, like knowing if you can
propagate from a previous instruction even with type mismatches, even
messier (for example, with the need of maintaining more of one
has_source_modifiers). The refactoring clears stuff, and gives
support to this mentioned use case without doing anything extra
(for example, only one has_source_modifiers is used).

Shader-db results for vec4 programs on Haswell:
total instructions in shared programs: 1683842 -> 1669037 (-0.88%)
instructions in affected programs:     739837 -> 725032 (-2.00%)
helped:                                6237
HURT:                                  0

v2: using 'arg' index to get the from inst was wrong
v3: rebased against last change on the previous patch of the series
v4: don't need to track instructions on struct copy_entry, as we
    only set the source on a direct copy
v5: change the approach for a refactoring
v6: tweaked comments

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp