blob: 09f5aa1cdd88da3522ffb0438d05d6d6eab19427 [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#pragma once
class IntOverflowDoesNotMatterRange
{
private:
IR::Instr *firstInstr;
IR::Instr *const lastInstr;
// These syms are required to have int values before the first instruction (before we start ignoring int overflows in this
// on instructions in this range). Any bailouts necessary to force them to ints need to be inserted before the range.
BVSparse<JitArenaAllocator> symsRequiredToBeInt;
BVSparse<JitArenaAllocator> symsRequiredToBeLossyInt; // these are a subset of the above bit-vector
IntOverflowDoesNotMatterRange *const next;
public:
IntOverflowDoesNotMatterRange(
JitArenaAllocator *const allocator,
IR::Instr *const firstInstr,
IR::Instr *const lastInstr,
IntOverflowDoesNotMatterRange *const next)
: firstInstr(firstInstr),
lastInstr(lastInstr),
symsRequiredToBeInt(allocator),
symsRequiredToBeLossyInt(allocator),
next(next)
{
Assert(firstInstr);
Assert(lastInstr);
Assert(lastInstr->m_opcode == Js::OpCode::NoIntOverflowBoundary);
}
static IntOverflowDoesNotMatterRange *New(
JitArenaAllocator *const allocator,
IR::Instr *const firstInstr,
IR::Instr *const lastInstr,
IntOverflowDoesNotMatterRange *const next)
{
return JitAnew(allocator, IntOverflowDoesNotMatterRange, allocator, firstInstr, lastInstr, next);
}
void Delete(JitArenaAllocator *const allocator)
{
JitAdelete(allocator, this);
}
public:
IR::Instr *FirstInstr() const
{
return firstInstr;
}
void SetFirstInstr(IR::Instr *const firstInstr)
{
Assert(firstInstr);
this->firstInstr = firstInstr;
}
IR::Instr *LastInstr() const
{
return lastInstr;
}
BVSparse<JitArenaAllocator> *SymsRequiredToBeInt()
{
return &symsRequiredToBeInt;
}
BVSparse<JitArenaAllocator> *SymsRequiredToBeLossyInt()
{
return &symsRequiredToBeLossyInt;
}
IntOverflowDoesNotMatterRange *Next() const
{
return next;
}
PREVENT_COPY(IntOverflowDoesNotMatterRange)
};