diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-24 16:30:28 +0200 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-10-31 12:54:10 +0200 |
commit | c662ae7cbf49bdfc9fd96d34301a86fe96550773 (patch) | |
tree | 7a17427562340afc17b60ccc075a55e8828ff620 /tests/auto/qml/qmlcppcodegen | |
parent | b96251eb1c371d388e956d3fddf33c5a34e9be6b (diff) |
QmlCompiler: Generate jump code also when skipping an instruction
The next instruction may still need the type conversions even if we
don't need to generate any code for the current instruction.
Also, generate trace info for generate_DeadTemporalZoneCheck so that we
can recognize it in the generated code.
Amends commit 2c410317b6077fdcfb2cdeb4b730c1b0c544147e.
Pick-to: 6.6 6.5
Fixes: QTBUG-118514
Change-Id: I70ad3691486176de2177e9d5f538f7c99d121bfa
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Sami Shalayel <sami.shalayel@qt.io>
Diffstat (limited to 'tests/auto/qml/qmlcppcodegen')
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml | 32 | ||||
-rw-r--r-- | tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp | 20 |
3 files changed, 53 insertions, 0 deletions
diff --git a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt index 0a33eece52..fd0b43312e 100644 --- a/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt +++ b/tests/auto/qml/qmlcppcodegen/data/CMakeLists.txt @@ -90,6 +90,7 @@ set(qml_files construct.qml contextParam.qml conversionDecrement.qml + conversionInDeadCode.qml conversions.qml conversions2.qml convertToOriginalReadAcumulatorForUnaryOperators.qml diff --git a/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml b/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml new file mode 100644 index 0000000000..b2e7b40c00 --- /dev/null +++ b/tests/auto/qml/qmlcppcodegen/data/conversionInDeadCode.qml @@ -0,0 +1,32 @@ +pragma Strict +import QtQml + +QtObject { + // This does not look like dead code, but each access to 'result' generates a + // DeadTemoralZoneCheck instruction that we ignore when compiling to C++ + // after checking statically that 'result' is alive throughout the function. + // Therefore, this function is a torture test for the dead code elimination. + function calc(a: int, b: int) : int { + let result = a; + if (b < 0) { + if (b < -1) + result -= b; + if (b < -2) + result /= b; + } else { + if (b > 1) + result *= b; + if (b > 2) + result += b; + } + return result; + } + + property int a: calc(10, -3); + property int b: calc(10, -2); + property int c: calc(10, -1); + property int d: calc(10, 0); + property int e: calc(10, 1); + property int f: calc(10, 2); + property int g: calc(10, 3); +} diff --git a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp index 4854108b86..9b1987ef13 100644 --- a/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp +++ b/tests/auto/qml/qmlcppcodegen/tst_qmlcppcodegen.cpp @@ -66,6 +66,7 @@ private slots: void construct(); void contextParam(); void conversionDecrement(); + void conversionInDeadCode(); void conversions(); void convertToOriginalReadAcumulatorForUnaryOperators(); void cppValueTypeList(); @@ -1104,6 +1105,25 @@ void tst_QmlCppCodegen::conversionDecrement() QCOMPARE(o->property("currentPageIndex").toInt(), 3); } +void tst_QmlCppCodegen::conversionInDeadCode() +{ + QQmlEngine engine; + QQmlComponent c(&engine, QUrl(u"qrc:/qt/qml/TestTypes/conversionInDeadCode.qml"_s)); + + QVERIFY2(c.isReady(), qPrintable(c.errorString())); + + QScopedPointer<QObject> o(c.create()); + QVERIFY(!o.isNull()); + + QCOMPARE(o->property("a").toInt(), -4); + QCOMPARE(o->property("b").toInt(), 12); + QCOMPARE(o->property("c").toInt(), 10); + QCOMPARE(o->property("d").toInt(), 10); + QCOMPARE(o->property("e").toInt(), 10); + QCOMPARE(o->property("f").toInt(), 20); + QCOMPARE(o->property("g").toInt(), 33); +} + void tst_QmlCppCodegen::conversions() { QQmlEngine engine; |