461f1506e7
This is not necessary, as we must emit an invalidating store before we potentially consume an invalid expression. In fact, we're a bit conservative here in this case for example: int tmp = variable; if (...) { variable = 10; } else { // Consuming tmp here is fine, but it was // invalidated while emitting other branch. // Technically, we need to study if there is an invalidating store // in the CFG between the loading block and this block, and the other // branch will not be a part of that analysis. int tmp2 = tmp * tmp; } Fixing this case means complex CFG traversal *everywhere*, and it feels like overkill. Fixing this exposed a bug with access chains, so fix a bug where expression dependencies were not inherited properly in access chains. Access chains are now considered forwarded if there is at least one dependency which is also forwarded. |
||
---|---|---|
.. | ||
atomic-decrement.asm.comp | ||
atomic-increment.asm.comp | ||
bitcast_iadd.asm.comp | ||
bitcast_sar.asm.comp | ||
bitcast_sdiv.asm.comp | ||
bitcast_slr.asm.comp | ||
block-name-alias-global.asm.comp | ||
buffer-write-relative-addr.asm.comp | ||
buffer-write.asm.comp | ||
global-parameter-name-alias.asm.comp | ||
image-load-store-short-vector.asm.comp | ||
multiple-entry.asm.comp | ||
quantize.asm.comp | ||
relaxed-block-layout.asm.comp | ||
specialization-constant-workgroup.asm.comp | ||
storage-buffer-basic.invalid.asm.comp | ||
struct-resource-name-aliasing.asm.comp | ||
variable-pointers-2.asm.comp | ||
variable-pointers-store-forwarding.asm.comp | ||
vector-builtin-type-cast-func.asm.comp | ||
vector-builtin-type-cast.asm.comp |