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

Side by Side Diff: src/compiler/simplified-lowering.cc

Issue 691513002: [turbofan] Introduce new Select operator to improve bounds checking. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 1 month 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/compiler/simplified-lowering.h ('k') | src/compiler/typer.cc » ('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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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 "src/compiler/simplified-lowering.h" 5 #include "src/compiler/simplified-lowering.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 void VisitInt64Binop(Node* node) { VisitBinop(node, kMachInt64, kMachInt64); } 292 void VisitInt64Binop(Node* node) { VisitBinop(node, kMachInt64, kMachInt64); }
293 void VisitUint64Binop(Node* node) { 293 void VisitUint64Binop(Node* node) {
294 VisitBinop(node, kMachUint64, kMachUint64); 294 VisitBinop(node, kMachUint64, kMachUint64);
295 } 295 }
296 void VisitFloat64Cmp(Node* node) { VisitBinop(node, kMachFloat64, kRepBit); } 296 void VisitFloat64Cmp(Node* node) { VisitBinop(node, kMachFloat64, kRepBit); }
297 void VisitInt32Cmp(Node* node) { VisitBinop(node, kMachInt32, kRepBit); } 297 void VisitInt32Cmp(Node* node) { VisitBinop(node, kMachInt32, kRepBit); }
298 void VisitUint32Cmp(Node* node) { VisitBinop(node, kMachUint32, kRepBit); } 298 void VisitUint32Cmp(Node* node) { VisitBinop(node, kMachUint32, kRepBit); }
299 void VisitInt64Cmp(Node* node) { VisitBinop(node, kMachInt64, kRepBit); } 299 void VisitInt64Cmp(Node* node) { VisitBinop(node, kMachInt64, kRepBit); }
300 void VisitUint64Cmp(Node* node) { VisitBinop(node, kMachUint64, kRepBit); } 300 void VisitUint64Cmp(Node* node) { VisitBinop(node, kMachUint64, kRepBit); }
301 301
302 // Helper for handling selects.
303 // TODO(turbofan): Share some code with VisitPhi() below?
304 void VisitSelect(Node* node, MachineTypeUnion use,
305 SimplifiedLowering* lowering) {
306 ProcessInput(node, 0, kRepBit);
307
308 // Selects adapt to the output representation their uses demand, pushing
309 // representation changes to their inputs.
310 Type* upper = NodeProperties::GetBounds(node).upper;
311 MachineType output = kMachNone;
312 MachineType propagate = kMachNone;
313
314 if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) {
315 // legal = kRepTagged | kRepFloat64 | kRepWord32;
316 if ((use & kRepMask) == kRepTagged) {
317 // only tagged uses.
318 output = kRepTagged;
319 propagate = kRepTagged;
320 } else if ((use & kRepMask) == kRepFloat64) {
321 // only float64 uses.
322 output = kRepFloat64;
323 propagate = kRepFloat64;
324 } else {
325 // multiple uses.
326 output = kRepWord32;
327 propagate = kRepWord32;
328 }
329 } else if (upper->Is(Type::Boolean())) {
330 // legal = kRepTagged | kRepBit;
331 if ((use & kRepMask) == kRepTagged) {
332 // only tagged uses.
333 output = kRepTagged;
334 propagate = kRepTagged;
335 } else {
336 // multiple uses.
337 output = kRepBit;
338 propagate = kRepBit;
339 }
340 } else if (upper->Is(Type::Number())) {
341 // legal = kRepTagged | kRepFloat64;
342 if ((use & kRepMask) == kRepTagged) {
343 // only tagged uses.
344 output = kRepTagged;
345 propagate = kRepTagged;
346 } else {
347 // multiple uses.
348 output = kRepFloat64;
349 propagate = kRepFloat64;
350 }
351 } else {
352 // legal = kRepTagged;
353 output = kRepTagged;
354 propagate = kRepTagged;
355 }
356
357 MachineType output_type =
358 static_cast<MachineType>(changer_->TypeFromUpperBound(upper) | output);
359 SetOutput(node, output_type);
360
361 if (lower()) {
362 // Update the select operator.
363 SelectParameters p = SelectParametersOf(node->op());
364 MachineType type = static_cast<MachineType>(output_type);
365 if (type != p.type()) {
366 node->set_op(lowering->common()->Select(type, p.hint()));
367 }
368
369 // Convert inputs to the output representation of this select.
370 ProcessInput(node, 1, output_type);
371 ProcessInput(node, 2, output_type);
372 } else {
373 // Propagate {use} of the select to value inputs.
374 MachineType use_type =
375 static_cast<MachineType>((use & kTypeMask) | propagate);
376 ProcessInput(node, 1, use_type);
377 ProcessInput(node, 2, use_type);
378 }
379 }
380
302 // Helper for handling phis. 381 // Helper for handling phis.
303 void VisitPhi(Node* node, MachineTypeUnion use, 382 void VisitPhi(Node* node, MachineTypeUnion use,
304 SimplifiedLowering* lowering) { 383 SimplifiedLowering* lowering) {
305 // Phis adapt to the output representation their uses demand, pushing 384 // Phis adapt to the output representation their uses demand, pushing
306 // representation changes to their inputs. 385 // representation changes to their inputs.
307 Type* upper = NodeProperties::GetBounds(node).upper; 386 Type* upper = NodeProperties::GetBounds(node).upper;
308 MachineType output = kMachNone; 387 MachineType output = kMachNone;
309 MachineType propagate = kMachNone; 388 MachineType propagate = kMachNone;
310 389
311 if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) { 390 if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) {
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 case IrOpcode::kIfFalse: 553 case IrOpcode::kIfFalse:
475 case IrOpcode::kReturn: 554 case IrOpcode::kReturn:
476 case IrOpcode::kMerge: 555 case IrOpcode::kMerge:
477 case IrOpcode::kThrow: 556 case IrOpcode::kThrow:
478 return VisitInputs(node); // default visit for all node inputs. 557 return VisitInputs(node); // default visit for all node inputs.
479 558
480 case IrOpcode::kBranch: 559 case IrOpcode::kBranch:
481 ProcessInput(node, 0, kRepBit); 560 ProcessInput(node, 0, kRepBit);
482 Enqueue(NodeProperties::GetControlInput(node, 0)); 561 Enqueue(NodeProperties::GetControlInput(node, 0));
483 break; 562 break;
563 case IrOpcode::kSelect:
564 return VisitSelect(node, use, lowering);
484 case IrOpcode::kPhi: 565 case IrOpcode::kPhi:
485 return VisitPhi(node, use, lowering); 566 return VisitPhi(node, use, lowering);
486 567
487 //------------------------------------------------------------------ 568 //------------------------------------------------------------------
488 // JavaScript operators. 569 // JavaScript operators.
489 //------------------------------------------------------------------ 570 //------------------------------------------------------------------
490 // For now, we assume that all JS operators were too complex to lower 571 // For now, we assume that all JS operators were too complex to lower
491 // to Simplified and that they will always require tagged value inputs 572 // to Simplified and that they will always require tagged value inputs
492 // and produce tagged value outputs. 573 // and produce tagged value outputs.
493 // TODO(turbofan): it might be possible to lower some JSOperators here, 574 // TODO(turbofan): it might be possible to lower some JSOperators here,
(...skipping 556 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 WriteBarrierKind kind = ComputeWriteBarrierKind( 1131 WriteBarrierKind kind = ComputeWriteBarrierKind(
1051 access.base_is_tagged, access.machine_type, access.type); 1132 access.base_is_tagged, access.machine_type, access.type);
1052 node->set_op( 1133 node->set_op(
1053 machine()->Store(StoreRepresentation(access.machine_type, kind))); 1134 machine()->Store(StoreRepresentation(access.machine_type, kind)));
1054 Node* offset = jsgraph()->Int32Constant(access.offset - access.tag()); 1135 Node* offset = jsgraph()->Int32Constant(access.offset - access.tag());
1055 node->InsertInput(zone(), 1, offset); 1136 node->InsertInput(zone(), 1, offset);
1056 } 1137 }
1057 1138
1058 1139
1059 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access, 1140 Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access,
1060 Node* index) { 1141 Node* const key) {
1061 int element_size = ElementSizeOf(access.machine_type); 1142 Node* index = key;
1143 const int element_size = ElementSizeOf(access.machine_type);
1062 if (element_size != 1) { 1144 if (element_size != 1) {
1063 index = graph()->NewNode(machine()->Int32Mul(), 1145 index = graph()->NewNode(machine()->Int32Mul(), index,
1064 jsgraph()->Int32Constant(element_size), index); 1146 jsgraph()->Int32Constant(element_size));
1065 } 1147 }
1066 int fixed_offset = access.header_size - access.tag(); 1148 const int fixed_offset = access.header_size - access.tag();
1067 if (fixed_offset == 0) return index; 1149 if (fixed_offset != 0) {
1068 return graph()->NewNode(machine()->Int32Add(), index, 1150 index = graph()->NewNode(machine()->Int32Add(), index,
1069 jsgraph()->Int32Constant(fixed_offset)); 1151 jsgraph()->Int32Constant(fixed_offset));
1152 }
1153 // TODO(bmeurer): 64-Bit
1154 // if (machine()->Is64()) {
1155 // index = graph()->NewNode(machine()->ChangeInt32ToInt64(), index);
1156 // }
1157 return index;
1070 } 1158 }
1071 1159
1072 1160
1161 namespace {
1162
1163 intptr_t AddressForOutOfBoundsLoad(MachineType type) {
1164 switch (RepresentationOf(type)) {
1165 case kRepFloat32: {
1166 static const float dummy = std::numeric_limits<float>::quiet_NaN();
1167 return bit_cast<intptr_t>(&dummy);
1168 }
1169 case kRepFloat64: {
1170 static const double dummy = std::numeric_limits<double>::quiet_NaN();
1171 return bit_cast<intptr_t>(&dummy);
1172 }
1173 case kRepBit:
1174 case kRepWord8:
1175 case kRepWord16:
1176 case kRepWord32: {
1177 static const int32_t dummy = 0;
1178 return bit_cast<intptr_t>(&dummy);
1179 }
1180 default:
1181 break;
1182 }
1183 UNREACHABLE();
1184 return 0;
1185 }
1186
1187
1188 intptr_t AddressForOutOfBoundsStore() {
1189 static volatile double dummy = 0;
1190 return bit_cast<intptr_t>(&dummy);
1191 }
1192
1193 } // namespace
1194
1195
1073 void SimplifiedLowering::DoLoadElement(Node* node, MachineType output_type) { 1196 void SimplifiedLowering::DoLoadElement(Node* node, MachineType output_type) {
1074 const ElementAccess& access = ElementAccessOf(node->op()); 1197 const ElementAccess& access = ElementAccessOf(node->op());
1075 const Operator* op = machine()->Load(access.machine_type); 1198 const Operator* op = machine()->Load(access.machine_type);
1076 Node* key = node->InputAt(1); 1199 Node* key = node->InputAt(1);
1200 Node* index = ComputeIndex(access, key);
1077 Node* effect = node->InputAt(3); 1201 Node* effect = node->InputAt(3);
1078 Node* index = ComputeIndex(access, key);
1079 if (access.bounds_check == kNoBoundsCheck) { 1202 if (access.bounds_check == kNoBoundsCheck) {
1080 DCHECK_EQ(access.machine_type, output_type); 1203 DCHECK_EQ(access.machine_type, output_type);
1081 node->set_op(op); 1204 node->set_op(op);
1082 node->ReplaceInput(1, index); 1205 node->ReplaceInput(1, index);
1083 node->ReplaceInput(2, effect); 1206 node->ReplaceInput(2, effect);
1084 node->ReplaceInput(3, graph()->start()); 1207 node->ReplaceInput(3, graph()->start());
1085 } else { 1208 } else {
1086 DCHECK_EQ(kTypedArrayBoundsCheck, access.bounds_check); 1209 DCHECK_EQ(kTypedArrayBoundsCheck, access.bounds_check);
1087 1210
1088 Node* base = node->InputAt(0); 1211 Node* base = node->InputAt(0);
1089 Node* length = node->InputAt(2); 1212 Node* length = node->InputAt(2);
1213 Node* check = graph()->NewNode(machine()->Uint32LessThan(), key, length);
1090 1214
1091 Node* check = graph()->NewNode(machine()->Uint32LessThan(), key, length); 1215 IntPtrMatcher mbase(base);
1092 Node* branch = graph()->NewNode(common()->Branch(BranchHint::kTrue), check, 1216 if (mbase.HasValue() && (output_type & kRepTagged) == 0) {
1093 graph()->start()); 1217 Node* select = graph()->NewNode(
1218 common()->Select(kMachIntPtr, BranchHint::kTrue), check, index,
1219 jsgraph()->IntPtrConstant(AddressForOutOfBoundsLoad(output_type) -
1220 mbase.Value()));
1094 1221
1095 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 1222 node->set_op(op);
1096 Node* load = graph()->NewNode(op, base, index, effect, if_true); 1223 node->ReplaceInput(1, select);
1097 Node* result = load; 1224 node->ReplaceInput(2, effect);
1098 if (output_type & kRepTagged) { 1225 node->ReplaceInput(3, graph()->start());
1099 // TODO(turbofan): This is ugly as hell! 1226 } else {
1100 SimplifiedOperatorBuilder simplified(graph()->zone()); 1227 Node* branch = graph()->NewNode(common()->Branch(BranchHint::kTrue),
1101 RepresentationChanger changer(jsgraph(), &simplified, 1228 check, graph()->start());
1102 graph()->zone()->isolate()); 1229
1103 result = changer.GetTaggedRepresentationFor(result, access.machine_type); 1230 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
1231 Node* load = graph()->NewNode(op, base, index, effect, if_true);
1232 Node* result = load;
1233 if (output_type & kRepTagged) {
1234 // TODO(turbofan): This is ugly as hell!
1235 SimplifiedOperatorBuilder simplified(graph()->zone());
1236 RepresentationChanger changer(jsgraph(), &simplified,
1237 graph()->zone()->isolate());
1238 result =
1239 changer.GetTaggedRepresentationFor(result, access.machine_type);
1240 }
1241
1242 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
1243 Node* undefined;
1244 if (output_type & kRepTagged) {
1245 DCHECK_EQ(0, access.machine_type & kRepTagged);
1246 undefined = jsgraph()->UndefinedConstant();
1247 } else if (output_type & kRepFloat32) {
1248 undefined =
1249 jsgraph()->Float32Constant(std::numeric_limits<float>::quiet_NaN());
1250 } else if (output_type & kRepFloat64) {
1251 undefined = jsgraph()->Float64Constant(
1252 std::numeric_limits<double>::quiet_NaN());
1253 } else {
1254 undefined = jsgraph()->Int32Constant(0);
1255 }
1256
1257 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
1258 Node* phi = graph()->NewNode(common()->EffectPhi(2), load, effect, merge);
1259
1260 // Replace effect uses of node with the effect phi.
1261 for (UseIter i = node->uses().begin(); i != node->uses().end();) {
1262 if (NodeProperties::IsEffectEdge(i.edge())) {
1263 i = i.UpdateToAndIncrement(phi);
1264 } else {
1265 ++i;
1266 }
1267 }
1268
1269 node->set_op(common()->Phi(output_type, 2));
1270 node->ReplaceInput(0, result);
1271 node->ReplaceInput(1, undefined);
1272 node->ReplaceInput(2, merge);
1273 node->TrimInputCount(3);
1104 } 1274 }
1105
1106 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
1107 Node* undefined;
1108 if (output_type & kRepTagged) {
1109 DCHECK(!(access.machine_type & kRepTagged));
1110 undefined = jsgraph()->UndefinedConstant();
1111 } else if (output_type & kRepFloat32) {
1112 undefined =
1113 jsgraph()->Float32Constant(std::numeric_limits<float>::quiet_NaN());
1114 } else if (output_type & kRepFloat64) {
1115 undefined =
1116 jsgraph()->Float64Constant(std::numeric_limits<double>::quiet_NaN());
1117 } else {
1118 undefined = jsgraph()->Int32Constant(0);
1119 }
1120
1121 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
1122 Node* phi = graph()->NewNode(common()->EffectPhi(2), load, effect, merge);
1123
1124 // Replace effect uses of node with the effect phi.
1125 for (UseIter i = node->uses().begin(); i != node->uses().end();) {
1126 if (NodeProperties::IsEffectEdge(i.edge())) {
1127 i = i.UpdateToAndIncrement(phi);
1128 } else {
1129 ++i;
1130 }
1131 }
1132
1133 node->set_op(common()->Phi(output_type, 2));
1134 node->ReplaceInput(0, result);
1135 node->ReplaceInput(1, undefined);
1136 node->ReplaceInput(2, merge);
1137 node->TrimInputCount(3);
1138 } 1275 }
1139 } 1276 }
1140 1277
1141 1278
1142 void SimplifiedLowering::DoStoreElement(Node* node) { 1279 void SimplifiedLowering::DoStoreElement(Node* node) {
1143 const ElementAccess& access = ElementAccessOf(node->op()); 1280 const ElementAccess& access = ElementAccessOf(node->op());
1144 const Operator* op = machine()->Store(StoreRepresentation( 1281 const Operator* op = machine()->Store(StoreRepresentation(
1145 access.machine_type, 1282 access.machine_type,
1146 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type, 1283 ComputeWriteBarrierKind(access.base_is_tagged, access.machine_type,
1147 access.type))); 1284 access.type)));
1148 Node* key = node->InputAt(1); 1285 Node* key = node->InputAt(1);
1149 Node* index = ComputeIndex(access, key); 1286 Node* index = ComputeIndex(access, key);
1150 if (access.bounds_check == kNoBoundsCheck) { 1287 if (access.bounds_check == kNoBoundsCheck) {
1151 node->set_op(op); 1288 node->set_op(op);
1152 node->ReplaceInput(1, index); 1289 node->ReplaceInput(1, index);
1153 node->RemoveInput(2); 1290 node->RemoveInput(2);
1154 } else { 1291 } else {
1155 DCHECK_EQ(kTypedArrayBoundsCheck, access.bounds_check); 1292 DCHECK_EQ(kTypedArrayBoundsCheck, access.bounds_check);
1156 1293
1157 Node* base = node->InputAt(0); 1294 Node* base = node->InputAt(0);
1158 Node* length = node->InputAt(2); 1295 Node* length = node->InputAt(2);
1159 Node* value = node->InputAt(3); 1296 Node* value = node->InputAt(3);
1160 Node* effect = node->InputAt(4); 1297 Node* effect = node->InputAt(4);
1161 Node* control = node->InputAt(5); 1298 Node* control = node->InputAt(5);
1299 Node* check = graph()->NewNode(machine()->Uint32LessThan(), key, length);
1162 1300
1163 Node* check = graph()->NewNode(machine()->Uint32LessThan(), key, length); 1301 IntPtrMatcher mbase(base);
1164 Node* branch = 1302 if (mbase.HasValue()) {
1165 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); 1303 Node* select = graph()->NewNode(
1304 common()->Select(kMachIntPtr, BranchHint::kTrue), check, index,
1305 jsgraph()->IntPtrConstant(AddressForOutOfBoundsStore() -
1306 mbase.Value()));
1166 1307
1167 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 1308 node->set_op(op);
1168 Node* store = graph()->NewNode(op, base, index, value, effect, if_true); 1309 node->ReplaceInput(1, select);
1310 node->RemoveInput(2);
1311 } else {
1312 Node* branch =
1313 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control);
1169 1314
1170 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); 1315 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
1316 Node* store = graph()->NewNode(op, base, index, value, effect, if_true);
1171 1317
1172 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false); 1318 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
1173 1319
1174 node->set_op(common()->EffectPhi(2)); 1320 Node* merge = graph()->NewNode(common()->Merge(2), if_true, if_false);
1175 node->ReplaceInput(0, store); 1321
1176 node->ReplaceInput(1, effect); 1322 node->set_op(common()->EffectPhi(2));
1177 node->ReplaceInput(2, merge); 1323 node->ReplaceInput(0, store);
1178 node->TrimInputCount(3); 1324 node->ReplaceInput(1, effect);
1325 node->ReplaceInput(2, merge);
1326 node->TrimInputCount(3);
1327 }
1179 } 1328 }
1180 } 1329 }
1181 1330
1182 1331
1183 void SimplifiedLowering::DoStringAdd(Node* node) { 1332 void SimplifiedLowering::DoStringAdd(Node* node) {
1184 Callable callable = CodeFactory::StringAdd( 1333 Callable callable = CodeFactory::StringAdd(
1185 zone()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED); 1334 zone()->isolate(), STRING_ADD_CHECK_NONE, NOT_TENURED);
1186 CallDescriptor::Flags flags = CallDescriptor::kNoFlags; 1335 CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
1187 CallDescriptor* desc = 1336 CallDescriptor* desc =
1188 Linkage::GetStubCallDescriptor(callable.descriptor(), 0, flags, zone()); 1337 Linkage::GetStubCallDescriptor(callable.descriptor(), 0, flags, zone());
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); 1517 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
1369 } 1518 }
1370 1519
1371 1520
1372 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) { 1521 void SimplifiedLowering::DoStringLessThanOrEqual(Node* node) {
1373 node->set_op(machine()->IntLessThanOrEqual()); 1522 node->set_op(machine()->IntLessThanOrEqual());
1374 node->ReplaceInput(0, StringComparison(node, true)); 1523 node->ReplaceInput(0, StringComparison(node, true));
1375 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL)); 1524 node->ReplaceInput(1, jsgraph()->SmiConstant(EQUAL));
1376 } 1525 }
1377 1526
1378
1379 } // namespace compiler 1527 } // namespace compiler
1380 } // namespace internal 1528 } // namespace internal
1381 } // namespace v8 1529 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/simplified-lowering.h ('k') | src/compiler/typer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698