From 0fbd0e8cc71e0c11e77a0ab1d3bf2dbc81286130 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Sun, 23 Nov 2025 21:51:42 +0300 Subject: [PATCH] rsx/gtest: Add tests for CFG BB succ edges and fix UT failures --- rpcs3/Emu/RSX/Program/Assembler/IR.h | 4 ++-- rpcs3/tests/test_rsx_cfg.cpp | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/RSX/Program/Assembler/IR.h b/rpcs3/Emu/RSX/Program/Assembler/IR.h index 1f1c1d81d8..65960f3d99 100644 --- a/rpcs3/Emu/RSX/Program/Assembler/IR.h +++ b/rpcs3/Emu/RSX/Program/Assembler/IR.h @@ -72,8 +72,8 @@ namespace rsx::assembler { u32 id = 0; std::vector instructions; // Program instructions for the RSX processor - std::vector succ; // [0] = if/loop, [1] = else - std::vector pred; // Back edge. + std::vector succ; // Forward edges. Sorted closest first. + std::vector pred; // Back edges. Sorted closest first. std::vector prologue; // Prologue, created by passes std::vector epilogue; // Epilogue, created by passes diff --git a/rpcs3/tests/test_rsx_cfg.cpp b/rpcs3/tests/test_rsx_cfg.cpp index b5969081d9..905ac5a049 100644 --- a/rpcs3/tests/test_rsx_cfg.cpp +++ b/rpcs3/tests/test_rsx_cfg.cpp @@ -72,7 +72,8 @@ namespace rsx::assembler EXPECT_EQ(graph.blocks.size(), 1); EXPECT_EQ(graph.blocks.front().instructions.size(), 2); EXPECT_EQ(graph.blocks.front().instructions.front().length, 4); - EXPECT_NE(graph.blocks.front().instructions.front().addr, 0); + EXPECT_EQ(graph.blocks.front().instructions[0].addr, 0); + EXPECT_EQ(graph.blocks.front().instructions[1].addr, 16); } TEST(CFG, FpToCFG_IF) @@ -192,6 +193,13 @@ namespace rsx::assembler EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 6))->pred[0].from->id, 3); EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 6))->pred[1].type, EdgeType::ENDIF); EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 6))->pred[1].from->id, 0); + + // Successors must also be ordered, closest first + ASSERT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 0))->succ.size(), 2); + EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 0))->succ[0].type, EdgeType::IF); + EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 0))->succ[0].to->id, 3); + EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 0))->succ[1].type, EdgeType::ENDIF); + EXPECT_EQ(std::find_if(graph.blocks.begin(), graph.blocks.end(), FN(x.id == 0))->succ[1].to->id, 6); } TEST(CFG, FpToCFG_IF_ELSE)