summaryrefslogtreecommitdiffstats
path: root/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2016-03-23 12:02:21 +0100
committerSamuel Iglesias Gonsálvez <siglesias@igalia.com>2016-05-16 09:55:32 +0200
commit7aa53cd725cc2287fc206033120e08cde74cde2a (patch)
tree0140a418fc5b1014bfbfb538bb4ea8ef96b5342b /src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
parentac9b966aac4d0276de889990f3b170e0b939c542 (diff)
downloadexternal_mesa3d-7aa53cd725cc2287fc206033120e08cde74cde2a.zip
external_mesa3d-7aa53cd725cc2287fc206033120e08cde74cde2a.tar.gz
external_mesa3d-7aa53cd725cc2287fc206033120e08cde74cde2a.tar.bz2
i965/fs: disallow type change in copy-propagation if types have different sizes
Because the semantics of source modifiers are type-dependent, the type of the original source of the copy must be kept unmodified while propagating it into some instruction, which implies that we need to have the guarantee that the meaning of the instruction is going to remain the same after we have changed the types. Whenthe size of the new type is different from the size of the old type the new and old instructions cannot possibly be equivalent because the new instruction will be reading more data than the old one was. Prevents that we turn this: load_payload(8) vgrf17:DF, |vgrf4+0.0|:DF 1sthalf mov(8) vgrf18:DF, vgrf17:DF 1sthalf load_payload(8) vgrf5:DF, vgrf18:DF, vgrf20:DF NoMask 1sthalf WE_all load_payload(8) vgrf21:UD, vgrf5+0.4<2>:UD 1sthalf mov(8) vgrf22:UD, vgrf21:UD 1sthalf into: load_payload(8) vgrf17:DF, |vgrf4+0.0|:DF 1sthalf mov(8) vgrf18:DF, |vgrf4+0.0|:DF 1sthalf load_payload(8) vgrf5:DF, |vgrf4+0.0|:DF, |vgrf4+2.0|:DF NoMask 1sthalf WE_all load_payload(8) vgrf21:UD, vgrf5+0.4<2>:UD 1sthalf mov(8) vgrf22:DF, |vgrf4+0.4|<2>:DF 1sthalf where the semantics of the last instruccion have changed. v2 (Curro): - Update commit log and add comment to explain the problem better. - Simplify the condition. Reviewed-by: Francisco Jerez <currojerez@riseup.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp')
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
index 875928b..b9ff031 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
@@ -410,9 +410,16 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
type_sz(inst->src[arg].type)) % type_sz(entry->src.type) != 0)
return false;
+ /* Since semantics of source modifiers are type-dependent we need to
+ * ensure that the meaning of the instruction remains the same if we
+ * change the type. If the sizes of the types are different the new
+ * instruction will read a different amount of data than the original
+ * and the semantics will always be different.
+ */
if (has_source_modifiers &&
entry->dst.type != inst->src[arg].type &&
- !inst->can_change_types())
+ (!inst->can_change_types() ||
+ type_sz(entry->dst.type) != type_sz(inst->src[arg].type)))
return false;
if (devinfo->gen >= 8 && (entry->src.negate || entry->src.abs) &&