pan/midgard: Specialize mod checking by type when checking constants
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 26 Jul 2019 15:50:22 +0000 (08:50 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 26 Jul 2019 16:47:40 +0000 (09:47 -0700)
Fixes inlining of integer constants.

total quadwords in shared programs: 3585 -> 3568 (-0.47%)
quadwords in affected programs: 625 -> 608 (-2.72%)
helped: 13
HURT: 0
helped stats (abs) min: 1 max: 2 x̄: 1.31 x̃: 1
helped stats (rel) min: 1.27% max: 9.52% x̄: 3.84% x̃: 2.94%
95% mean confidence interval for quadwords value: -1.60 -1.02
95% mean confidence interval for quadwords %-change: -5.60% -2.07%
Quadwords are helped.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/compiler.h
src/panfrost/midgard/midgard_compile.c
src/panfrost/midgard/mir.c

index 84a00fb0174cc64cadae912a6501a9a08986938e..53d995a109eb401036f75bb061e1204129c5e0d4 100644 (file)
@@ -390,6 +390,7 @@ void mir_print_instruction(midgard_instruction *ins);
 void mir_print_bundle(midgard_bundle *ctx);
 void mir_print_block(midgard_block *block);
 void mir_print_shader(compiler_context *ctx);
+bool mir_nontrivial_raw_mod(midgard_vector_alu_src src, bool is_int);
 bool mir_nontrivial_source2_mod(midgard_instruction *ins);
 bool mir_nontrivial_mod(midgard_vector_alu_src src, bool is_int, unsigned mask);
 bool mir_nontrivial_outmod(midgard_instruction *ins);
index b49f50dc584a9d9cd69df0418f47491e3f860cb6..48f7bbd38b5784063e225eea328f3fa213be1263 100644 (file)
@@ -1902,7 +1902,8 @@ embedded_to_inline_constant(compiler_context *ctx)
 
                         /* We don't know how to handle these with a constant */
 
-                        if (src->mod || src->half || src->rep_low || src->rep_high) {
+                        bool is_int = midgard_is_integer_op(ins->alu.op);
+                        if (mir_nontrivial_raw_mod(*src, is_int) || src->half || src->rep_low || src->rep_high) {
                                 DBG("Bailing inline constant...\n");
                                 continue;
                         }
index 75da2fb0864908e7cdde90e13bf939149161d946..963652eed3d3263e36bcaf22dde9277570917565 100644 (file)
@@ -109,13 +109,18 @@ mir_single_use(compiler_context *ctx, unsigned value)
 }
 
 bool
-mir_nontrivial_mod(midgard_vector_alu_src src, bool is_int, unsigned mask)
+mir_nontrivial_raw_mod(midgard_vector_alu_src src, bool is_int)
 {
-        /* abs or neg */
-        if (!is_int && src.mod) return true;
+        if (is_int)
+                return src.mod == midgard_int_shift;
+        else
+                return src.mod;
+}
 
-        /* Other int mods don't matter in isolation */
-        if (is_int && src.mod == midgard_int_shift) return true;
+bool
+mir_nontrivial_mod(midgard_vector_alu_src src, bool is_int, unsigned mask)
+{
+        if (mir_nontrivial_raw_mod(src, is_int)) return true;
 
         /* size-conversion */
         if (src.half) return true;
@@ -128,7 +133,6 @@ mir_nontrivial_mod(midgard_vector_alu_src src, bool is_int, unsigned mask)
 
         return false;
 }
-
 bool
 mir_nontrivial_source2_mod(midgard_instruction *ins)
 {