diff options
| author | Ulf Hermann <ulf.hermann@qt.io> | 2024-06-14 12:00:06 +0200 |
|---|---|---|
| committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-10-10 11:29:48 +0200 |
| commit | 711267400326ee7e72078022dbadf6444e82427c (patch) | |
| tree | dab43af34271a592cccc507ed04ece31bb02bdf4 /src/qmlcompiler/qqmljsoptimizations.cpp | |
| parent | 78640ffe606fbc5b4ef72d256213d2bc46f1bd20 (diff) | |
QmlCompiler: Store full type information for conversion origins
With this in place, we don't have to synthesize conversion origins
anymore and get to trace values through conversions.
Task-number: QTBUG-124670
Change-Id: Ib3646d410526eca7b982f86adef9d5a387ff56ea
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljsoptimizations.cpp')
| -rw-r--r-- | src/qmlcompiler/qqmljsoptimizations.cpp | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/src/qmlcompiler/qqmljsoptimizations.cpp b/src/qmlcompiler/qqmljsoptimizations.cpp index 0603d6fa42..7bb6185e58 100644 --- a/src/qmlcompiler/qqmljsoptimizations.cpp +++ b/src/qmlcompiler/qqmljsoptimizations.cpp @@ -80,7 +80,10 @@ void QQmlJSOptimizations::populateReaderLocations() // If it's a conversion, we have to check for all readers of the conversion origins. // This happens at jump targets where different types are merged. A StoreReg or similar // instruction must be optimized out if none of the types it can hold is read anymore. - access.trackedTypes = writeIt->second.changedRegister.conversionOrigins(); + access.trackedTypes.clear(); + const auto origins = writeIt->second.changedRegister.conversionOrigins(); + for (const QQmlJSRegisterContent &origin : origins) + access.trackedTypes.append(origin.containedType()); } else { access.trackedTypes.append( m_typeResolver->trackedContainedType(writeIt->second.changedRegister)); @@ -121,12 +124,19 @@ void QQmlJSOptimizations::populateReaderLocations() for (auto readIt = blockInstr->second.readRegisters.constBegin(), end = blockInstr->second.readRegisters.constEnd(); readIt != end; ++readIt) { - if (!blockInstr->second.isRename && containsAny( - readIt->second.content.conversionOrigins(), access.trackedTypes)) { - Q_ASSERT(readIt->second.content.isConversion()); - Q_ASSERT(readIt->second.content.conversionResult()); - access.typeReaders[blockInstr.key()] - = readIt->second.content.conversionResult(); + if (!blockInstr->second.isRename) { + const QList<QQmlJSRegisterContent> conversionOrigins + = readIt->second.content.conversionOrigins(); + for (const QQmlJSRegisterContent &origin : conversionOrigins) { + if (!access.trackedTypes.contains(origin.containedType())) + continue; + + Q_ASSERT(readIt->second.content.isConversion()); + Q_ASSERT(readIt->second.content.conversionResult()); + access.typeReaders[blockInstr.key()] + = readIt->second.content.conversionResult(); + break; + } } if (registerActive && readIt->first == writtenRegister) access.registerReadersAndConversions[blockInstr.key()] = conversions; @@ -449,7 +459,7 @@ void QQmlJSOptimizations::adjustTypes() QQmlJSScope::ConstPtr conversionResult = content.conversionResult(); const auto conversionOrigins = content.conversionOrigins(); for (const auto &origin : conversionOrigins) - newResult = m_typeResolver->merge(newResult, origin); + newResult = m_typeResolver->merge(newResult, origin.containedType()); if (!m_typeResolver->adjustTrackedType(conversionResult, newResult)) addError(adjustErrorMessage(conversionResult, newResult)); } |
