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:
Caio Marcelo de Oliveira Filho
2019-05-17 13:46:38 -07:00
parent f97dcb7a55
commit ae37237713
5 changed files with 36 additions and 8 deletions

View File

@@ -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[];