| Index: src/compiler/store-store-elimination.cc
|
| diff --git a/src/compiler/store-store-elimination.cc b/src/compiler/store-store-elimination.cc
|
| index 7f2d0d96152d4f9cba552b7fea9c3ed9f828fcd3..98904b05b5d045c561c2d045cb6e2ee151f8473a 100644
|
| --- a/src/compiler/store-store-elimination.cc
|
| +++ b/src/compiler/store-store-elimination.cc
|
| @@ -147,7 +147,6 @@ class RedundantStoreFinder final {
|
| UnobservablesSet RecomputeUseIntersection(Node* node);
|
| UnobservablesSet RecomputeSet(Node* node, UnobservablesSet uses);
|
| static bool CannotObserveStoreField(Node* node);
|
| - static bool CanObserveAnything(Node* node);
|
|
|
| void MarkForRevisit(Node* node);
|
| bool HasBeenVisited(Node* node);
|
| @@ -325,20 +324,9 @@ UnobservablesSet RedundantStoreFinder::RecomputeSet(Node* node,
|
| TRACE(" #%d:%s can observe nothing, set stays unchanged", node->id(),
|
| node->op()->mnemonic());
|
| return uses;
|
| - } else if (CanObserveAnything(node)) {
|
| - TRACE(" #%d:%s can observe everything, recording empty set",
|
| - node->id(), node->op()->mnemonic());
|
| - return unobservables_visited_empty_;
|
| } else {
|
| - // It is safe to turn this check off in the future, but it is better
|
| - // to list opcodes in CannotObserveStoreField, in CanObserveAnything,
|
| - // or if you don't know, to add another case inside this DCHECK_EXTRA.
|
| - DCHECK_EXTRA(node->op()->opcode() == IrOpcode::kCall, "%s",
|
| - node->op()->mnemonic());
|
| - TRACE(
|
| - " cannot determine unobservables-set for #%d:%s; "
|
| - "conservatively recording empty set",
|
| - node->id(), node->op()->mnemonic());
|
| + TRACE(" #%d:%s might observe anything, recording empty set",
|
| + node->id(), node->op()->mnemonic());
|
| return unobservables_visited_empty_;
|
| }
|
| }
|
| @@ -347,19 +335,15 @@ UnobservablesSet RedundantStoreFinder::RecomputeSet(Node* node,
|
| }
|
|
|
| bool RedundantStoreFinder::CannotObserveStoreField(Node* node) {
|
| - Operator::Properties mask =
|
| - Operator::kNoRead | Operator::kNoDeopt | Operator::kNoThrow;
|
| -
|
| - return (node->op()->properties() & mask) == mask ||
|
| - node->opcode() == IrOpcode::kAllocate ||
|
| - node->opcode() == IrOpcode::kCheckedLoad ||
|
| + return node->opcode() == IrOpcode::kCheckedLoad ||
|
| node->opcode() == IrOpcode::kLoadElement ||
|
| - node->opcode() == IrOpcode::kLoad;
|
| -}
|
| -
|
| -bool RedundantStoreFinder::CanObserveAnything(Node* node) {
|
| - return !node->op()->HasProperty(Operator::kNoThrow) ||
|
| - !node->op()->HasProperty(Operator::kNoDeopt);
|
| + node->opcode() == IrOpcode::kLoad ||
|
| + node->opcode() == IrOpcode::kStore ||
|
| + node->opcode() == IrOpcode::kEffectPhi ||
|
| + node->opcode() == IrOpcode::kStoreElement ||
|
| + node->opcode() == IrOpcode::kCheckedStore ||
|
| + node->opcode() == IrOpcode::kUnsafePointerAdd ||
|
| + node->opcode() == IrOpcode::kRetain;
|
| }
|
|
|
| // Initialize unobservable_ with js_graph->graph->NodeCount() empty sets.
|
| @@ -421,7 +405,7 @@ void RedundantStoreFinder::VisitEffectfulNode(Node* node) {
|
| // Mark effect inputs for visiting.
|
| for (int i = 0; i < node->op()->EffectInputCount(); i++) {
|
| Node* input = NodeProperties::GetEffectInput(node, i);
|
| - if (!CanObserveAnything(input) || !HasBeenVisited(input)) {
|
| + if (!HasBeenVisited(input)) {
|
| TRACE(" marking #%d:%s for revisit", input->id(),
|
| input->op()->mnemonic());
|
| MarkForRevisit(input);
|
|
|