summaryrefslogtreecommitdiff
path: root/compiler/optimizing/licm_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/licm_test.cc')
-rw-r--r--compiler/optimizing/licm_test.cc52
1 files changed, 8 insertions, 44 deletions
diff --git a/compiler/optimizing/licm_test.cc b/compiler/optimizing/licm_test.cc
index 58d90c3168..08a2dcc179 100644
--- a/compiler/optimizing/licm_test.cc
+++ b/compiler/optimizing/licm_test.cc
@@ -31,12 +31,9 @@ namespace art HIDDEN {
class LICMTest : public OptimizingUnitTest {
public:
LICMTest()
- : entry_(nullptr),
- loop_preheader_(nullptr),
+ : loop_preheader_(nullptr),
loop_header_(nullptr),
loop_body_(nullptr),
- return_(nullptr),
- exit_(nullptr),
parameter_(nullptr),
int_constant_(nullptr),
float_constant_(nullptr) {
@@ -48,40 +45,15 @@ class LICMTest : public OptimizingUnitTest {
// Builds a singly-nested loop structure in CFG. Tests can further populate
// the basic blocks with instructions to set up interesting scenarios.
void BuildLoop() {
- entry_ = new (GetAllocator()) HBasicBlock(graph_);
- loop_preheader_ = new (GetAllocator()) HBasicBlock(graph_);
- loop_header_ = new (GetAllocator()) HBasicBlock(graph_);
- loop_body_ = new (GetAllocator()) HBasicBlock(graph_);
- return_ = new (GetAllocator()) HBasicBlock(graph_);
- exit_ = new (GetAllocator()) HBasicBlock(graph_);
-
- graph_->AddBlock(entry_);
- graph_->AddBlock(loop_preheader_);
- graph_->AddBlock(loop_header_);
- graph_->AddBlock(loop_body_);
- graph_->AddBlock(return_);
- graph_->AddBlock(exit_);
-
- graph_->SetEntryBlock(entry_);
- graph_->SetExitBlock(exit_);
-
- // Set up loop flow in CFG.
- entry_->AddSuccessor(loop_preheader_);
- loop_preheader_->AddSuccessor(loop_header_);
- loop_header_->AddSuccessor(loop_body_);
- loop_header_->AddSuccessor(return_);
- loop_body_->AddSuccessor(loop_header_);
- return_->AddSuccessor(exit_);
+ HBasicBlock* return_block = InitEntryMainExitGraphWithReturnVoid();
+ std::tie(loop_preheader_, loop_header_, loop_body_) = CreateWhileLoop(return_block);
+ loop_header_->SwapSuccessors(); // Move the loop exit to the "else" successor.
// Provide boiler-plate instructions.
parameter_ = MakeParam(DataType::Type::kReference);
int_constant_ = graph_->GetIntConstant(42);
float_constant_ = graph_->GetFloatConstant(42.0f);
- MakeGoto(loop_preheader_);
MakeIf(loop_header_, parameter_);
- MakeGoto(loop_body_);
- MakeReturnVoid(return_);
- MakeExit(exit_);
}
// Performs LICM optimizations (after proper set up).
@@ -92,16 +64,10 @@ class LICMTest : public OptimizingUnitTest {
LICM(graph_, side_effects, nullptr).Run();
}
- // General building fields.
- HGraph* graph_;
-
// Specific basic blocks.
- HBasicBlock* entry_;
HBasicBlock* loop_preheader_;
HBasicBlock* loop_header_;
HBasicBlock* loop_body_;
- HBasicBlock* return_;
- HBasicBlock* exit_;
HInstruction* parameter_; // "this"
HInstruction* int_constant_;
@@ -164,12 +130,10 @@ TEST_F(LICMTest, NoArrayHoisting) {
BuildLoop();
// Populate the loop with instructions: set/get array with same types.
- HInstruction* get_array = new (GetAllocator()) HArrayGet(
- parameter_, int_constant_, DataType::Type::kFloat32, 0);
- loop_body_->InsertInstructionBefore(get_array, loop_body_->GetLastInstruction());
- HInstruction* set_array = new (GetAllocator()) HArraySet(
- parameter_, get_array, float_constant_, DataType::Type::kFloat32, 0);
- loop_body_->InsertInstructionBefore(set_array, loop_body_->GetLastInstruction());
+ HInstruction* get_array =
+ MakeArrayGet(loop_body_, parameter_, int_constant_, DataType::Type::kFloat32);
+ HInstruction* set_array =
+ MakeArraySet(loop_body_, parameter_, get_array, float_constant_, DataType::Type::kFloat32);
EXPECT_EQ(get_array->GetBlock(), loop_body_);
EXPECT_EQ(set_array->GetBlock(), loop_body_);