Index: src/compiler/simplified-operator-reducer.cc |
diff --git a/src/compiler/simplified-operator-reducer.cc b/src/compiler/simplified-operator-reducer.cc |
index f6181ea988ffca2e432ce7afd0847578ace1e8e2..49b87b22a1aa036f15ccaee3028d6b90131f910c 100644 |
--- a/src/compiler/simplified-operator-reducer.cc |
+++ b/src/compiler/simplified-operator-reducer.cc |
@@ -12,6 +12,10 @@ namespace v8 { |
namespace internal { |
namespace compiler { |
+SimplifiedOperatorReducer::SimplifiedOperatorReducer(JSGraph* jsgraph) |
+ : jsgraph_(jsgraph), simplified_(jsgraph->zone()) {} |
+ |
+ |
SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {} |
@@ -95,6 +99,38 @@ Reduction SimplifiedOperatorReducer::Reduce(Node* node) { |
if (m.HasValue()) return ReplaceNumber(FastUI2D(m.Value())); |
break; |
} |
+ case IrOpcode::kLoadElement: { |
+ ElementAccess access = ElementAccessOf(node->op()); |
+ if (access.bounds_check == kTypedArrayBoundsCheck) { |
+ NumericValueMatcher mkey(node->InputAt(1)); |
+ NumericValueMatcher mlength(node->InputAt(2)); |
+ if (mkey.HasValue() && mlength.HasValue()) { |
+ // Skip the typed array bounds check if key and length are constant. |
+ if (mkey.Value() < mlength.Value()) { |
+ access.bounds_check = kNoBoundsCheck; |
+ node->set_op(simplified()->LoadElement(access)); |
+ return Changed(node); |
+ } |
+ } |
+ } |
+ break; |
+ } |
+ case IrOpcode::kStoreElement: { |
+ ElementAccess access = ElementAccessOf(node->op()); |
+ if (access.bounds_check == kTypedArrayBoundsCheck) { |
+ NumericValueMatcher mkey(node->InputAt(1)); |
+ NumericValueMatcher mlength(node->InputAt(2)); |
+ if (mkey.HasValue() && mlength.HasValue()) { |
+ // Skip the typed array bounds check if key and length are constant. |
+ if (mkey.Value() < mlength.Value()) { |
+ access.bounds_check = kNoBoundsCheck; |
+ node->set_op(simplified()->StoreElement(access)); |
+ return Changed(node); |
+ } |
+ } |
+ } |
+ break; |
+ } |
default: |
break; |
} |