diff options
author | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-02-22 21:09:32 +0100 |
---|---|---|
committer | wolfbeast <mcwerewolf@wolfbeast.com> | 2020-04-14 12:56:40 +0200 |
commit | c22a493144e39d76bfa42c46f9d6d17a5143ac35 (patch) | |
tree | 83ec59e07c9948eebd529ba56771a622c605a13b /js/src/jit/ScalarReplacement.cpp | |
parent | d20ca24a070d547be3bce4d513ef151b6be5f955 (diff) | |
download | UXP-c22a493144e39d76bfa42c46f9d6d17a5143ac35.tar UXP-c22a493144e39d76bfa42c46f9d6d17a5143ac35.tar.gz UXP-c22a493144e39d76bfa42c46f9d6d17a5143ac35.tar.lz UXP-c22a493144e39d76bfa42c46f9d6d17a5143ac35.tar.xz UXP-c22a493144e39d76bfa42c46f9d6d17a5143ac35.zip |
Revert #1142 - Remove unboxed objects
- accounting for removal of watch()/unwatch()
Diffstat (limited to 'js/src/jit/ScalarReplacement.cpp')
-rw-r--r-- | js/src/jit/ScalarReplacement.cpp | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/js/src/jit/ScalarReplacement.cpp b/js/src/jit/ScalarReplacement.cpp index 97ba52349..be9ceee2e 100644 --- a/js/src/jit/ScalarReplacement.cpp +++ b/js/src/jit/ScalarReplacement.cpp @@ -285,6 +285,10 @@ class ObjectMemoryView : public MDefinitionVisitorDefaultNoop void visitGuardShape(MGuardShape* ins); void visitFunctionEnvironment(MFunctionEnvironment* ins); void visitLambda(MLambda* ins); + + private: + void storeOffset(MInstruction* ins, size_t offset, MDefinition* value); + void loadOffset(MInstruction* ins, size_t offset); }; const char* ObjectMemoryView::phaseName = "Scalar Replacement of Object"; @@ -626,6 +630,35 @@ ObjectMemoryView::visitLambda(MLambda* ins) ins->setIncompleteObject(); } +void +ObjectMemoryView::storeOffset(MInstruction* ins, size_t offset, MDefinition* value) +{ + // Clone the state and update the slot value. + MOZ_ASSERT(state_->hasOffset(offset)); + state_ = BlockState::Copy(alloc_, state_); + if (!state_) { + oom_ = true; + return; + } + + state_->setOffset(offset, value); + ins->block()->insertBefore(ins, state_); + + // Remove original instruction. + ins->block()->discard(ins); +} + +void +ObjectMemoryView::loadOffset(MInstruction* ins, size_t offset) +{ + // Replace load by the slot value. + MOZ_ASSERT(state_->hasOffset(offset)); + ins->replaceAllUsesWith(state_->getOffset(offset)); + + // Remove original instruction. + ins->block()->discard(ins); +} + static bool IndexOf(MDefinition* ins, int32_t* res) { |