Mesa (main): pan/bi: Use gtest for test-optimizer

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Nov 8 19:16:06 UTC 2021


Module: Mesa
Branch: main
Commit: 4554cd03f01b4a402e33e0c4e429126c709a65f7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4554cd03f01b4a402e33e0c4e429126c709a65f7

Author: Caio Oliveira <caio.oliveira at intel.com>
Date:   Thu Nov  4 17:41:18 2021 -0700

pan/bi: Use gtest for test-optimizer

Reviewed-by: Dylan Baker <dylan at pnwbakers.com>
Reviewed-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13684>

---

 src/panfrost/bifrost/meson.build                   |  15 +--
 .../test/{test-optimizer.c => test-optimizer.cpp}  | 105 ++++++++++++++-------
 2 files changed, 70 insertions(+), 50 deletions(-)

diff --git a/src/panfrost/bifrost/meson.build b/src/panfrost/bifrost/meson.build
index 6168b15a07d..909c7b797ee 100644
--- a/src/panfrost/bifrost/meson.build
+++ b/src/panfrost/bifrost/meson.build
@@ -142,20 +142,6 @@ libpanfrost_bifrost = static_library(
 )
 
 if with_tests
-  test(
-    'bifrost_optimizer',
-    executable(
-      'bifrost_optimizer_test',
-      files('test/test-optimizer.c'),
-      c_args : [c_msvc_compat_args, no_override_init_args],
-      gnu_symbol_visibility : 'hidden',
-      include_directories : [inc_include, inc_src, inc_mesa],
-      dependencies: [idep_nir, idep_bi_opcodes_h, idep_bi_builder_h],
-      link_with : [libpanfrost_bifrost],
-    ),
-    suite : ['panfrost'],
-  )
-
   test(
     'bifrost_constant_fold',
     executable(
@@ -175,6 +161,7 @@ if with_tests
     executable(
       'bifrost_tests',
       files(
+	'test/test-optimizer.cpp',
 	'test/test-pack-formats.cpp',
 	'test/test-packing.cpp',
 	'test/test-scheduler-predicates.cpp',
diff --git a/src/panfrost/bifrost/test/test-optimizer.c b/src/panfrost/bifrost/test/test-optimizer.cpp
similarity index 88%
rename from src/panfrost/bifrost/test/test-optimizer.c
rename to src/panfrost/bifrost/test/test-optimizer.cpp
index 6d70acdfc4d..923386845b3 100644
--- a/src/panfrost/bifrost/test/test-optimizer.c
+++ b/src/panfrost/bifrost/test/test-optimizer.cpp
@@ -25,9 +25,11 @@
 #include "bi_test.h"
 #include "bi_builder.h"
 
+#include <gtest/gtest.h>
+
 #define CASE(instr, expected) do { \
-   bi_builder *A = bit_builder(ralloc_ctx); \
-   bi_builder *B = bit_builder(ralloc_ctx); \
+   bi_builder *A = bit_builder(mem_ctx); \
+   bi_builder *B = bit_builder(mem_ctx); \
    { \
       bi_builder *b = A; \
       instr; \
@@ -39,33 +41,44 @@
    bi_opt_mod_prop_forward(A->shader); \
    bi_opt_mod_prop_backward(A->shader); \
    bi_opt_dead_code_eliminate(A->shader); \
-   if (bit_shader_equal(A->shader, B->shader)) { \
-      nr_pass++; \
-   } else { \
-      fprintf(stderr, "Got:\n"); \
+   if (!bit_shader_equal(A->shader, B->shader)) { \
+      ADD_FAILURE(); \
+      fprintf(stderr, "Optimization produce unexpected result"); \
+      fprintf(stderr, "  Actual:\n"); \
       bi_print_shader(A->shader, stderr); \
       fprintf(stderr, "Expected:\n"); \
       bi_print_shader(B->shader, stderr); \
       fprintf(stderr, "\n"); \
-      nr_fail++; \
    } \
 } while(0)
 
 #define NEGCASE(instr) CASE(instr, instr)
 
-int
-main(int argc, const char **argv)
-{
-   unsigned nr_fail = 0, nr_pass = 0;
-   void *ralloc_ctx = ralloc_context(NULL);
-   bi_index zero = bi_zero();
-   bi_index reg = bi_register(0);
-   bi_index x = bi_register(1);
-   bi_index y = bi_register(2);
-   bi_index negabsx = bi_neg(bi_abs(x));
+class Optimizer : public testing::Test {
+protected:
+   Optimizer() {
+      mem_ctx = ralloc_context(NULL);
 
-   /* Check absneg is fused */
+      reg     = bi_register(0);
+      x       = bi_register(1);
+      y       = bi_register(2);
+      negabsx = bi_neg(bi_abs(x));
+   }
+
+   ~Optimizer() {
+      ralloc_free(mem_ctx);
+   }
 
+   void *mem_ctx;
+
+   bi_index reg;
+   bi_index x;
+   bi_index y;
+   bi_index negabsx;
+};
+
+TEST_F(Optimizer, FusedFABSNEG)
+{
    CASE(bi_fadd_f32_to(b, reg, bi_fabsneg_f32(b, bi_abs(x)), y, BI_ROUND_NONE),
         bi_fadd_f32_to(b, reg, bi_abs(x), y, BI_ROUND_NONE));
 
@@ -78,24 +91,24 @@ main(int argc, const char **argv)
    CASE(bi_fadd_f32_to(b, reg, bi_fabsneg_f32(b, x), y, BI_ROUND_NONE),
         bi_fadd_f32_to(b, reg, x, y, BI_ROUND_NONE));
 
-   /* Check absneg is fused on a variety of instructions */
-
    CASE(bi_fadd_f32_to(b, reg, bi_fabsneg_f32(b, negabsx), y, BI_ROUND_RTP),
         bi_fadd_f32_to(b, reg, negabsx, y, BI_ROUND_RTP));
 
    CASE(bi_fmin_f32_to(b, reg, bi_fabsneg_f32(b, negabsx), bi_neg(y)),
         bi_fmin_f32_to(b, reg, negabsx, bi_neg(y)));
+}
 
-   /* Check absneg is fused on fp16 */
-
+TEST_F(Optimizer, FusedFABSNEGForFP16)
+{
    CASE(bi_fadd_v2f16_to(b, reg, bi_fabsneg_v2f16(b, negabsx), y, BI_ROUND_RTP),
         bi_fadd_v2f16_to(b, reg, negabsx, y, BI_ROUND_RTP));
 
    CASE(bi_fmin_v2f16_to(b, reg, bi_fabsneg_v2f16(b, negabsx), bi_neg(y)),
         bi_fmin_v2f16_to(b, reg, negabsx, bi_neg(y)));
+}
 
-   /* Check that swizzles are composed for fp16 */
-
+TEST_F(Optimizer, SwizzlesComposedForFP16)
+{
    CASE(bi_fadd_v2f16_to(b, reg, bi_fabsneg_v2f16(b, bi_swz_16(negabsx, true, false)), y, BI_ROUND_RTP),
         bi_fadd_v2f16_to(b, reg, bi_swz_16(negabsx, true, false), y, BI_ROUND_RTP));
 
@@ -110,9 +123,11 @@ main(int argc, const char **argv)
 
    CASE(bi_fadd_v2f16_to(b, reg, bi_swz_16(bi_fabsneg_v2f16(b, bi_half(negabsx, true)), true, false), y, BI_ROUND_RTP),
         bi_fadd_v2f16_to(b, reg, bi_half(negabsx, true), y, BI_ROUND_RTP));
+}
 
+TEST_F(Optimizer, PreserveWidens)
+{
    /* Check that widens are passed through */
-
    CASE(bi_fadd_f32_to(b, reg, bi_fabsneg_f32(b, bi_half(negabsx, false)), y, BI_ROUND_NONE),
         bi_fadd_f32_to(b, reg, bi_half(negabsx, false), y, BI_ROUND_NONE));
 
@@ -121,22 +136,31 @@ main(int argc, const char **argv)
 
    CASE(bi_fadd_f32_to(b, reg, bi_fabsneg_f32(b, bi_half(x, true)), bi_fabsneg_f32(b, bi_half(x, false)), BI_ROUND_NONE),
         bi_fadd_f32_to(b, reg, bi_half(x, true), bi_half(x, false), BI_ROUND_NONE));
+}
 
+TEST_F(Optimizer, DoNotMixSizesForFABSNEG)
+{
    /* Refuse to mix sizes for fabsneg, that's wrong */
-
    NEGCASE(bi_fadd_f32_to(b, reg, bi_fabsneg_v2f16(b, negabsx), y, BI_ROUND_NONE));
    NEGCASE(bi_fadd_v2f16_to(b, reg, bi_fabsneg_f32(b, negabsx), y, BI_ROUND_NONE));
+}
 
+TEST_F(Optimizer, AvoidZeroAndFABSNEGFootguns)
+{
    /* It's tempting to use addition by 0.0 as the absneg primitive, but that
     * has footguns around signed zero and round modes. Check we don't
     * incorrectly fuse these rules. */
 
+   bi_index zero = bi_zero();
+
    NEGCASE(bi_fadd_f32_to(b, reg, bi_fadd_f32(b, bi_abs(x), zero, BI_ROUND_NONE), y, BI_ROUND_NONE));
    NEGCASE(bi_fadd_f32_to(b, reg, bi_fadd_f32(b, bi_neg(x), zero, BI_ROUND_NONE), y, BI_ROUND_NONE));
    NEGCASE(bi_fadd_f32_to(b, reg, bi_fadd_f32(b, bi_neg(bi_abs(x)), zero, BI_ROUND_NONE), y, BI_ROUND_NONE));
    NEGCASE(bi_fadd_f32_to(b, reg, bi_fadd_f32(b, x, zero, BI_ROUND_NONE), y, BI_ROUND_NONE));
+}
 
-   /* Check clamps are propagated */
+TEST_F(Optimizer, ClampsPropagated)
+{
    CASE({
       bi_instr *I = bi_fclamp_f32_to(b, reg, bi_fadd_f32(b, x, y, BI_ROUND_NONE));
       I->clamp = BI_CLAMP_CLAMP_0_INF;
@@ -152,8 +176,11 @@ main(int argc, const char **argv)
       bi_instr *I = bi_fadd_v2f16_to(b, reg, x, y, BI_ROUND_NONE);
       I->clamp = BI_CLAMP_CLAMP_0_1;
    });
+}
+
 
-   /* Check clamps are composed */
+TEST_F(Optimizer, ClampsComposed)
+{
    CASE({
       bi_instr *I = bi_fadd_f32_to(b, bi_temp(b->shader), x, y, BI_ROUND_NONE);
       bi_instr *J = bi_fclamp_f32_to(b, reg, I->dest[0]);
@@ -213,9 +240,10 @@ main(int argc, const char **argv)
       bi_instr *I = bi_fadd_v2f16_to(b, reg, x, y, BI_ROUND_NONE);
       I->clamp = BI_CLAMP_CLAMP_0_INF;
    });
+}
 
-   /* We can't mix sizes */
-
+TEST_F(Optimizer, DoNotMixSizesWhenClamping)
+{
    NEGCASE({
       bi_instr *I = bi_fclamp_f32_to(b, reg, bi_fadd_v2f16(b, x, y, BI_ROUND_NONE));
       I->clamp = BI_CLAMP_CLAMP_0_1;
@@ -225,6 +253,11 @@ main(int argc, const char **argv)
       bi_instr *I = bi_fclamp_v2f16_to(b, reg, bi_fadd_f32(b, x, y, BI_ROUND_NONE));
       I->clamp = BI_CLAMP_CLAMP_0_1;
    });
+}
+
+TEST_F(Optimizer, DoNotUseAdditionByZeroForClamps)
+{
+   bi_index zero = bi_zero();
 
    /* We can't use addition by 0.0 for clamps due to signed zeros. */
    NEGCASE({
@@ -236,9 +269,10 @@ main(int argc, const char **argv)
       bi_instr *I = bi_fadd_v2f16_to(b, reg, bi_fadd_v2f16(b, x, y, BI_ROUND_NONE), zero, BI_ROUND_NONE);
       I->clamp = BI_CLAMP_CLAMP_0_1;
    });
+}
 
-   /* Check that we fuse comparisons with DISCARD */
-
+TEST_F(Optimizer, FuseComparisonsWithDISCARD)
+{
    CASE(bi_discard_b32(b, bi_fcmp_f32(b, x, y, BI_CMPF_LE, BI_RESULT_TYPE_F1)),
         bi_discard_f32(b, x, y, BI_CMPF_LE));
 
@@ -258,11 +292,10 @@ main(int argc, const char **argv)
       CASE(bi_discard_b32(b, bi_half(bi_fcmp_v2f16(b, x, y, BI_CMPF_EQ, BI_RESULT_TYPE_M1), h)),
            bi_discard_f32(b, bi_half(x, h), bi_half(y, h), BI_CMPF_EQ));
    }
+}
 
-   /* Refuse to fuse special comparisons */
+TEST_F(Optimizer, DoNotFuseSpecialComparisons)
+{
    NEGCASE(bi_discard_b32(b, bi_fcmp_f32(b, x, y, BI_CMPF_GTLT, BI_RESULT_TYPE_F1)));
    NEGCASE(bi_discard_b32(b, bi_fcmp_f32(b, x, y, BI_CMPF_TOTAL, BI_RESULT_TYPE_F1)));
-
-   ralloc_free(ralloc_ctx);
-   TEST_END(nr_pass, nr_fail);
 }



More information about the mesa-commit mailing list