mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-27 04:05:32 +00:00
Bug 1410429 - Odin: Fold base pointer into offsets whenever possible; r=luke
MozReview-Commit-ID: ERmQ9YKDzFH --HG-- extra : rebase_source : 90bd2b039bd7b3af333067b20a26b820c8903235
This commit is contained in:
parent
ceb60c8001
commit
cd6edeac02
@ -756,6 +756,7 @@ class MemoryAccessDesc
|
||||
bool isPlainAsmJS() const { return !hasTrap(); }
|
||||
|
||||
void clearOffset() { offset_ = 0; }
|
||||
void setOffset(uint32_t offset) { offset_ = offset; }
|
||||
};
|
||||
|
||||
// Summarizes a global access for a mutable (in asm.js) or immutable value (in
|
||||
|
@ -777,6 +777,24 @@ class FunctionCompiler
|
||||
|
||||
void checkOffsetAndBounds(MemoryAccessDesc* access, MDefinition** base)
|
||||
{
|
||||
// Fold a constant base into the offset (so the base is 0 in which case
|
||||
// the codegen is optimized), if it doesn't wrap or trigger an
|
||||
// MWasmAddOffset.
|
||||
if ((*base)->isConstant()) {
|
||||
uint32_t basePtr = (*base)->toConstant()->toInt32();
|
||||
uint32_t offset = access->offset();
|
||||
|
||||
static_assert(OffsetGuardLimit < UINT32_MAX,
|
||||
"checking for overflow against OffsetGuardLimit is enough.");
|
||||
|
||||
if (offset < OffsetGuardLimit && basePtr < OffsetGuardLimit - offset) {
|
||||
auto* ins = MConstant::New(alloc(), Int32Value(0), MIRType::Int32);
|
||||
curBlock_->add(ins);
|
||||
*base = ins;
|
||||
access->setOffset(access->offset() + basePtr);
|
||||
}
|
||||
}
|
||||
|
||||
// If the offset is bigger than the guard region, a separate instruction
|
||||
// is necessary to add the offset to the base and check for overflow.
|
||||
if (access->offset() >= OffsetGuardLimit || !JitOptions.wasmFoldOffsets) {
|
||||
|
Loading…
Reference in New Issue
Block a user