nir_opcodes.py: Saturate to expression that doesn't overflow
authorKristian H. Kristensen <hoegsberg@google.com>
Thu, 18 Apr 2019 18:23:13 +0000 (11:23 -0700)
committerKristian H. Kristensen <hoegsberg@gmail.com>
Fri, 19 Apr 2019 16:17:37 +0000 (16:17 +0000)
Compiler warns about overflow when assigning UINT64_MAX to something
smaller than a uin64_t:

src/compiler/nir/nir_constant_expressions.c:16909:50: warning: implicit conversion from 'unsigned long long' to 'uint1_t' (aka 'unsigned char') changes value from 18446744073709551615 to 255 [-Wconstant-conversion]
            uint1_t dst = (src0 + src1) < src0 ? UINT64_MAX : (src0 + src1);
                    ~~~                          ^~~~~~~~~~

Shift UINT64_MAX down to the appropriate maximum value for the type
being assigned to.

Signed-off-by: Kristian H. Kristensen <hoegsberg@google.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compiler/nir/nir_constant_expressions.py
src/compiler/nir/nir_opcodes.py

index 0f89e90d7b7f92cd68ae691362847139de87d580..f26fd0a3ea23eb109d62b1d0060ab5e6996a72f5 100644 (file)
@@ -66,6 +66,8 @@ template = """\
 #include "util/bigmath.h"
 #include "nir_constant_expressions.h"
 
+#define MAX_UINT_FOR_SIZE(bits) (UINT64_MAX >> (64 - (bits)))
+
 /**
  * Evaluate one component of packSnorm4x8.
  */
index 0f56dd9596cb7941cb4257ee942947975e5412a3..d35d820aa5b3fb32bf53ba7088695f46ff1cc673 100644 (file)
@@ -488,7 +488,7 @@ binop("iadd_sat", tint, commutative + associative, """
          (src0 < src0 + src1 ? (1ull << (bit_size - 1))     : src0 + src1)
 """)
 binop("uadd_sat", tuint, commutative,
-      "(src0 + src1) < src0 ? UINT64_MAX : (src0 + src1)")
+      "(src0 + src1) < src0 ? MAX_UINT_FOR_SIZE(sizeof(src0) * 8) : (src0 + src1)")
 binop("isub_sat", tint, "", """
       src1 < 0 ?
          (src0 - src1 < src0 ? (1ull << (bit_size - 1)) - 1 : src0 - src1) :