acae607703
This is required to avoid relying on complex sub-expression elimination in compilers, and generates cleaner code. The problem case is if a complex expression is used in an access chain, like: Composite comp = buffer[texture(...)]; vec4 a = comp.a + comp.b + comp.c; Before, we did not have common subexpression tracking for OpLoad/OpAccessChain, so we easily ended up with code like: vec4 a = buffer[texture(...)].a + buffer[texture(...)].b + buffer[texture(...)].c; A good compiler will optimize this, but we should not rely on it, and forcing texture(...) to a temporary also looks better. The solution is to add a vector "implied_expression_reads", which works similarly to expression_dependencies. We also need an extra mechanism in to_expression which lets us skip expression read checking and do it later. E.g. for expr -> access chain -> load, we should only trigger a read of expr when using the loaded expression. |
||
---|---|---|
.. | ||
atomic.comp | ||
bake_gradient.comp | ||
barriers.comp | ||
basic.comp | ||
bitcast-16bit-1.invalid.comp | ||
bitcast-16bit-2.invalid.comp | ||
casts.comp | ||
cfg-preserve-parameter.comp | ||
cfg.comp | ||
coherent-block.comp | ||
coherent-image.comp | ||
composite-array-initialization.comp | ||
composite-construct.comp | ||
culling.comp | ||
defer-parens.comp | ||
dowhile.comp | ||
generate_height.comp | ||
image.comp | ||
inout-struct.invalid.comp | ||
insert.comp | ||
mat3.comp | ||
mod.comp | ||
modf.comp | ||
read-write-only.comp | ||
rmw-matrix.comp | ||
rmw-opt.comp | ||
shared.comp | ||
ssbo-array.comp | ||
struct-layout.comp | ||
struct-packing.comp | ||
torture-loop.comp | ||
type-alias.comp | ||
udiv.comp |