aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsoptimizations.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2024-06-14 12:00:06 +0200
committerUlf Hermann <ulf.hermann@qt.io>2024-10-10 11:29:48 +0200
commit711267400326ee7e72078022dbadf6444e82427c (patch)
treedab43af34271a592cccc507ed04ece31bb02bdf4 /src/qmlcompiler/qqmljsoptimizations.cpp
parent78640ffe606fbc5b4ef72d256213d2bc46f1bd20 (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.cpp26
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));
}