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)