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. |
||
---|---|---|
.. | ||
combined-sampler-reuse.asm.frag | ||
default-member-names.asm.frag | ||
descriptor-array-unnamed.asm.frag | ||
empty-struct.asm.frag | ||
extract-packed-from-composite.asm.frag | ||
frem.asm.frag | ||
function-overload-alias.asm.frag | ||
image-extract-reuse.asm.frag | ||
implicit-read-dep-phi.asm.frag | ||
inf-nan-constant.asm.frag | ||
interpolation-qualifiers-struct.asm.frag | ||
line-directive.line.asm.frag | ||
locations-components.asm.frag | ||
lut-promotion-initializer.asm.frag | ||
min-lod.msl22.asm.frag | ||
min-max-clamp.invalid.asm.frag | ||
op-constant-null.asm.frag | ||
op-image-sampled-image.asm.frag | ||
pass-by-value.asm.frag | ||
phi-loop-variable.asm.frag | ||
sample-and-compare.asm.frag | ||
single-function-private-lut.asm.frag | ||
srem.asm.frag | ||
storage-class-output-initializer.asm.frag | ||
texel-fetch-no-lod.asm.frag | ||
texture-sampling-fp16.asm.frag | ||
undef-variable-store.asm.frag | ||
unknown-depth-state.asm.frag | ||
unord-relational-op.asm.frag | ||
unreachable.asm.frag | ||
vector-shuffle-oom.asm.frag |