Chromium Code Reviews| Index: src/compiler/js-intrinsic-lowering.cc | 
| diff --git a/src/compiler/js-intrinsic-lowering.cc b/src/compiler/js-intrinsic-lowering.cc | 
| index ca5cb932b4bd7606521b32ae63c7c8076779d74f..7b1059ffc612888d0386f9ea8f1dafefde739e0f 100644 | 
| --- a/src/compiler/js-intrinsic-lowering.cc | 
| +++ b/src/compiler/js-intrinsic-lowering.cc | 
| @@ -21,6 +21,19 @@ namespace v8 { | 
| namespace internal { | 
| namespace compiler { | 
| +// TODO(binji): copied from js-generic-lowering.cc, combine? | 
| +static CallDescriptor::Flags AdjustFrameStatesForCall(Node* node) { | 
| 
 
Jarin
2016/01/28 08:11:12
I believe here you only need a simpler version bec
 
binji
2016/01/28 16:20:01
No, I think I was ending up with multiple frame st
 
Jarin
2016/02/01 07:42:43
What I am saying is that you should not adapt base
 
 | 
| + int count = OperatorProperties::GetFrameStateInputCount(node->op()); | 
| + if (count > 1) { | 
| + int index = NodeProperties::FirstFrameStateIndex(node) + 1; | 
| + do { | 
| + node->RemoveInput(index); | 
| + } while (--count > 1); | 
| + } | 
| + return count > 0 ? CallDescriptor::kNeedsFrameState | 
| + : CallDescriptor::kNoFlags; | 
| +} | 
| + | 
| JSIntrinsicLowering::JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph, | 
| DeoptimizationMode mode) | 
| : AdvancedReducer(editor), | 
| @@ -107,6 +120,8 @@ Reduction JSIntrinsicLowering::Reduce(Node* node) { | 
| return ReduceTailCall(node); | 
| case Runtime::kInlineGetSuperConstructor: | 
| return ReduceGetSuperConstructor(node); | 
| + case Runtime::kInlineAtomicsLoad: | 
| + return ReduceAtomicsLoad(node); | 
| default: | 
| break; | 
| } | 
| @@ -471,12 +486,14 @@ Reduction JSIntrinsicLowering::ReduceFixedArraySet(Node* node) { | 
| Reduction JSIntrinsicLowering::ReduceRegExpConstructResult(Node* node) { | 
| // TODO(bmeurer): Introduce JSCreateRegExpResult? | 
| - return Change(node, CodeFactory::RegExpConstructResult(isolate()), 0); | 
| + return Change(node, CodeFactory::RegExpConstructResult(isolate()), 0, | 
| + CallDescriptor::kNeedsFrameState); | 
| } | 
| Reduction JSIntrinsicLowering::ReduceRegExpExec(Node* node) { | 
| - return Change(node, CodeFactory::RegExpExec(isolate()), 4); | 
| + return Change(node, CodeFactory::RegExpExec(isolate()), 4, | 
| + CallDescriptor::kNeedsFrameState); | 
| } | 
| @@ -501,7 +518,8 @@ Reduction JSIntrinsicLowering::ReduceRegExpSource(Node* node) { | 
| Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { | 
| - return Change(node, CodeFactory::SubString(isolate()), 3); | 
| + return Change(node, CodeFactory::SubString(isolate()), 3, | 
| + CallDescriptor::kNeedsFrameState); | 
| } | 
| @@ -560,7 +578,8 @@ Reduction JSIntrinsicLowering::ReduceToLength(Node* node) { | 
| ReplaceWithValue(node, value); | 
| return Replace(value); | 
| } | 
| - return Change(node, CodeFactory::ToLength(isolate()), 0); | 
| + return Change(node, CodeFactory::ToLength(isolate()), 0, | 
| + CallDescriptor::kNeedsFrameState); | 
| } | 
| @@ -618,6 +637,10 @@ Reduction JSIntrinsicLowering::ReduceGetSuperConstructor(Node* node) { | 
| active_function_map, effect, control); | 
| } | 
| +Reduction JSIntrinsicLowering::ReduceAtomicsLoad(Node* node) { | 
| + CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); | 
| + return Change(node, CodeFactory::AtomicsLoad(isolate()), 0, flags); | 
| +} | 
| Reduction JSIntrinsicLowering::Change(Node* node, const Operator* op, Node* a, | 
| Node* b) { | 
| @@ -660,12 +683,12 @@ Reduction JSIntrinsicLowering::ChangeToUndefined(Node* node, Node* effect) { | 
| return Changed(node); | 
| } | 
| - | 
| Reduction JSIntrinsicLowering::Change(Node* node, Callable const& callable, | 
| - int stack_parameter_count) { | 
| + int stack_parameter_count, | 
| + CallDescriptor::Flags flags) { | 
| CallDescriptor const* const desc = Linkage::GetStubCallDescriptor( | 
| isolate(), graph()->zone(), callable.descriptor(), stack_parameter_count, | 
| - CallDescriptor::kNeedsFrameState, node->op()->properties()); | 
| + flags, node->op()->properties()); | 
| node->InsertInput(graph()->zone(), 0, | 
| jsgraph()->HeapConstant(callable.code())); | 
| NodeProperties::ChangeOp(node, common()->Call(desc)); |