| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/js-context-relaxation.h" | 5 #include "src/compiler/js-context-relaxation.h" |
| 6 #include "src/compiler/js-graph.h" | 6 #include "src/compiler/js-graph.h" |
| 7 #include "test/unittests/compiler/graph-unittest.h" | 7 #include "test/unittests/compiler/graph-unittest.h" |
| 8 #include "test/unittests/compiler/node-test-utils.h" | 8 #include "test/unittests/compiler/node-test-utils.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 TEST_F(JSContextRelaxationTest, | 76 TEST_F(JSContextRelaxationTest, |
| 77 RelaxJSCallFunctionShallowFrameStateChainNoCrossCtx) { | 77 RelaxJSCallFunctionShallowFrameStateChainNoCrossCtx) { |
| 78 Node* const input0 = Parameter(0); | 78 Node* const input0 = Parameter(0); |
| 79 Node* const input1 = Parameter(1); | 79 Node* const input1 = Parameter(1); |
| 80 Node* const context = Parameter(2); | 80 Node* const context = Parameter(2); |
| 81 Node* const outer_context = Parameter(3); | 81 Node* const outer_context = Parameter(3); |
| 82 Node* const frame_state = | 82 Node* const frame_state = |
| 83 ShallowFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 83 ShallowFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 84 Node* const effect = graph()->start(); | 84 Node* const effect = graph()->start(); |
| 85 Node* const control = graph()->start(); | 85 Node* const control = graph()->start(); |
| 86 Node* node = graph()->NewNode( | 86 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 87 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 87 input0, input1, context, frame_state, |
| 88 context, frame_state, frame_state, effect, control); | 88 frame_state, effect, control); |
| 89 Reduction const r = Reduce(node); | 89 Reduction const r = Reduce(node); |
| 90 EXPECT_TRUE(r.Changed()); | 90 EXPECT_TRUE(r.Changed()); |
| 91 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); | 91 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); |
| 92 } | 92 } |
| 93 | 93 |
| 94 TEST_F(JSContextRelaxationTest, | 94 TEST_F(JSContextRelaxationTest, |
| 95 RelaxJSCallFunctionShallowFrameStateChainCrossCtx) { | 95 RelaxJSCallFunctionShallowFrameStateChainCrossCtx) { |
| 96 Node* const input0 = Parameter(0); | 96 Node* const input0 = Parameter(0); |
| 97 Node* const input1 = Parameter(1); | 97 Node* const input1 = Parameter(1); |
| 98 Node* const context = Parameter(2); | 98 Node* const context = Parameter(2); |
| 99 Node* const outer_context = Parameter(3); | 99 Node* const outer_context = Parameter(3); |
| 100 Node* const frame_state = | 100 Node* const frame_state = |
| 101 ShallowFrameStateChain(outer_context, CALL_CHANGES_NATIVE_CONTEXT); | 101 ShallowFrameStateChain(outer_context, CALL_CHANGES_NATIVE_CONTEXT); |
| 102 Node* const effect = graph()->start(); | 102 Node* const effect = graph()->start(); |
| 103 Node* const control = graph()->start(); | 103 Node* const control = graph()->start(); |
| 104 Node* node = graph()->NewNode( | 104 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 105 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 105 input0, input1, context, frame_state, |
| 106 context, frame_state, frame_state, effect, control); | 106 frame_state, effect, control); |
| 107 Reduction const r = Reduce(node); | 107 Reduction const r = Reduce(node); |
| 108 EXPECT_FALSE(r.Changed()); | 108 EXPECT_FALSE(r.Changed()); |
| 109 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); | 109 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); |
| 110 } | 110 } |
| 111 | 111 |
| 112 TEST_F(JSContextRelaxationTest, | 112 TEST_F(JSContextRelaxationTest, |
| 113 RelaxJSCallFunctionDeepFrameStateChainNoCrossCtx) { | 113 RelaxJSCallFunctionDeepFrameStateChainNoCrossCtx) { |
| 114 Node* const input0 = Parameter(0); | 114 Node* const input0 = Parameter(0); |
| 115 Node* const input1 = Parameter(1); | 115 Node* const input1 = Parameter(1); |
| 116 Node* const context = Parameter(2); | 116 Node* const context = Parameter(2); |
| 117 Node* const outer_context = Parameter(3); | 117 Node* const outer_context = Parameter(3); |
| 118 Node* const frame_state = | 118 Node* const frame_state = |
| 119 DeepFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 119 DeepFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 120 Node* const effect = graph()->start(); | 120 Node* const effect = graph()->start(); |
| 121 Node* const control = graph()->start(); | 121 Node* const control = graph()->start(); |
| 122 Node* node = graph()->NewNode( | 122 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 123 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 123 input0, input1, context, frame_state, |
| 124 context, frame_state, frame_state, effect, control); | 124 frame_state, effect, control); |
| 125 Reduction const r = Reduce(node); | 125 Reduction const r = Reduce(node); |
| 126 EXPECT_TRUE(r.Changed()); | 126 EXPECT_TRUE(r.Changed()); |
| 127 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); | 127 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); |
| 128 } | 128 } |
| 129 | 129 |
| 130 TEST_F(JSContextRelaxationTest, | 130 TEST_F(JSContextRelaxationTest, |
| 131 RelaxJSCallFunctionDeepFrameStateChainCrossCtx) { | 131 RelaxJSCallFunctionDeepFrameStateChainCrossCtx) { |
| 132 Node* const input0 = Parameter(0); | 132 Node* const input0 = Parameter(0); |
| 133 Node* const input1 = Parameter(1); | 133 Node* const input1 = Parameter(1); |
| 134 Node* const context = Parameter(2); | 134 Node* const context = Parameter(2); |
| 135 Node* const outer_context = Parameter(3); | 135 Node* const outer_context = Parameter(3); |
| 136 Node* const frame_state = | 136 Node* const frame_state = |
| 137 DeepFrameStateChain(outer_context, CALL_CHANGES_NATIVE_CONTEXT); | 137 DeepFrameStateChain(outer_context, CALL_CHANGES_NATIVE_CONTEXT); |
| 138 Node* const effect = graph()->start(); | 138 Node* const effect = graph()->start(); |
| 139 Node* const control = graph()->start(); | 139 Node* const control = graph()->start(); |
| 140 Node* node = graph()->NewNode( | 140 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 141 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 141 input0, input1, context, frame_state, |
| 142 context, frame_state, frame_state, effect, control); | 142 frame_state, effect, control); |
| 143 Reduction const r = Reduce(node); | 143 Reduction const r = Reduce(node); |
| 144 EXPECT_FALSE(r.Changed()); | 144 EXPECT_FALSE(r.Changed()); |
| 145 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); | 145 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); |
| 146 } | 146 } |
| 147 | 147 |
| 148 TEST_F(JSContextRelaxationTest, | 148 TEST_F(JSContextRelaxationTest, |
| 149 RelaxJSCallFunctionDeepContextChainFullRelaxForCatch) { | 149 RelaxJSCallFunctionDeepContextChainFullRelaxForCatch) { |
| 150 Node* const input0 = Parameter(0); | 150 Node* const input0 = Parameter(0); |
| 151 Node* const input1 = Parameter(1); | 151 Node* const input1 = Parameter(1); |
| 152 Node* const context = Parameter(2); | 152 Node* const context = Parameter(2); |
| 153 Node* const outer_context = Parameter(3); | 153 Node* const outer_context = Parameter(3); |
| 154 const Operator* op = javascript()->CreateCatchContext(Handle<String>()); | 154 const Operator* op = javascript()->CreateCatchContext(Handle<String>()); |
| 155 Node* const effect = graph()->start(); | 155 Node* const effect = graph()->start(); |
| 156 Node* const control = graph()->start(); | 156 Node* const control = graph()->start(); |
| 157 Node* nested_context = graph()->NewNode( | 157 Node* nested_context = graph()->NewNode( |
| 158 op, graph()->start(), graph()->start(), outer_context, effect, control); | 158 op, graph()->start(), graph()->start(), outer_context, effect, control); |
| 159 Node* const frame_state_2 = | 159 Node* const frame_state_2 = |
| 160 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 160 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 161 Node* node = graph()->NewNode( | 161 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 162 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 162 input0, input1, context, frame_state_2, |
| 163 context, frame_state_2, frame_state_2, effect, control); | 163 frame_state_2, effect, control); |
| 164 Reduction const r = Reduce(node); | 164 Reduction const r = Reduce(node); |
| 165 EXPECT_TRUE(r.Changed()); | 165 EXPECT_TRUE(r.Changed()); |
| 166 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); | 166 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); |
| 167 } | 167 } |
| 168 | 168 |
| 169 | 169 |
| 170 TEST_F(JSContextRelaxationTest, | 170 TEST_F(JSContextRelaxationTest, |
| 171 RelaxJSCallFunctionDeepContextChainFullRelaxForWith) { | 171 RelaxJSCallFunctionDeepContextChainFullRelaxForWith) { |
| 172 Node* const input0 = Parameter(0); | 172 Node* const input0 = Parameter(0); |
| 173 Node* const input1 = Parameter(1); | 173 Node* const input1 = Parameter(1); |
| 174 Node* const context = Parameter(2); | 174 Node* const context = Parameter(2); |
| 175 Node* const outer_context = Parameter(3); | 175 Node* const outer_context = Parameter(3); |
| 176 const Operator* op = javascript()->CreateWithContext(); | 176 const Operator* op = javascript()->CreateWithContext(); |
| 177 Node* const effect = graph()->start(); | 177 Node* const effect = graph()->start(); |
| 178 Node* const control = graph()->start(); | 178 Node* const control = graph()->start(); |
| 179 Node* nested_context = graph()->NewNode( | 179 Node* nested_context = graph()->NewNode( |
| 180 op, graph()->start(), graph()->start(), outer_context, effect, control); | 180 op, graph()->start(), graph()->start(), outer_context, effect, control); |
| 181 Node* const frame_state_2 = | 181 Node* const frame_state_2 = |
| 182 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 182 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 183 Node* node = graph()->NewNode( | 183 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 184 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 184 input0, input1, context, frame_state_2, |
| 185 context, frame_state_2, frame_state_2, effect, control); | 185 frame_state_2, effect, control); |
| 186 Reduction const r = Reduce(node); | 186 Reduction const r = Reduce(node); |
| 187 EXPECT_TRUE(r.Changed()); | 187 EXPECT_TRUE(r.Changed()); |
| 188 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); | 188 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); |
| 189 } | 189 } |
| 190 | 190 |
| 191 | 191 |
| 192 TEST_F(JSContextRelaxationTest, | 192 TEST_F(JSContextRelaxationTest, |
| 193 RelaxJSCallFunctionDeepContextChainFullRelaxForBlock) { | 193 RelaxJSCallFunctionDeepContextChainFullRelaxForBlock) { |
| 194 Node* const input0 = Parameter(0); | 194 Node* const input0 = Parameter(0); |
| 195 Node* const input1 = Parameter(1); | 195 Node* const input1 = Parameter(1); |
| 196 Node* const context = Parameter(2); | 196 Node* const context = Parameter(2); |
| 197 Node* const outer_context = Parameter(3); | 197 Node* const outer_context = Parameter(3); |
| 198 Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::null(); | 198 Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::null(); |
| 199 const Operator* op = javascript()->CreateBlockContext(scope_info); | 199 const Operator* op = javascript()->CreateBlockContext(scope_info); |
| 200 Node* const effect = graph()->start(); | 200 Node* const effect = graph()->start(); |
| 201 Node* const control = graph()->start(); | 201 Node* const control = graph()->start(); |
| 202 Node* nested_context = | 202 Node* nested_context = |
| 203 graph()->NewNode(op, graph()->start(), outer_context, effect, control); | 203 graph()->NewNode(op, graph()->start(), outer_context, effect, control); |
| 204 Node* const frame_state_2 = | 204 Node* const frame_state_2 = |
| 205 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 205 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 206 Node* node = graph()->NewNode( | 206 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 207 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 207 input0, input1, context, frame_state_2, |
| 208 context, frame_state_2, frame_state_2, effect, control); | 208 frame_state_2, effect, control); |
| 209 Reduction const r = Reduce(node); | 209 Reduction const r = Reduce(node); |
| 210 EXPECT_TRUE(r.Changed()); | 210 EXPECT_TRUE(r.Changed()); |
| 211 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); | 211 EXPECT_EQ(outer_context, NodeProperties::GetContextInput(node)); |
| 212 } | 212 } |
| 213 | 213 |
| 214 | 214 |
| 215 TEST_F(JSContextRelaxationTest, | 215 TEST_F(JSContextRelaxationTest, |
| 216 RelaxJSCallFunctionDeepContextChainPartialRelaxForScript) { | 216 RelaxJSCallFunctionDeepContextChainPartialRelaxForScript) { |
| 217 Node* const input0 = Parameter(0); | 217 Node* const input0 = Parameter(0); |
| 218 Node* const input1 = Parameter(1); | 218 Node* const input1 = Parameter(1); |
| 219 Node* const context = Parameter(2); | 219 Node* const context = Parameter(2); |
| 220 Node* const outer_context = Parameter(3); | 220 Node* const outer_context = Parameter(3); |
| 221 Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::null(); | 221 Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::null(); |
| 222 const Operator* op = javascript()->CreateScriptContext(scope_info); | 222 const Operator* op = javascript()->CreateScriptContext(scope_info); |
| 223 Node* const frame_state_1 = | 223 Node* const frame_state_1 = |
| 224 ShallowFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 224 ShallowFrameStateChain(outer_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 225 Node* const effect = graph()->start(); | 225 Node* const effect = graph()->start(); |
| 226 Node* const control = graph()->start(); | 226 Node* const control = graph()->start(); |
| 227 Node* nested_context = graph()->NewNode(op, graph()->start(), outer_context, | 227 Node* nested_context = graph()->NewNode(op, graph()->start(), outer_context, |
| 228 frame_state_1, effect, control); | 228 frame_state_1, effect, control); |
| 229 Node* const frame_state_2 = | 229 Node* const frame_state_2 = |
| 230 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 230 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 231 Node* node = graph()->NewNode( | 231 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 232 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 232 input0, input1, context, frame_state_2, |
| 233 context, frame_state_2, frame_state_2, effect, control); | 233 frame_state_2, effect, control); |
| 234 Reduction const r = Reduce(node); | 234 Reduction const r = Reduce(node); |
| 235 EXPECT_TRUE(r.Changed()); | 235 EXPECT_TRUE(r.Changed()); |
| 236 EXPECT_EQ(nested_context, NodeProperties::GetContextInput(node)); | 236 EXPECT_EQ(nested_context, NodeProperties::GetContextInput(node)); |
| 237 } | 237 } |
| 238 | 238 |
| 239 | 239 |
| 240 TEST_F(JSContextRelaxationTest, | 240 TEST_F(JSContextRelaxationTest, |
| 241 RelaxJSCallFunctionDeepContextChainPartialRelaxForModule) { | 241 RelaxJSCallFunctionDeepContextChainPartialRelaxForModule) { |
| 242 Node* const input0 = Parameter(0); | 242 Node* const input0 = Parameter(0); |
| 243 Node* const input1 = Parameter(1); | 243 Node* const input1 = Parameter(1); |
| 244 Node* const context = Parameter(2); | 244 Node* const context = Parameter(2); |
| 245 Node* const outer_context = Parameter(3); | 245 Node* const outer_context = Parameter(3); |
| 246 const Operator* op = javascript()->CreateModuleContext(); | 246 const Operator* op = javascript()->CreateModuleContext(); |
| 247 Node* const effect = graph()->start(); | 247 Node* const effect = graph()->start(); |
| 248 Node* const control = graph()->start(); | 248 Node* const control = graph()->start(); |
| 249 Node* nested_context = graph()->NewNode( | 249 Node* nested_context = graph()->NewNode( |
| 250 op, graph()->start(), graph()->start(), outer_context, effect, control); | 250 op, graph()->start(), graph()->start(), outer_context, effect, control); |
| 251 Node* const frame_state_2 = | 251 Node* const frame_state_2 = |
| 252 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 252 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 253 Node* node = graph()->NewNode( | 253 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 254 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 254 input0, input1, context, frame_state_2, |
| 255 context, frame_state_2, frame_state_2, effect, control); | 255 frame_state_2, effect, control); |
| 256 Reduction const r = Reduce(node); | 256 Reduction const r = Reduce(node); |
| 257 EXPECT_TRUE(r.Changed()); | 257 EXPECT_TRUE(r.Changed()); |
| 258 EXPECT_EQ(nested_context, NodeProperties::GetContextInput(node)); | 258 EXPECT_EQ(nested_context, NodeProperties::GetContextInput(node)); |
| 259 } | 259 } |
| 260 | 260 |
| 261 | 261 |
| 262 TEST_F(JSContextRelaxationTest, | 262 TEST_F(JSContextRelaxationTest, |
| 263 RelaxJSCallFunctionDeepContextChainPartialNoRelax) { | 263 RelaxJSCallFunctionDeepContextChainPartialNoRelax) { |
| 264 Node* const input0 = Parameter(0); | 264 Node* const input0 = Parameter(0); |
| 265 Node* const input1 = Parameter(1); | 265 Node* const input1 = Parameter(1); |
| 266 Node* const context = Parameter(2); | 266 Node* const context = Parameter(2); |
| 267 Node* const outer_context = Parameter(3); | 267 Node* const outer_context = Parameter(3); |
| 268 const Operator* op = javascript()->CreateFunctionContext(0); | 268 const Operator* op = javascript()->CreateFunctionContext(0); |
| 269 Node* const effect = graph()->start(); | 269 Node* const effect = graph()->start(); |
| 270 Node* const control = graph()->start(); | 270 Node* const control = graph()->start(); |
| 271 Node* nested_context = | 271 Node* nested_context = |
| 272 graph()->NewNode(op, graph()->start(), outer_context, effect, control); | 272 graph()->NewNode(op, graph()->start(), outer_context, effect, control); |
| 273 Node* const frame_state_2 = | 273 Node* const frame_state_2 = |
| 274 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); | 274 ShallowFrameStateChain(nested_context, CALL_MAINTAINS_NATIVE_CONTEXT); |
| 275 Node* node = graph()->NewNode( | 275 Node* node = graph()->NewNode(javascript()->CallFunction(2, VectorSlotPair()), |
| 276 javascript()->CallFunction(2, STRICT, VectorSlotPair()), input0, input1, | 276 input0, input1, context, frame_state_2, |
| 277 context, frame_state_2, frame_state_2, effect, control); | 277 frame_state_2, effect, control); |
| 278 Reduction const r = Reduce(node); | 278 Reduction const r = Reduce(node); |
| 279 EXPECT_FALSE(r.Changed()); | 279 EXPECT_FALSE(r.Changed()); |
| 280 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); | 280 EXPECT_EQ(context, NodeProperties::GetContextInput(node)); |
| 281 } | 281 } |
| 282 | 282 |
| 283 } // namespace compiler | 283 } // namespace compiler |
| 284 } // namespace internal | 284 } // namespace internal |
| 285 } // namespace v8 | 285 } // namespace v8 |
| OLD | NEW |