nir: Add a no wrapping bits to nir_alu_instr
They indicate the operation does not cause overflow or underflow. This is motivated by SPIR-V decorations NoSignedWrap and NoUnsignedWrap. Change the storage of `exact` to be a single bit, so they pack together. v2: Handle no_wrap in nir_instr_set. (Karol) v3: Use two separate flags, since the NIR SSA values and certain instructions are typeless, so just no_wrap would be insufficient to know which one was referred to. (Connor) v4: Don't use nir_instr_set to propagate the flags, unlike `exact`, consider the instructions different if the flags have different values. Fix hashing/comparing. (Jason) Reviewed-by: Karol Herbst <kherbst@redhat.com> [v1] Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -961,7 +961,14 @@ typedef struct nir_alu_instr {
|
||||
* it must ensure that the resulting value is bit-for-bit identical to the
|
||||
* original.
|
||||
*/
|
||||
bool exact;
|
||||
bool exact:1;
|
||||
|
||||
/**
|
||||
* Indicates that this instruction do not cause wrapping to occur, in the
|
||||
* form of overflow or underflow.
|
||||
*/
|
||||
bool no_signed_wrap:1;
|
||||
bool no_unsigned_wrap:1;
|
||||
|
||||
nir_alu_dest dest;
|
||||
nir_alu_src src[];
|
||||
|
Reference in New Issue
Block a user