diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2015-05-07 08:57:23 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-05-07 08:57:23 +0000 |
commit | 46a4b26855ae9fcd14c6e4435f37f09ceb134f61 (patch) | |
tree | 8b7914435ad1ba519a3d88b5cca7f0f6e842cd4f /compiler/optimizing/code_generator_arm.cc | |
parent | bc3b93eadd155342b6124d2d5ef3806ecec5dfd6 (diff) | |
parent | db216f4d49ea1561a74261c29f1264952232728a (diff) | |
download | art-46a4b26855ae9fcd14c6e4435f37f09ceb134f61.tar.gz art-46a4b26855ae9fcd14c6e4435f37f09ceb134f61.tar.bz2 art-46a4b26855ae9fcd14c6e4435f37f09ceb134f61.zip |
Merge "Relax the only one back-edge restriction."
Diffstat (limited to 'compiler/optimizing/code_generator_arm.cc')
-rw-r--r-- | compiler/optimizing/code_generator_arm.cc | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/compiler/optimizing/code_generator_arm.cc b/compiler/optimizing/code_generator_arm.cc index e4c37deb8b..f56e446605 100644 --- a/compiler/optimizing/code_generator_arm.cc +++ b/compiler/optimizing/code_generator_arm.cc @@ -112,6 +112,10 @@ class SuspendCheckSlowPathARM : public SlowPathCodeARM { return &return_label_; } + HBasicBlock* GetSuccessor() const { + return successor_; + } + private: HSuspendCheck* const instruction_; // If not null, the block to branch to after the suspend check. @@ -3539,8 +3543,18 @@ void InstructionCodeGeneratorARM::VisitSuspendCheck(HSuspendCheck* instruction) void InstructionCodeGeneratorARM::GenerateSuspendCheck(HSuspendCheck* instruction, HBasicBlock* successor) { SuspendCheckSlowPathARM* slow_path = - new (GetGraph()->GetArena()) SuspendCheckSlowPathARM(instruction, successor); - codegen_->AddSlowPath(slow_path); + down_cast<SuspendCheckSlowPathARM*>(instruction->GetSlowPath()); + if (slow_path == nullptr) { + slow_path = new (GetGraph()->GetArena()) SuspendCheckSlowPathARM(instruction, successor); + instruction->SetSlowPath(slow_path); + codegen_->AddSlowPath(slow_path); + if (successor != nullptr) { + DCHECK(successor->IsLoopHeader()); + codegen_->ClearSpillSlotsFromLoopPhisInStackMap(instruction); + } + } else { + DCHECK_EQ(slow_path->GetSuccessor(), successor); + } __ LoadFromOffset( kLoadUnsignedHalfword, IP, TR, Thread::ThreadFlagsOffset<kArmWordSize>().Int32Value()); |