i965/fs: Disable CSE optimization for untyped & typed surface reads
An untyped surface read is volatile because it might be affected by a write. In the ES31-CTS.compute_shader.resources-max test, two back to back read/modify/writes of an SSBO variable looked something like this: r1 = untyped_surface_read(ssbo_float) r2 = r1 + 1 untyped_surface_write(ssbo_float, r2) r3 = untyped_surface_read(ssbo_float) r4 = r3 + 1 untyped_surface_write(ssbo_float, r4) And after CSE, we had: r1 = untyped_surface_read(ssbo_float) r2 = r1 + 1 untyped_surface_write(ssbo_float, r2) r4 = r1 + 1 untyped_surface_write(ssbo_float, r4) Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
This commit is contained in:
parent
13a5805b64
commit
627c15cde4
|
@ -93,7 +93,8 @@ is_expression(const fs_visitor *v, const fs_inst *const inst)
|
||||||
case SHADER_OPCODE_LOAD_PAYLOAD:
|
case SHADER_OPCODE_LOAD_PAYLOAD:
|
||||||
return !inst->is_copy_payload(v->alloc);
|
return !inst->is_copy_payload(v->alloc);
|
||||||
default:
|
default:
|
||||||
return inst->is_send_from_grf() && !inst->has_side_effects();
|
return inst->is_send_from_grf() && !inst->has_side_effects() &&
|
||||||
|
!inst->is_volatile();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -987,6 +987,20 @@ backend_instruction::has_side_effects() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
backend_instruction::is_volatile() const
|
||||||
|
{
|
||||||
|
switch (opcode) {
|
||||||
|
case SHADER_OPCODE_UNTYPED_SURFACE_READ:
|
||||||
|
case SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL:
|
||||||
|
case SHADER_OPCODE_TYPED_SURFACE_READ:
|
||||||
|
case SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
static bool
|
static bool
|
||||||
inst_is_in_block(const bblock_t *block, const backend_instruction *inst)
|
inst_is_in_block(const bblock_t *block, const backend_instruction *inst)
|
||||||
|
|
|
@ -115,6 +115,12 @@ struct backend_instruction : public exec_node {
|
||||||
* optimize these out unless you know what you are doing.
|
* optimize these out unless you know what you are doing.
|
||||||
*/
|
*/
|
||||||
bool has_side_effects() const;
|
bool has_side_effects() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* True if the instruction might be affected by side effects of other
|
||||||
|
* instructions.
|
||||||
|
*/
|
||||||
|
bool is_volatile() const;
|
||||||
#else
|
#else
|
||||||
struct backend_instruction {
|
struct backend_instruction {
|
||||||
struct exec_node link;
|
struct exec_node link;
|
||||||
|
|
Loading…
Reference in New Issue