25 using Conversions = QSet<
int>;
27 QQmlJSOptimizations(
const QV4::Compiler::JSUnitGenerator *unitGenerator,
28 const QQmlJSTypeResolver *typeResolver, QQmlJSLogger *logger,
29 const BasicBlocks &basicBlocks,
const InstructionAnnotations &annotations,
30 QList<ObjectOrArrayDefinition> objectAndArrayDefinitions)
31 : QQmlJSCompilePass(unitGenerator, typeResolver, logger, basicBlocks, annotations),
32 m_objectAndArrayDefinitions{ std::move(objectAndArrayDefinitions) }
36 ~QQmlJSOptimizations() =
default;
38 BlocksAndAnnotations run(
const Function *function);
43 QList<QQmlJSRegisterContent> trackedTypes;
44 QHash<
int, QQmlJSRegisterContent> typeReaders;
45 QHash<
int, Conversions> registerReadersAndConversions;
49 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type) override
51 return ProcessInstruction;
53 void endInstruction(QV4::Moth::Instr::Type) override { }
55 void populateBasicBlocks();
56 void populateReaderLocations();
58 bool canMove(
int instructionOffset,
const RegisterAccess &access)
const;
60 void removeReadsFromErasedInstructions(
const QFlatMap<
int, InstructionAnnotation>::const_iterator &it);
61 void removeDeadStoresUntilStable();
62 bool eraseDeadStore(
const InstructionAnnotations::iterator &it,
bool &erasedReaders);
64 QHash<
int, RegisterAccess> m_readerLocations;
65 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;