xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/test/test-repair-ssa.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2024 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Collabora, Ltd.
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include "agx_builder.h"
8*61046927SAndroid Build Coastguard Worker #include "agx_compiler.h"
9*61046927SAndroid Build Coastguard Worker #include "agx_test.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker static void
pass(agx_context * ctx)14*61046927SAndroid Build Coastguard Worker pass(agx_context *ctx)
15*61046927SAndroid Build Coastguard Worker {
16*61046927SAndroid Build Coastguard Worker    agx_repair_ssa(ctx);
17*61046927SAndroid Build Coastguard Worker    agx_reindex_ssa(ctx);
18*61046927SAndroid Build Coastguard Worker }
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #define CASE(instr)                                                            \
21*61046927SAndroid Build Coastguard Worker    INSTRUCTION_CASE(                                                           \
22*61046927SAndroid Build Coastguard Worker       {                                                                        \
23*61046927SAndroid Build Coastguard Worker          bool repaired = false;                                                \
24*61046927SAndroid Build Coastguard Worker          instr                                                                 \
25*61046927SAndroid Build Coastguard Worker       },                                                                       \
26*61046927SAndroid Build Coastguard Worker       {                                                                        \
27*61046927SAndroid Build Coastguard Worker          bool repaired = true;                                                 \
28*61046927SAndroid Build Coastguard Worker          instr                                                                 \
29*61046927SAndroid Build Coastguard Worker       },                                                                       \
30*61046927SAndroid Build Coastguard Worker       pass)
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker class RepairSSA : public testing::Test {
33*61046927SAndroid Build Coastguard Worker  protected:
RepairSSA()34*61046927SAndroid Build Coastguard Worker    RepairSSA()
35*61046927SAndroid Build Coastguard Worker    {
36*61046927SAndroid Build Coastguard Worker       mem_ctx = ralloc_context(NULL);
37*61046927SAndroid Build Coastguard Worker    }
38*61046927SAndroid Build Coastguard Worker 
~RepairSSA()39*61046927SAndroid Build Coastguard Worker    ~RepairSSA()
40*61046927SAndroid Build Coastguard Worker    {
41*61046927SAndroid Build Coastguard Worker       ralloc_free(mem_ctx);
42*61046927SAndroid Build Coastguard Worker    }
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    void *mem_ctx;
45*61046927SAndroid Build Coastguard Worker };
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker static agx_index
agx_phi_2(agx_builder * b,agx_index x,agx_index y)48*61046927SAndroid Build Coastguard Worker agx_phi_2(agx_builder *b, agx_index x, agx_index y)
49*61046927SAndroid Build Coastguard Worker {
50*61046927SAndroid Build Coastguard Worker    agx_index idx = agx_temp(b->shader, x.size);
51*61046927SAndroid Build Coastguard Worker    agx_instr *phi = agx_phi_to(b, idx, 2);
52*61046927SAndroid Build Coastguard Worker    phi->src[0] = x;
53*61046927SAndroid Build Coastguard Worker    phi->src[1] = y;
54*61046927SAndroid Build Coastguard Worker    return idx;
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker 
TEST_F(RepairSSA,Local)57*61046927SAndroid Build Coastguard Worker TEST_F(RepairSSA, Local)
58*61046927SAndroid Build Coastguard Worker {
59*61046927SAndroid Build Coastguard Worker    CASE({
60*61046927SAndroid Build Coastguard Worker       agx_index x = agx_mov_imm(b, AGX_SIZE_32, 0xcafe);
61*61046927SAndroid Build Coastguard Worker       agx_index y = agx_mov_imm(b, AGX_SIZE_32, 0xefac);
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker       if (repaired) {
64*61046927SAndroid Build Coastguard Worker          agx_unit_test(b, agx_fadd(b, y, x));
65*61046927SAndroid Build Coastguard Worker       } else {
66*61046927SAndroid Build Coastguard Worker          agx_fadd_to(b, x, y, x);
67*61046927SAndroid Build Coastguard Worker          agx_unit_test(b, x);
68*61046927SAndroid Build Coastguard Worker       }
69*61046927SAndroid Build Coastguard Worker    });
70*61046927SAndroid Build Coastguard Worker }
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker /*      A
73*61046927SAndroid Build Coastguard Worker  *     / \
74*61046927SAndroid Build Coastguard Worker  *    B   C
75*61046927SAndroid Build Coastguard Worker  *     \ /
76*61046927SAndroid Build Coastguard Worker  *      D
77*61046927SAndroid Build Coastguard Worker  */
TEST_F(RepairSSA,IfElse)78*61046927SAndroid Build Coastguard Worker TEST_F(RepairSSA, IfElse)
79*61046927SAndroid Build Coastguard Worker {
80*61046927SAndroid Build Coastguard Worker    CASE({
81*61046927SAndroid Build Coastguard Worker       agx_block *A = agx_start_block(b->shader);
82*61046927SAndroid Build Coastguard Worker       agx_block *B = agx_test_block(b->shader);
83*61046927SAndroid Build Coastguard Worker       agx_block *C = agx_test_block(b->shader);
84*61046927SAndroid Build Coastguard Worker       agx_block *D = agx_test_block(b->shader);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker       agx_block_add_successor(A, B);
87*61046927SAndroid Build Coastguard Worker       agx_block_add_successor(A, C);
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker       agx_block_add_successor(B, D);
90*61046927SAndroid Build Coastguard Worker       agx_block_add_successor(C, D);
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker       b->cursor = agx_after_block(B);
93*61046927SAndroid Build Coastguard Worker       agx_index x = agx_mov_imm(b, 32, 0xcafe);
94*61046927SAndroid Build Coastguard Worker       agx_index y = agx_mov_imm(b, 32, 0xbade);
95*61046927SAndroid Build Coastguard Worker 
96*61046927SAndroid Build Coastguard Worker       b->cursor = agx_after_block(C);
97*61046927SAndroid Build Coastguard Worker       agx_index x2 = repaired ? agx_temp(b->shader, AGX_SIZE_32) : x;
98*61046927SAndroid Build Coastguard Worker       agx_mov_imm_to(b, x2, 0xefac);
99*61046927SAndroid Build Coastguard Worker       agx_index y2 = agx_mov_imm(b, 32, 0xbade);
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker       b->cursor = agx_after_block(D);
102*61046927SAndroid Build Coastguard Worker       if (repaired)
103*61046927SAndroid Build Coastguard Worker          x = agx_phi_2(b, x, x2);
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker       agx_index y3 = agx_phi_2(b, y, y2);
106*61046927SAndroid Build Coastguard Worker       agx_unit_test(b, agx_fadd(b, x, y3));
107*61046927SAndroid Build Coastguard Worker    });
108*61046927SAndroid Build Coastguard Worker }
109