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);
44 QList<QQmlJSRegisterContent> trackedTypes;
52 QHash<
int, QQmlJSRegisterContent> typeReaders;
60 QHash<
int, Conversions> registerReadersAndConversions;
66 QV4::Moth::ByteCodeHandler::Verdict startInstruction(QV4::Moth::Instr::Type) override
68 return ProcessInstruction;
70 void endInstruction(QV4::Moth::Instr::Type) override { }
72 void populateBasicBlocks();
73 void populateReaderLocationsTrackedTypes();
74 void populateReaderLocationsReadersAndConversions();
76 bool canMove(
int instructionOffset,
const RegisterAccess &access)
const;
78 void removeReadsFromErasedInstructions(
const QFlatMap<
int, InstructionAnnotation>::const_iterator &it);
79 void removeDeadStoresUntilStable();
80 bool eraseDeadStore(
const InstructionAnnotations::iterator &it,
bool &erasedReaders);
82 QHash<
int, RegisterAccess> m_readerLocations;
83 QList<ObjectOrArrayDefinition> m_objectAndArrayDefinitions;