if (first->bar_classes && second->bar_classes)
return hazard_fail_barrier;
+ /* Don't move memory accesses to before control barriers. I don't think
+ * this is necessary for the Vulkan memory model, but it might be for GLSL450. */
+ unsigned control_classes = storage_buffer | storage_atomic_counter | storage_image | storage_shared;
+ if (first->has_control_barrier && ((second->access_atomic | second->access_relaxed) & control_classes))
+ return hazard_fail_barrier;
+
/* don't move memory loads/stores past potentially aliasing loads/stores */
unsigned aliasing_storage = instr->format == Format::SMEM ?
query->aliasing_storage_smem :