Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 1908093002: [turbofan] Optimize tagged conversion based on type. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixes Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/change-lowering.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/effect-control-linearizer.h" 5 #include "src/compiler/effect-control-linearizer.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 *effect = state.effect; 286 *effect = state.effect;
287 *control = state.control; 287 *control = state.control;
288 return true; 288 return true;
289 } 289 }
290 290
291 EffectControlLinearizer::ValueEffectControl 291 EffectControlLinearizer::ValueEffectControl
292 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect, 292 EffectControlLinearizer::LowerChangeFloat64ToTagged(Node* node, Node* effect,
293 Node* control) { 293 Node* control) {
294 Node* value = node->InputAt(0); 294 Node* value = node->InputAt(0);
295 295
296 Type* const value_type = NodeProperties::GetType(value); 296 Node* value32 = graph()->NewNode(
297 Node* const value32 = graph()->NewNode(
298 machine()->TruncateFloat64ToInt32(TruncationMode::kRoundToZero), value); 297 machine()->TruncateFloat64ToInt32(TruncationMode::kRoundToZero), value);
299 // TODO(bmeurer): This fast case must be disabled until we kill the asm.js
300 // support in the generic JavaScript pipeline, because LoadBuffer is lying
301 // about its result.
302 // if (value_type->Is(Type::Signed32())) {
303 // return ChangeInt32ToTagged(value32, control);
304 // }
305 Node* check_same = graph()->NewNode( 298 Node* check_same = graph()->NewNode(
306 machine()->Float64Equal(), value, 299 machine()->Float64Equal(), value,
307 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); 300 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32));
308 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control); 301 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control);
309 302
310 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same); 303 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same);
311 Node* vsmi; 304 Node* vsmi;
312 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same); 305 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same);
313 306
314 // We only need to check for -0 if the {value} can potentially contain -0. 307 // Check if {value} is -0.
315 if (value_type->Maybe(Type::MinusZero())) { 308 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32,
316 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, 309 jsgraph()->Int32Constant(0));
317 jsgraph()->Int32Constant(0)); 310 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse),
318 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse), 311 check_zero, if_smi);
319 check_zero, if_smi);
320 312
321 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero); 313 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero);
322 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero); 314 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero);
323 315
324 // In case of 0, we need to check the high bits for the IEEE -0 pattern. 316 // In case of 0, we need to check the high bits for the IEEE -0 pattern.
325 Node* check_negative = graph()->NewNode( 317 Node* check_negative = graph()->NewNode(
326 machine()->Int32LessThan(), 318 machine()->Int32LessThan(),
327 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), 319 graph()->NewNode(machine()->Float64ExtractHighWord32(), value),
328 jsgraph()->Int32Constant(0)); 320 jsgraph()->Int32Constant(0));
329 Node* branch_negative = graph()->NewNode( 321 Node* branch_negative = graph()->NewNode(common()->Branch(BranchHint::kFalse),
330 common()->Branch(BranchHint::kFalse), check_negative, if_zero); 322 check_negative, if_zero);
331 323
332 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative); 324 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative);
333 Node* if_notnegative = 325 Node* if_notnegative = graph()->NewNode(common()->IfFalse(), branch_negative);
334 graph()->NewNode(common()->IfFalse(), branch_negative);
335 326
336 // We need to create a box for negative 0. 327 // We need to create a box for negative 0.
337 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative); 328 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative);
338 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative); 329 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative);
339 }
340 330
341 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit 331 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit
342 // machines we need to deal with potential overflow and fallback to boxing. 332 // machines we need to deal with potential overflow and fallback to boxing.
343 if (machine()->Is64() || value_type->Is(Type::SignedSmall())) { 333 if (machine()->Is64()) {
344 vsmi = ChangeInt32ToSmi(value32); 334 vsmi = ChangeInt32ToSmi(value32);
345 } else { 335 } else {
346 Node* smi_tag = 336 Node* smi_tag =
347 graph()->NewNode(machine()->Int32AddWithOverflow(), value32, value32); 337 graph()->NewNode(machine()->Int32AddWithOverflow(), value32, value32);
348 338
349 Node* check_ovf = graph()->NewNode(common()->Projection(1), smi_tag); 339 Node* check_ovf = graph()->NewNode(common()->Projection(1), smi_tag);
350 Node* branch_ovf = graph()->NewNode(common()->Branch(BranchHint::kFalse), 340 Node* branch_ovf = graph()->NewNode(common()->Branch(BranchHint::kFalse),
351 check_ovf, if_smi); 341 check_ovf, if_smi);
352 342
353 Node* if_ovf = graph()->NewNode(common()->IfTrue(), branch_ovf); 343 Node* if_ovf = graph()->NewNode(common()->IfTrue(), branch_ovf);
(...skipping 12 matching lines...) Expand all
366 effect = 356 effect =
367 graph()->NewNode(common()->EffectPhi(2), effect, box.effect, control); 357 graph()->NewNode(common()->EffectPhi(2), effect, box.effect, control);
368 return ValueEffectControl(value, effect, control); 358 return ValueEffectControl(value, effect, control);
369 } 359 }
370 360
371 EffectControlLinearizer::ValueEffectControl 361 EffectControlLinearizer::ValueEffectControl
372 EffectControlLinearizer::LowerChangeInt32ToTagged(Node* node, Node* effect, 362 EffectControlLinearizer::LowerChangeInt32ToTagged(Node* node, Node* effect,
373 Node* control) { 363 Node* control) {
374 Node* value = node->InputAt(0); 364 Node* value = node->InputAt(0);
375 365
376 if (machine()->Is64() || 366 if (machine()->Is64()) {
377 NodeProperties::GetType(value)->Is(Type::SignedSmall())) {
378 return ValueEffectControl(ChangeInt32ToSmi(value), effect, control); 367 return ValueEffectControl(ChangeInt32ToSmi(value), effect, control);
379 } 368 }
380 369
381 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); 370 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value);
382 371
383 Node* ovf = graph()->NewNode(common()->Projection(1), add); 372 Node* ovf = graph()->NewNode(common()->Projection(1), add);
384 Node* branch = 373 Node* branch =
385 graph()->NewNode(common()->Branch(BranchHint::kFalse), ovf, control); 374 graph()->NewNode(common()->Branch(BranchHint::kFalse), ovf, control);
386 375
387 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 376 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
(...skipping 10 matching lines...) Expand all
398 graph()->NewNode(common()->EffectPhi(2), alloc.effect, effect, merge); 387 graph()->NewNode(common()->EffectPhi(2), alloc.effect, effect, merge);
399 388
400 return ValueEffectControl(phi, ephi, merge); 389 return ValueEffectControl(phi, ephi, merge);
401 } 390 }
402 391
403 EffectControlLinearizer::ValueEffectControl 392 EffectControlLinearizer::ValueEffectControl
404 EffectControlLinearizer::LowerChangeUint32ToTagged(Node* node, Node* effect, 393 EffectControlLinearizer::LowerChangeUint32ToTagged(Node* node, Node* effect,
405 Node* control) { 394 Node* control) {
406 Node* value = node->InputAt(0); 395 Node* value = node->InputAt(0);
407 396
408 if (NodeProperties::GetType(value)->Is(Type::UnsignedSmall())) {
409 return ValueEffectControl(ChangeUint32ToSmi(value), effect, control);
410 }
411
412 Node* check = graph()->NewNode(machine()->Uint32LessThanOrEqual(), value, 397 Node* check = graph()->NewNode(machine()->Uint32LessThanOrEqual(), value,
413 SmiMaxValueConstant()); 398 SmiMaxValueConstant());
414 Node* branch = 399 Node* branch =
415 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); 400 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control);
416 401
417 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 402 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
418 Node* vtrue = ChangeUint32ToSmi(value); 403 Node* vtrue = ChangeUint32ToSmi(value);
419 404
420 Node* if_false = graph()->NewNode(common()->IfFalse(), branch); 405 Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
421 ValueEffectControl alloc = AllocateHeapNumberWithValue( 406 ValueEffectControl alloc = AllocateHeapNumberWithValue(
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 return jsgraph()->Int32Constant(Smi::kMaxValue); 458 return jsgraph()->Int32Constant(Smi::kMaxValue);
474 } 459 }
475 460
476 Node* EffectControlLinearizer::SmiShiftBitsConstant() { 461 Node* EffectControlLinearizer::SmiShiftBitsConstant() {
477 return jsgraph()->IntPtrConstant(kSmiShiftSize + kSmiTagSize); 462 return jsgraph()->IntPtrConstant(kSmiShiftSize + kSmiTagSize);
478 } 463 }
479 464
480 } // namespace compiler 465 } // namespace compiler
481 } // namespace internal 466 } // namespace internal
482 } // namespace v8 467 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/change-lowering.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698