Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(264)

Side by Side Diff: src/arm64/lithium-arm64.cc

Issue 308593003: Simplify known successor block lowering. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm64/lithium-arm64.h ('k') | src/ia32/lithium-ia32.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "v8.h" 5 #include "v8.h"
6 6
7 #include "lithium-allocator-inl.h" 7 #include "lithium-allocator-inl.h"
8 #include "arm64/lithium-arm64.h" 8 #include "arm64/lithium-arm64.h"
9 #include "arm64/lithium-codegen-arm64.h" 9 #include "arm64/lithium-codegen-arm64.h"
10 #include "hydrogen-osr.h" 10 #include "hydrogen-osr.h"
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 LDummyUse(UseAny(current->OperandAt(0)))); 665 LDummyUse(UseAny(current->OperandAt(0))));
666 } 666 }
667 for (int i = 1; i < current->OperandCount(); ++i) { 667 for (int i = 1; i < current->OperandCount(); ++i) {
668 if (current->OperandAt(i)->IsControlInstruction()) continue; 668 if (current->OperandAt(i)->IsControlInstruction()) continue;
669 LInstruction* dummy = 669 LInstruction* dummy =
670 new(zone()) LDummyUse(UseAny(current->OperandAt(i))); 670 new(zone()) LDummyUse(UseAny(current->OperandAt(i)));
671 dummy->set_hydrogen_value(current); 671 dummy->set_hydrogen_value(current);
672 chunk_->AddInstruction(dummy, current_block_); 672 chunk_->AddInstruction(dummy, current_block_);
673 } 673 }
674 } else { 674 } else {
675 instr = current->CompileToLithium(this); 675 HBasicBlock* successor;
676 if (current->IsControlInstruction() &&
677 HControlInstruction::cast(current)->KnownSuccessorBlock(&successor) &&
678 successor != NULL) {
679 instr = new(zone()) LGoto(successor);
680 } else {
681 instr = current->CompileToLithium(this);
682 }
676 } 683 }
677 684
678 argument_count_ += current->argument_delta(); 685 argument_count_ += current->argument_delta();
679 ASSERT(argument_count_ >= 0); 686 ASSERT(argument_count_ >= 0);
680 687
681 if (instr != NULL) { 688 if (instr != NULL) {
682 AddInstruction(instr, current); 689 AddInstruction(instr, current);
683 } 690 }
684 691
685 current_instruction_ = old_current; 692 current_instruction_ = old_current;
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
965 : UseRegisterAtStart(instr->length()); 972 : UseRegisterAtStart(instr->length());
966 LInstruction* result = new(zone()) LBoundsCheck(index, length); 973 LInstruction* result = new(zone()) LBoundsCheck(index, length);
967 if (!FLAG_debug_code || !instr->skip_check()) { 974 if (!FLAG_debug_code || !instr->skip_check()) {
968 result = AssignEnvironment(result); 975 result = AssignEnvironment(result);
969 } 976 }
970 return result; 977 return result;
971 } 978 }
972 979
973 980
974 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { 981 LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
975 LInstruction* goto_instr = CheckElideControlInstruction(instr);
976 if (goto_instr != NULL) return goto_instr;
977
978 HValue* value = instr->value(); 982 HValue* value = instr->value();
979 Representation r = value->representation(); 983 Representation r = value->representation();
980 HType type = value->type(); 984 HType type = value->type();
981 985
982 if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) { 986 if (r.IsInteger32() || r.IsSmi() || r.IsDouble()) {
983 // These representations have simple checks that cannot deoptimize. 987 // These representations have simple checks that cannot deoptimize.
984 return new(zone()) LBranch(UseRegister(value), NULL, NULL); 988 return new(zone()) LBranch(UseRegister(value), NULL, NULL);
985 } else { 989 } else {
986 ASSERT(r.IsTagged()); 990 ASSERT(r.IsTagged());
987 if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() || 991 if (type.IsBoolean() || type.IsSmi() || type.IsJSArray() ||
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 ASSERT(instr->value()->representation().IsTagged()); 1256 ASSERT(instr->value()->representation().IsTagged());
1253 LOperand* value = UseRegisterAtStart(instr->value()); 1257 LOperand* value = UseRegisterAtStart(instr->value());
1254 return new(zone()) LClassOfTestAndBranch(value, 1258 return new(zone()) LClassOfTestAndBranch(value,
1255 TempRegister(), 1259 TempRegister(),
1256 TempRegister()); 1260 TempRegister());
1257 } 1261 }
1258 1262
1259 1263
1260 LInstruction* LChunkBuilder::DoCompareNumericAndBranch( 1264 LInstruction* LChunkBuilder::DoCompareNumericAndBranch(
1261 HCompareNumericAndBranch* instr) { 1265 HCompareNumericAndBranch* instr) {
1262 LInstruction* goto_instr = CheckElideControlInstruction(instr);
1263 if (goto_instr != NULL) return goto_instr;
1264 Representation r = instr->representation(); 1266 Representation r = instr->representation();
1265 if (r.IsSmiOrInteger32()) { 1267 if (r.IsSmiOrInteger32()) {
1266 ASSERT(instr->left()->representation().Equals(r)); 1268 ASSERT(instr->left()->representation().Equals(r));
1267 ASSERT(instr->right()->representation().Equals(r)); 1269 ASSERT(instr->right()->representation().Equals(r));
1268 LOperand* left = UseRegisterOrConstantAtStart(instr->left()); 1270 LOperand* left = UseRegisterOrConstantAtStart(instr->left());
1269 LOperand* right = UseRegisterOrConstantAtStart(instr->right()); 1271 LOperand* right = UseRegisterOrConstantAtStart(instr->right());
1270 return new(zone()) LCompareNumericAndBranch(left, right); 1272 return new(zone()) LCompareNumericAndBranch(left, right);
1271 } else { 1273 } else {
1272 ASSERT(r.IsDouble()); 1274 ASSERT(r.IsDouble());
1273 ASSERT(instr->left()->representation().IsDouble()); 1275 ASSERT(instr->left()->representation().IsDouble());
(...skipping 30 matching lines...) Expand all
1304 return new(zone()) LCmpHoleAndBranchT(value); 1306 return new(zone()) LCmpHoleAndBranchT(value);
1305 } else { 1307 } else {
1306 LOperand* temp = TempRegister(); 1308 LOperand* temp = TempRegister();
1307 return new(zone()) LCmpHoleAndBranchD(value, temp); 1309 return new(zone()) LCmpHoleAndBranchD(value, temp);
1308 } 1310 }
1309 } 1311 }
1310 1312
1311 1313
1312 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( 1314 LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
1313 HCompareObjectEqAndBranch* instr) { 1315 HCompareObjectEqAndBranch* instr) {
1314 LInstruction* goto_instr = CheckElideControlInstruction(instr);
1315 if (goto_instr != NULL) return goto_instr;
1316
1317 LOperand* left = UseRegisterAtStart(instr->left()); 1316 LOperand* left = UseRegisterAtStart(instr->left());
1318 LOperand* right = UseRegisterAtStart(instr->right()); 1317 LOperand* right = UseRegisterAtStart(instr->right());
1319 return new(zone()) LCmpObjectEqAndBranch(left, right); 1318 return new(zone()) LCmpObjectEqAndBranch(left, right);
1320 } 1319 }
1321 1320
1322 1321
1323 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { 1322 LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
1324 LInstruction* goto_instr = CheckElideControlInstruction(instr);
1325 if (goto_instr != NULL) return goto_instr;
1326
1327 ASSERT(instr->value()->representation().IsTagged()); 1323 ASSERT(instr->value()->representation().IsTagged());
1328 LOperand* value = UseRegisterAtStart(instr->value()); 1324 LOperand* value = UseRegisterAtStart(instr->value());
1329 LOperand* temp = TempRegister(); 1325 LOperand* temp = TempRegister();
1330 return new(zone()) LCmpMapAndBranch(value, temp); 1326 return new(zone()) LCmpMapAndBranch(value, temp);
1331 } 1327 }
1332 1328
1333 1329
1334 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { 1330 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1335 Representation r = instr->representation(); 1331 Representation r = instr->representation();
1336 if (r.IsSmi()) { 1332 if (r.IsSmi()) {
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
1570 1566
1571 1567
1572 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch( 1568 LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
1573 HIsConstructCallAndBranch* instr) { 1569 HIsConstructCallAndBranch* instr) {
1574 return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister()); 1570 return new(zone()) LIsConstructCallAndBranch(TempRegister(), TempRegister());
1575 } 1571 }
1576 1572
1577 1573
1578 LInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch( 1574 LInstruction* LChunkBuilder::DoCompareMinusZeroAndBranch(
1579 HCompareMinusZeroAndBranch* instr) { 1575 HCompareMinusZeroAndBranch* instr) {
1580 LInstruction* goto_instr = CheckElideControlInstruction(instr);
1581 if (goto_instr != NULL) return goto_instr;
1582 LOperand* value = UseRegister(instr->value()); 1576 LOperand* value = UseRegister(instr->value());
1583 LOperand* scratch = TempRegister(); 1577 LOperand* scratch = TempRegister();
1584 return new(zone()) LCompareMinusZeroAndBranch(value, scratch); 1578 return new(zone()) LCompareMinusZeroAndBranch(value, scratch);
1585 } 1579 }
1586 1580
1587 1581
1588 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) { 1582 LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1589 ASSERT(instr->value()->representation().IsTagged()); 1583 ASSERT(instr->value()->representation().IsTagged());
1590 LOperand* value = UseRegisterAtStart(instr->value()); 1584 LOperand* value = UseRegisterAtStart(instr->value());
1591 LOperand* temp1 = TempRegister(); 1585 LOperand* temp1 = TempRegister();
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
2548 // However, LCodeGen::DoTypeof just pushes it to the stack (for CallRuntime) 2542 // However, LCodeGen::DoTypeof just pushes it to the stack (for CallRuntime)
2549 // anyway, so the input doesn't have to be in x0. We might be able to improve 2543 // anyway, so the input doesn't have to be in x0. We might be able to improve
2550 // the ARM back-end a little by relaxing this restriction. 2544 // the ARM back-end a little by relaxing this restriction.
2551 LTypeof* result = 2545 LTypeof* result =
2552 new(zone()) LTypeof(context, UseRegisterAtStart(instr->value())); 2546 new(zone()) LTypeof(context, UseRegisterAtStart(instr->value()));
2553 return MarkAsCall(DefineFixed(result, x0), instr); 2547 return MarkAsCall(DefineFixed(result, x0), instr);
2554 } 2548 }
2555 2549
2556 2550
2557 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) { 2551 LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2558 LInstruction* goto_instr = CheckElideControlInstruction(instr);
2559 if (goto_instr != NULL) return goto_instr;
2560
2561 // We only need temp registers in some cases, but we can't dereference the 2552 // We only need temp registers in some cases, but we can't dereference the
2562 // instr->type_literal() handle to test that here. 2553 // instr->type_literal() handle to test that here.
2563 LOperand* temp1 = TempRegister(); 2554 LOperand* temp1 = TempRegister();
2564 LOperand* temp2 = TempRegister(); 2555 LOperand* temp2 = TempRegister();
2565 2556
2566 return new(zone()) LTypeofIsAndBranch( 2557 return new(zone()) LTypeofIsAndBranch(
2567 UseRegister(instr->value()), temp1, temp2); 2558 UseRegister(instr->value()), temp1, temp2);
2568 } 2559 }
2569 2560
2570 2561
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
2717 2708
2718 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { 2709 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) {
2719 LOperand* receiver = UseRegister(instr->receiver()); 2710 LOperand* receiver = UseRegister(instr->receiver());
2720 LOperand* function = UseRegister(instr->function()); 2711 LOperand* function = UseRegister(instr->function());
2721 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); 2712 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function);
2722 return AssignEnvironment(DefineAsRegister(result)); 2713 return AssignEnvironment(DefineAsRegister(result));
2723 } 2714 }
2724 2715
2725 2716
2726 } } // namespace v8::internal 2717 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-arm64.h ('k') | src/ia32/lithium-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698