[GPU] Don't ignore vector instructions with side effects when they write to nowhere
This commit is contained in:
parent
43f34d804a
commit
aef0675c31
|
@ -1325,6 +1325,27 @@ enum class AluVectorOpcode {
|
||||||
kMaxA = 29,
|
kMaxA = 29,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Whether the vector instruction has side effects such as discarding a pixel or
|
||||||
|
// setting the predicate and can't be ignored even if it doesn't write to
|
||||||
|
// anywhere.
|
||||||
|
inline bool AluVectorOpcodeHasSideEffects(AluVectorOpcode vector_opcode) {
|
||||||
|
switch (vector_opcode) {
|
||||||
|
case AluVectorOpcode::kSetpEqPush:
|
||||||
|
case AluVectorOpcode::kSetpNePush:
|
||||||
|
case AluVectorOpcode::kSetpGtPush:
|
||||||
|
case AluVectorOpcode::kSetpGePush:
|
||||||
|
case AluVectorOpcode::kKillEq:
|
||||||
|
case AluVectorOpcode::kKillGt:
|
||||||
|
case AluVectorOpcode::kKillGe:
|
||||||
|
case AluVectorOpcode::kKillNe:
|
||||||
|
case AluVectorOpcode::kMaxA:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
struct AluInstruction {
|
struct AluInstruction {
|
||||||
// Whether data is being exported (or written to local registers).
|
// Whether data is being exported (or written to local registers).
|
||||||
bool is_export() const { return data_.export_data == 1; }
|
bool is_export() const { return data_.export_data == 1; }
|
||||||
|
@ -1340,7 +1361,10 @@ struct AluInstruction {
|
||||||
bool is_const_1_addressed() const { return data_.const_1_rel_abs == 1; }
|
bool is_const_1_addressed() const { return data_.const_1_rel_abs == 1; }
|
||||||
bool is_address_relative() const { return data_.address_absolute == 1; }
|
bool is_address_relative() const { return data_.address_absolute == 1; }
|
||||||
|
|
||||||
bool has_vector_op() const { return vector_write_mask() || is_export(); }
|
bool has_vector_op() const {
|
||||||
|
return vector_write_mask() || is_export() ||
|
||||||
|
AluVectorOpcodeHasSideEffects(vector_opcode());
|
||||||
|
}
|
||||||
AluVectorOpcode vector_opcode() const {
|
AluVectorOpcode vector_opcode() const {
|
||||||
return static_cast<AluVectorOpcode>(data_.vector_opc);
|
return static_cast<AluVectorOpcode>(data_.vector_opc);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue