Mesa (master): nir/constant_expressions: Don' t switch on bit size when not needed

Jason Ekstrand jekstrand at kemper.freedesktop.org
Thu Mar 30 18:34:58 UTC 2017


Module: Mesa
Branch: master
Commit: 28e41506a6ee0631cf6ca04891dcb3adeff82f60
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=28e41506a6ee0631cf6ca04891dcb3adeff82f60

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Tue Mar 14 10:31:21 2017 -0700

nir/constant_expressions: Don't switch on bit size when not needed

For opcodes such as the nir_op_pack_64_2x32 for which all sources and
destinations have explicit sizes, the bit_size parameter to the evaluate
function is pointless and *should* do nothing.  Previously, we were
always switching on the bit_size and asserting if it isn't one of the
sizes in the list.  This generates way more code than needed and is a
bit cruel because it doesn't let us have a bit_size of zero on an ALU op
which shouldn't need a bit_size.

Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>

---

 src/compiler/nir/nir_constant_expressions.py | 37 +++++++++++++++++-----------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/compiler/nir/nir_constant_expressions.py b/src/compiler/nir/nir_constant_expressions.py
index ad841e3d31..0ff8dfbf6c 100644
--- a/src/compiler/nir/nir_constant_expressions.py
+++ b/src/compiler/nir/nir_constant_expressions.py
@@ -22,13 +22,18 @@ def type_add_size(type_, size):
     return type_ + str(size)
 
 def op_bit_sizes(op):
-    sizes = set([8, 16, 32, 64])
+    sizes = None
     if not type_has_size(op.output_type):
-        sizes = sizes.intersection(set(type_sizes(op.output_type)))
+        sizes = set(type_sizes(op.output_type))
+
     for input_type in op.input_types:
         if not type_has_size(input_type):
-            sizes = sizes.intersection(set(type_sizes(input_type)))
-    return sorted(list(sizes))
+            if sizes is None:
+                sizes = set(type_sizes(input_type))
+            else:
+                sizes = sizes.intersection(set(type_sizes(input_type)))
+
+    return sorted(list(sizes)) if sizes is not None else None
 
 def get_const_field(type_):
     if type_ == "bool32":
@@ -375,17 +380,21 @@ evaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
 {
    nir_const_value _dst_val = { {0, } };
 
-   switch (bit_size) {
-   % for bit_size in op_bit_sizes(op):
-   case ${bit_size}: {
-      ${evaluate_op(op, bit_size)}
-      break;
-   }
-   % endfor
+   % if op_bit_sizes(op) is not None:
+      switch (bit_size) {
+      % for bit_size in op_bit_sizes(op):
+      case ${bit_size}: {
+         ${evaluate_op(op, bit_size)}
+         break;
+      }
+      % endfor
 
-   default:
-      unreachable("unknown bit width");
-   }
+      default:
+         unreachable("unknown bit width");
+      }
+   % else:
+      ${evaluate_op(op, 0)}
+   % endif
 
    return _dst_val;
 }




More information about the mesa-commit mailing list