mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 20:10:14 +01:00
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30169>
136 lines
2.9 KiB
C++
136 lines
2.9 KiB
C++
/*
|
|
* Copyright 2024 Intel Corporation
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
#include "brw_fs.h"
|
|
#include "brw_fs_builder.h"
|
|
#include "brw_cfg.h"
|
|
|
|
using namespace brw;
|
|
|
|
class cse_test : public ::testing::Test {
|
|
protected:
|
|
cse_test();
|
|
~cse_test() override;
|
|
|
|
struct brw_compiler *compiler;
|
|
struct brw_compile_params params;
|
|
struct intel_device_info *devinfo;
|
|
void *ctx;
|
|
struct brw_wm_prog_data *prog_data;
|
|
struct gl_shader_program *shader_prog;
|
|
fs_visitor *v;
|
|
fs_builder bld;
|
|
};
|
|
|
|
class cse_fs_visitor : public fs_visitor
|
|
{
|
|
public:
|
|
cse_fs_visitor(struct brw_compiler *compiler,
|
|
struct brw_compile_params *params,
|
|
struct brw_wm_prog_data *prog_data,
|
|
nir_shader *shader)
|
|
: fs_visitor(compiler, params, NULL,
|
|
&prog_data->base, shader, 16, false, false) {}
|
|
};
|
|
|
|
|
|
cse_test::cse_test()
|
|
: bld(NULL, 0)
|
|
{
|
|
ctx = ralloc_context(NULL);
|
|
compiler = rzalloc(ctx, struct brw_compiler);
|
|
devinfo = rzalloc(ctx, struct intel_device_info);
|
|
compiler->devinfo = devinfo;
|
|
|
|
params = {};
|
|
params.mem_ctx = ctx;
|
|
|
|
prog_data = ralloc(ctx, struct brw_wm_prog_data);
|
|
nir_shader *shader =
|
|
nir_shader_create(ctx, MESA_SHADER_FRAGMENT, NULL, NULL);
|
|
|
|
v = new cse_fs_visitor(compiler, ¶ms, prog_data, shader);
|
|
|
|
bld = fs_builder(v).at_end();
|
|
|
|
devinfo->verx10 = 125;
|
|
devinfo->ver = devinfo->verx10 / 10;
|
|
}
|
|
|
|
cse_test::~cse_test()
|
|
{
|
|
delete v;
|
|
v = NULL;
|
|
|
|
ralloc_free(ctx);
|
|
ctx = NULL;
|
|
}
|
|
|
|
|
|
static fs_inst *
|
|
instruction(bblock_t *block, int num)
|
|
{
|
|
fs_inst *inst = (fs_inst *)block->start();
|
|
for (int i = 0; i < num; i++) {
|
|
inst = (fs_inst *)inst->next;
|
|
}
|
|
return inst;
|
|
}
|
|
|
|
static bool
|
|
cse(fs_visitor *v)
|
|
{
|
|
const bool print = false;
|
|
|
|
if (print) {
|
|
fprintf(stderr, "= Before =\n");
|
|
v->cfg->dump();
|
|
}
|
|
|
|
bool ret = brw_fs_opt_cse_defs(*v);
|
|
|
|
if (print) {
|
|
fprintf(stderr, "\n= After =\n");
|
|
v->cfg->dump();
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
TEST_F(cse_test, add3_invalid)
|
|
{
|
|
brw_reg dst0 = bld.null_reg_d();
|
|
brw_reg src0 = bld.vgrf(BRW_TYPE_D);
|
|
brw_reg src1 = bld.vgrf(BRW_TYPE_D);
|
|
brw_reg src2 = bld.vgrf(BRW_TYPE_D);
|
|
brw_reg src3 = bld.vgrf(BRW_TYPE_D);
|
|
|
|
bld.ADD3(dst0, src0, src1, src2)
|
|
->conditional_mod = BRW_CONDITIONAL_NZ;
|
|
bld.ADD3(dst0, src0, src1, src3)
|
|
->conditional_mod = BRW_CONDITIONAL_NZ;
|
|
|
|
/* = Before =
|
|
*
|
|
* 0: add3.nz(16) null src0 src1 src2
|
|
* 1: add3.nz(16) null src0 src1 src3
|
|
*
|
|
* = After =
|
|
* Same
|
|
*/
|
|
|
|
brw_calculate_cfg(*v);
|
|
bblock_t *block0 = v->cfg->blocks[0];
|
|
|
|
EXPECT_EQ(0, block0->start_ip);
|
|
EXPECT_EQ(1, block0->end_ip);
|
|
|
|
EXPECT_FALSE(cse(v));
|
|
EXPECT_EQ(0, block0->start_ip);
|
|
EXPECT_EQ(1, block0->end_ip);
|
|
EXPECT_EQ(BRW_OPCODE_ADD3, instruction(block0, 0)->opcode);
|
|
EXPECT_EQ(BRW_OPCODE_ADD3, instruction(block0, 1)->opcode);
|
|
}
|