Index: src/arm/lithium-arm.cc |
=================================================================== |
--- src/arm/lithium-arm.cc (revision 6471) |
+++ src/arm/lithium-arm.cc (working copy) |
@@ -25,6 +25,7 @@ |
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+#include "lithium-allocator-inl.h" |
#include "arm/lithium-arm.h" |
#include "arm/lithium-codegen-arm.h" |
@@ -56,6 +57,31 @@ |
} |
+#ifdef DEBUG |
+void LInstruction::VerifyCall() { |
+ // Call instructions can use only fixed registers as |
+ // temporaries and outputs because all registers |
+ // are blocked by the calling convention. |
+ // Inputs can use either fixed register or have a short lifetime (be |
+ // used at start of the instruction). |
+ ASSERT(Output() == NULL || |
+ LUnallocated::cast(Output())->HasFixedPolicy() || |
+ !LUnallocated::cast(Output())->HasRegisterPolicy()); |
+ for (UseIterator it(this); it.HasNext(); it.Advance()) { |
+ LOperand* operand = it.Next(); |
+ ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() || |
+ LUnallocated::cast(operand)->IsUsedAtStart() || |
+ !LUnallocated::cast(operand)->HasRegisterPolicy()); |
+ } |
+ for (TempIterator it(this); it.HasNext(); it.Advance()) { |
+ LOperand* operand = it.Next(); |
+ ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() || |
+ !LUnallocated::cast(operand)->HasRegisterPolicy()); |
+ } |
+} |
+#endif |
+ |
+ |
void LOsrEntry::MarkSpilledDoubleRegister(int allocation_index, |
LOperand* spill_operand) { |
ASSERT(spill_operand->IsDoubleStackSlot()); |
@@ -66,10 +92,9 @@ |
void LInstruction::PrintTo(StringStream* stream) { |
stream->Add("%s ", this->Mnemonic()); |
- if (HasResult()) { |
- PrintOutputOperandTo(stream); |
- } |
+ PrintOutputOperandTo(stream); |
+ |
PrintDataTo(stream); |
if (HasEnvironment()) { |
@@ -390,7 +415,7 @@ |
} |
-int LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { |
+void LChunk::AddInstruction(LInstruction* instr, HBasicBlock* block) { |
LGap* gap = new LGap(block); |
int index = -1; |
if (instr->IsControl()) { |
@@ -406,7 +431,6 @@ |
pointer_maps_.Add(instr->pointer_map()); |
instr->pointer_map()->set_lithium_position(index); |
} |
- return index; |
} |
@@ -656,7 +680,10 @@ |
LInstruction* LChunkBuilder::MarkAsCall(LInstruction* instr, |
HInstruction* hinstr, |
CanDeoptimize can_deoptimize) { |
- allocator_->MarkAsCall(); |
+#ifdef DEBUG |
+ instr->VerifyCall(); |
+#endif |
+ instr->MarkAsCall(); |
instr = AssignPointerMap(instr); |
if (hinstr->HasSideEffects()) { |
@@ -681,7 +708,7 @@ |
LInstruction* LChunkBuilder::MarkAsSaveDoubles(LInstruction* instr) { |
- allocator_->MarkAsSaveDoubles(); |
+ instr->MarkAsSaveDoubles(); |
return instr; |
} |
@@ -871,7 +898,6 @@ |
void LChunkBuilder::VisitInstruction(HInstruction* current) { |
HInstruction* old_current = current_instruction_; |
current_instruction_ = current; |
- allocator_->BeginInstruction(); |
if (current->has_position()) position_ = current->position(); |
LInstruction* instr = current->CompileToLithium(this); |
@@ -894,11 +920,7 @@ |
instr->set_hydrogen_value(current); |
} |
- int index = chunk_->AddInstruction(instr, current_block_); |
- allocator_->SummarizeInstruction(index); |
- } else { |
- // This instruction should be omitted. |
- allocator_->OmitInstruction(); |
+ chunk_->AddInstruction(instr, current_block_); |
} |
current_instruction_ = old_current; |
} |