glsl: Optimize redundant pack(unpack()) and unpack(pack()) combinations
authorIan Romanick <ian.d.romanick@intel.com>
Wed, 12 Oct 2016 22:31:22 +0000 (15:31 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Fri, 20 Jan 2017 23:41:23 +0000 (15:41 -0800)
The lowering passes 64-bit integer operations will generate a lot of
these.

v2: Modify the HANDLE_PACK_UNPACK_INVERSE so that the breaks apply to
the switch instead of the 'do { } while(true)' loop.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/compiler/glsl/opt_algebraic.cpp

index 2829a78251427afa9f0c775bd0d1081066cac1ef..0ec331524c2b19caebfe2954f6c10f069a0dad9e 100644 (file)
@@ -472,6 +472,34 @@ ir_algebraic_visitor::handle_expression(ir_expression *ir)
       }
       break;
 
+      /* This macro CANNOT use the do { } while(true) mechanism because
+       * then the breaks apply to the loop instead of the switch!
+       */
+#define HANDLE_PACK_UNPACK_INVERSE(inverse_operation)                   \
+      {                                                                 \
+         ir_expression *const op = ir->operands[0]->as_expression();    \
+         if (op == NULL)                                                \
+            break;                                                      \
+         if (op->operation == (inverse_operation))                      \
+            return op->operands[0];                                     \
+         break;                                                         \
+      }
+
+   case ir_unop_unpack_uint_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_pack_uint_2x32);
+   case ir_unop_pack_uint_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_unpack_uint_2x32);
+   case ir_unop_unpack_int_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_pack_int_2x32);
+   case ir_unop_pack_int_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_unpack_int_2x32);
+   case ir_unop_unpack_double_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_pack_double_2x32);
+   case ir_unop_pack_double_2x32:
+      HANDLE_PACK_UNPACK_INVERSE(ir_unop_unpack_double_2x32);
+
+#undef HANDLE_PACK_UNPACK_INVERSE
+
    case ir_binop_add:
       if (is_vec_zero(op_const[0]))
         return ir->operands[1];