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)); |