Skip to content

Commit f6d1559

Browse files
committed
review fixes
1 parent a7606ec commit f6d1559

3 files changed

Lines changed: 68 additions & 2 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/intermediatelang/optimizer/SideEffectAnalyzer.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,9 @@ private boolean functionHasSideEffects(ImFunction func) {
513513
}
514514

515515
private boolean hasGlobalSideEffects(Element elem) {
516+
if (hasMemberWrites(elem)) {
517+
return true;
518+
}
516519
for (ImVar var : directlySetVariables(elem)) {
517520
// Some optimization passes temporarily detach vars; in that state isGlobal() throws.
518521
if (isAttachedGlobal(var)) {
@@ -532,6 +535,38 @@ private boolean hasGlobalSideEffects(Element elem) {
532535
return false;
533536
}
534537

538+
private boolean hasMemberWrites(Element elem) {
539+
final boolean[] foundMemberWrite = {false};
540+
elem.accept(new ImStmt.DefaultVisitor() {
541+
@Override
542+
public void visit(ImSet set) {
543+
super.visit(set);
544+
if (isMemberWrite(set.getLeft())) {
545+
foundMemberWrite[0] = true;
546+
}
547+
}
548+
549+
private boolean isMemberWrite(ImLExpr left) {
550+
if (left instanceof ImMemberAccess) {
551+
return true;
552+
}
553+
if (left instanceof ImTupleSelection) {
554+
ImExpr tupleExpr = ((ImTupleSelection) left).getTupleExpr();
555+
return tupleExpr instanceof ImLExpr && isMemberWrite((ImLExpr) tupleExpr);
556+
}
557+
if (left instanceof ImTupleExpr) {
558+
for (ImExpr expr : ((ImTupleExpr) left).getExprs()) {
559+
if (expr instanceof ImLExpr && isMemberWrite((ImLExpr) expr)) {
560+
return true;
561+
}
562+
}
563+
}
564+
return false;
565+
}
566+
});
567+
return foundMemberWrite[0];
568+
}
569+
535570
private boolean isAttachedGlobal(ImVar var) {
536571
Element parent = var.getParent();
537572
return parent != null && parent.getParent() instanceof ImProg;

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtranslation/ImTranslator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ public ImProg translateProg() {
185185

186186
public void removeEmptyPackageInits() {
187187
Set<ImFunction> emptyInitFunctions = new HashSet<>();
188-
for (ImFunction initFunc : imProg.getFunctions()) {
189-
if (initFunc.getName().startsWith("init_") && isTrivialInitFunction(initFunc)) {
188+
for (ImFunction initFunc : new LinkedHashSet<>(initFuncMap.values())) {
189+
if (isTrivialInitFunction(initFunc)) {
190190
emptyInitFunctions.add(initFunc);
191191
}
192192
}

de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/OptimizerTests.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,37 @@ public void deadStoreKeepsPotentialDivisionTrapInCallee() throws IOException {
629629
assertTrue(compiledNoOpt.contains("1 /"), "potential division trap in callee should be preserved");
630630
}
631631

632+
@Test
633+
public void deadStoreKeepsObservableMemberMutationInCallee() {
634+
testAssertOkLines(true,
635+
"package test",
636+
"native testSuccess()",
637+
"class C",
638+
" int x",
639+
"function mutate(C c) returns int",
640+
" c.x = 7",
641+
" return 1",
642+
"init",
643+
" let c = new C",
644+
" int unused = mutate(c)",
645+
" if c.x == 7",
646+
" testSuccess()"
647+
);
648+
}
649+
650+
@Test
651+
public void removeEmptyPackageInitsDoesNotPruneUserInitPrefixedFunctions() {
652+
testAssertOkLines(true,
653+
"package test",
654+
"native testSuccess()",
655+
"function init_user() returns bool",
656+
" return true",
657+
"init",
658+
" if init_user()",
659+
" testSuccess()"
660+
);
661+
}
662+
632663
@Test
633664
public void test_unreachableCodeRemover() throws IOException {
634665
test().withStdLib().lines(

0 commit comments

Comments
 (0)