Edit

IABSD.fr/xenocara/lib/mesa/src/amd/compiler/tests/test_hard_clause.cpp

Branch :

  • Show log

    Commit

  • Author : jsg
    Date : 2025-06-05 11:23:11
    Hash : 67d6f117
    Message : Import Mesa 25.0.7

  • lib/mesa/src/amd/compiler/tests/test_hard_clause.cpp
  • /*
     * Copyright © 2020 Valve Corporation
     *
     * SPDX-License-Identifier: MIT
     */
    #include "helpers.h"
    #include "sid.h"
    
    using namespace aco;
    
    static void
    create_mubuf(Temp desc = Temp(0, s8))
    {
       Operand desc_op(desc);
       desc_op.setFixed(PhysReg(0));
       bld.mubuf(aco_opcode::buffer_load_dword, Definition(PhysReg(256), v1), desc_op,
                 Operand(PhysReg(256), v1), Operand::zero(), 0, false);
    }
    
    static void
    create_mubuf_store()
    {
       bld.mubuf(aco_opcode::buffer_store_dword, Operand(PhysReg(0), s4), Operand(PhysReg(256), v1),
                 Operand(PhysReg(256), v1), Operand::zero(), 0, false);
    }
    
    static void
    create_mtbuf(Temp desc = Temp(0, s8))
    {
       Operand desc_op(desc);
       desc_op.setFixed(PhysReg(0));
       bld.mtbuf(aco_opcode::tbuffer_load_format_x, Definition(PhysReg(256), v1), desc_op,
                 Operand(PhysReg(256), v1), Operand::zero(), V_008F0C_BUF_DATA_FORMAT_32,
                 V_008F0C_BUF_NUM_FORMAT_FLOAT, 0, false);
    }
    
    static void
    create_flat()
    {
       bld.flat(aco_opcode::flat_load_dword, Definition(PhysReg(256), v1), Operand(PhysReg(256), v2),
                Operand(s2));
    }
    
    static void
    create_global()
    {
       bld.global(aco_opcode::global_load_dword, Definition(PhysReg(256), v1),
                  Operand(PhysReg(256), v2), Operand(s2));
    }
    
    static void
    create_mimg(bool nsa, Temp desc = Temp(0, s8))
    {
       aco_ptr<Instruction> mimg{create_instruction(aco_opcode::image_sample, Format::MIMG, 5, 1)};
       mimg->definitions[0] = Definition(PhysReg(256), v1);
       mimg->operands[0] = Operand(desc);
       mimg->operands[0].setFixed(PhysReg(0));
       mimg->operands[1] = Operand(PhysReg(0), s4);
       mimg->operands[2] = Operand(v1);
       for (unsigned i = 0; i < 2; i++)
          mimg->operands[3 + i] = Operand(PhysReg(256 + (nsa ? i * 2 : i)), v1);
       mimg->mimg().dmask = 0x1;
       mimg->mimg().dim = ac_image_2d;
    
       bld.insert(std::move(mimg));
    }
    
    static void
    create_smem()
    {
       bld.smem(aco_opcode::s_load_dword, Definition(PhysReg(0), s1), Operand(PhysReg(0), s2),
                Operand::zero());
    }
    
    static void
    create_smem_buffer(Temp desc = Temp(0, s4))
    {
       Operand desc_op(desc);
       desc_op.setFixed(PhysReg(0));
       bld.smem(aco_opcode::s_buffer_load_dword, Definition(PhysReg(0), s1), desc_op, Operand::zero());
    }
    
    BEGIN_TEST(form_hard_clauses.type_restrictions)
       if (!setup_cs(NULL, GFX10))
          return;
    
       //>> p_unit_test 0
       //! s_clause imm:1
       //; search_re('image_sample')
       //; search_re('image_sample')
       bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
       create_mimg(false);
       create_mimg(false);
    
       //>> p_unit_test 1
       //! s_clause imm:1
       //; search_re('buffer_load_dword')
       //; search_re('buffer_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
       create_mubuf();
       create_mubuf();
    
       //>> p_unit_test 2
       //! s_clause imm:1
       //; search_re('global_load_dword')
       //; search_re('global_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
       create_global();
       create_global();
    
       //>> p_unit_test 3
       //! s_clause imm:1
       //; search_re('flat_load_dword')
       //; search_re('flat_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
       create_flat();
       create_flat();
    
       //>> p_unit_test 4
       //! s_clause imm:1
       //; search_re('s_load_dword')
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
       create_smem();
       create_smem();
    
       //>> p_unit_test 5
       //; search_re('buffer_load_dword')
       //; search_re('flat_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
       create_mubuf();
       create_flat();
    
       //>> p_unit_test 6
       //; search_re('buffer_load_dword')
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
       create_mubuf();
       create_smem();
    
       //>> p_unit_test 7
       //; search_re('flat_load_dword')
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
       create_flat();
       create_smem();
    
       finish_form_hard_clause_test();
    END_TEST
    
    BEGIN_TEST(form_hard_clauses.size)
       if (!setup_cs(NULL, GFX10))
          return;
    
       //>> p_unit_test 0
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
       create_smem();
    
       //>> p_unit_test 1
       //! s_clause imm:62
       //; for i in range(63):
       //;    search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
       for (unsigned i = 0; i < 63; i++)
          create_smem();
    
       //>> p_unit_test 2
       //! s_clause imm:62
       //; for i in range(64):
       //;    search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
       for (unsigned i = 0; i < 64; i++)
          create_smem();
    
       //>> p_unit_test 3
       //! s_clause imm:62
       //; for i in range(63):
       //;    search_re('s_load_dword')
       //! s_clause imm:1
       //; search_re('s_load_dword')
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
       for (unsigned i = 0; i < 65; i++)
          create_smem();
    
       finish_form_hard_clause_test();
    END_TEST
    
    BEGIN_TEST(form_hard_clauses.nsa)
       for (unsigned i = GFX10; i <= GFX10_3; i++) {
          if (!setup_cs(NULL, (amd_gfx_level)i))
             continue;
    
          //>> p_unit_test 0
          //! s_clause imm:1
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
          bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
          create_mimg(false);
          create_mimg(false);
    
          //>> p_unit_test 1
          //~gfx10_3! s_clause imm:1
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
          bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
          create_mimg(false);
          create_mimg(true);
    
          //>> p_unit_test 2
          //~gfx10_3! s_clause imm:1
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
          //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
          bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
          create_mimg(true);
          create_mimg(true);
    
          finish_form_hard_clause_test();
       }
    END_TEST
    
    BEGIN_TEST(form_hard_clauses.heuristic)
       if (!setup_cs(NULL, GFX10))
          return;
    
       Temp img_desc0 = bld.tmp(s8);
       Temp img_desc1 = bld.tmp(s8);
       Temp buf_desc0 = bld.tmp(s4);
       Temp buf_desc1 = bld.tmp(s4);
    
       /* Don't form clause with different descriptors */
       //>> p_unit_test 0
       //! s_clause imm:1
       //; search_re('image_sample')
       //; search_re('image_sample')
       bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
       create_mimg(false, img_desc0);
       create_mimg(false, img_desc0);
    
       //>> p_unit_test 1
       //; search_re('image_sample')
       //; search_re('image_sample')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
       create_mimg(false, img_desc0);
       create_mimg(false, img_desc1);
    
       //>> p_unit_test 2
       //! s_clause imm:1
       //; search_re('buffer_load_dword')
       //; search_re('buffer_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
       create_mubuf(buf_desc0);
       create_mubuf(buf_desc0);
    
       //>> p_unit_test 3
       //; search_re('buffer_load_dword')
       //; search_re('buffer_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
       create_mubuf(buf_desc0);
       create_mubuf(buf_desc1);
    
       //>> p_unit_test 4
       //! s_clause imm:1
       //; search_re('s_buffer_load_dword')
       //; search_re('s_buffer_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
       create_smem_buffer(buf_desc0);
       create_smem_buffer(buf_desc0);
    
       //>> p_unit_test 5
       //; search_re('s_buffer_load_dword')
       //; search_re('s_buffer_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
       create_smem_buffer(buf_desc0);
       create_smem_buffer(buf_desc1);
    
       //>> p_unit_test 6
       //; search_re('s_buffer_load_dword')
       //; search_re('s_load_dword')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
       create_smem_buffer(buf_desc0);
       create_smem();
    
       /* Only form clause between MUBUF and MTBUF if they load from the same binding. Ignore descriptor
        * if they're te same binding.
        */
       //>> p_unit_test 7
       //; search_re('buffer_load_dword')
       //; search_re('tbuffer_load_format_x')
       bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
       create_mubuf(buf_desc0);
       create_mtbuf(buf_desc0);
    
       finish_form_hard_clause_test();
    END_TEST
    
    BEGIN_TEST(form_hard_clauses.stores)
       for (amd_gfx_level gfx : {GFX10, GFX11}) {
          if (!setup_cs(NULL, gfx))
             continue;
    
          //>> p_unit_test 0
          //~gfx11! s_clause imm:1
          //; search_re('buffer_store_dword')
          //; search_re('buffer_store_dword')
          bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
          create_mubuf_store();
          create_mubuf_store();
    
          //>> p_unit_test 1
          //! s_clause imm:1
          //; search_re('buffer_load_dword')
          //; search_re('buffer_load_dword')
          //; search_re('buffer_store_dword')
          bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
          create_mubuf();
          create_mubuf();
          create_mubuf_store();
    
          //>> p_unit_test 2
          //; search_re('buffer_store_dword')
          //! s_clause imm:1
          //; search_re('buffer_load_dword')
          //; search_re('buffer_load_dword')
          bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
          create_mubuf_store();
          create_mubuf();
          create_mubuf();
    
          /* Unclear whether this is the best behaviour */
          //>> p_unit_test 3
          //; search_re('buffer_load_dword')
          //; search_re('buffer_store_dword')
          //; search_re('buffer_load_dword')
          bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
          create_mubuf();
          create_mubuf_store();
          create_mubuf();
    
          finish_form_hard_clause_test();
       }
    END_TEST