0ee6f90a5f
Live ranges defined by a constant operand normally don't require a spill slot since they can just rematerialize the value from the constant. In the attached issue however, deoptimization adds an explicit slot requirement for a range that is defined by a constant operand. This case is not expected in the register allocator and we eventually hit a DCHECK. This fix allocates a new stack slot during the MeetRegisterConstraints and adds the missing gap move. Drive-by: remove dead method LiveRange::NextSlotPosition. R=sigurds@chromium.org CC=nicohartmann@chromium.org Bug: chromium:1146880 Change-Id: I08fbb890f2f3d9574196989cf3e5ef6232433484 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2563689 Reviewed-by: Sigurd Schneider <sigurds@chromium.org> Commit-Queue: Thibaud Michaud <thibaudm@chromium.org> Cr-Commit-Position: refs/heads/master@{#73510}
27 lines
570 B
JavaScript
27 lines
570 B
JavaScript
// Copyright 2021 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax --assert-types
|
|
|
|
function f(a,b) {
|
|
let t = a >= b;
|
|
while (t != 0) {
|
|
a = a | (b - a);
|
|
let unused = a >= b;
|
|
t = a < b;
|
|
}
|
|
}
|
|
function test() {
|
|
f(Infinity,1);
|
|
f(undefined, undefined);
|
|
}
|
|
|
|
// Trigger TurboFan compilation
|
|
%PrepareFunctionForOptimization(test);
|
|
%PrepareFunctionForOptimization(f);
|
|
test();
|
|
test();
|
|
%OptimizeFunctionOnNextCall(test);
|
|
test();
|