Skip to content

Commit 7211ec7

Browse files
committed
Fix ppmm bug
1 parent 1d3b05a commit 7211ec7

File tree

2 files changed

+130
-132
lines changed

2 files changed

+130
-132
lines changed

src/org/jetbrains/java/decompiler/modules/decompiler/SimplifyExprentsHelper.java

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -683,20 +683,30 @@ private static boolean inlinePPIAndMMI(Exprent expr, Exprent next) {
683683
// Try to find the first valid usage of a variable for PPMM inlining.
684684
// Returns Pair{parent exprent, variable exprent to replace}
685685
private static Pair<Exprent, VarExprent> findFirstValidUsage(VarExprent match, Exprent next) {
686-
Deque<Exprent> stack = new LinkedList<>();
686+
List<Exprent> stack = new ArrayList<>();
687+
List<Exprent> parent = new ArrayList<>();
687688
stack.add(next);
689+
parent.add(null);
688690

689691
while (!stack.isEmpty()) {
690-
Exprent expr = stack.removeLast();
692+
Exprent expr = stack.remove(stack.size() - 1);
693+
Exprent parentExpr = parent.remove(parent.size() - 1);
691694

692695
List<Exprent> exprents = expr.getAllExprents();
693696

697+
if (parentExpr != null &&
698+
expr instanceof VarExprent ve &&
699+
ve.getIndex() == match.getIndex() &&
700+
ve.getVersion() == match.getVersion()) {
701+
return Pair.of(parentExpr, ve);
702+
}
703+
694704
if (expr instanceof FunctionExprent) {
695705
FunctionExprent func = (FunctionExprent) expr;
696706

697707
// Don't inline ppmm into more ppmm
698708
if (isPPMM(func)) {
699-
continue;
709+
return null;
700710
}
701711

702712
// Don't consider || or &&
@@ -718,30 +728,14 @@ private static Pair<Exprent, VarExprent> findFirstValidUsage(VarExprent match, E
718728
// Reverse iteration to ensure DFS
719729
for (int i = exprents.size() - 1; i >= 0; i--) {
720730
Exprent ex = exprents.get(i);
721-
boolean add = true;
722731

723732
// Skip LHS of assignment as it is invalid
724-
if (expr instanceof AssignmentExprent) {
725-
add = ex != ((AssignmentExprent) expr).getLeft();
726-
}
727-
728-
// Check var if we find
729-
if (add && ex instanceof VarExprent) {
730-
VarExprent ve = (VarExprent) ex;
731-
732-
if (ve.getIndex() == match.getIndex() && ve.getVersion() == match.getVersion()) {
733-
return Pair.of(expr, ve);
734-
}
735-
}
736-
737-
// Ignore ++/-- exprents as they aren't valid usages to replace
738-
if (ex instanceof FunctionExprent) {
739-
add = !isPPMM((FunctionExprent) ex);
733+
if (expr instanceof AssignmentExprent asExpr && ex == asExpr.getLeft()) {
734+
continue;
740735
}
741736

742-
if (add) {
743-
stack.add(ex);
744-
}
737+
stack.add(ex);
738+
parent.add(expr);
745739
}
746740
}
747741

testData/results/pkg/TestPPMM.dec

Lines changed: 113 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,15 @@ public class TestPPMM {
6767

6868
public void doubleppi() {
6969
int a = 0;// 80
70-
t2(++a, ++a);// 81 82 83
70+
a++;// 81
71+
t2(++a, a);// 82 83
7172
t2(++a, ++a);// 84 85
72-
t2(++a, ++a);// 86 87
73+
a++;// 86
74+
t2(++a, a);// 87
7375
t2(++a, ++a);// 88 89
7476
t2(++a, a++);// 90 91
75-
t2(a, ++a);// 92 93
76-
t2(a, ++a);// 94
77+
t2(++a, a);// 92 93
78+
t2(++a, a);// 94
7779
t2(a++, a);// 95
7880
t2(a++, a);// 96
7981
t2(a, a++);// 97
@@ -286,97 +288,99 @@ class 'pkg/TestPPMM' {
286288
2 69
287289
3 69
288290
4 69
289-
5 69
290-
6 69
291-
7 69
292-
a 69
293-
b 69
294-
c 69
295-
d 70
296-
e 70
297-
f 70
298-
11 70
299-
12 70
300-
13 70
301-
15 70
302-
16 70
303-
17 70
304-
18 71
305-
19 71
306-
1a 71
307-
1b 71
308-
1c 71
309-
1d 71
310-
20 71
311-
21 71
312-
22 71
313-
23 72
314-
24 72
315-
25 72
316-
27 72
317-
28 72
318-
29 72
319-
2b 72
320-
2c 72
321-
2d 72
322-
2e 73
323-
2f 73
324-
30 73
325-
33 73
326-
34 73
327-
35 73
328-
36 73
329-
37 73
330-
38 73
331-
39 74
332-
3a 74
333-
3b 74
334-
3c 74
335-
3e 74
336-
3f 74
337-
40 74
338-
41 75
339-
42 75
340-
43 75
341-
44 75
342-
46 75
343-
47 75
344-
48 75
345-
4a 76
346-
4b 76
347-
4c 76
348-
4d 76
349-
4e 76
350-
4f 76
351-
50 76
352-
52 77
353-
53 77
354-
54 77
355-
55 77
356-
56 77
357-
57 77
358-
58 77
359-
59 78
360-
5b 78
361-
5c 78
362-
5d 78
363-
5e 78
364-
5f 78
365-
60 78
366-
61 79
367-
62 79
368-
63 79
369-
64 79
370-
65 79
371-
66 80
291+
5 70
292+
6 70
293+
7 70
294+
9 70
295+
a 70
296+
b 70
297+
c 70
298+
d 71
299+
e 71
300+
f 71
301+
11 71
302+
12 71
303+
13 71
304+
15 71
305+
16 71
306+
17 71
307+
18 72
308+
19 72
309+
1a 72
310+
1b 73
311+
1c 73
312+
1d 73
313+
1f 73
314+
20 73
315+
21 73
316+
22 73
317+
23 74
318+
24 74
319+
25 74
320+
27 74
321+
28 74
322+
29 74
323+
2b 74
324+
2c 74
325+
2d 74
326+
2e 75
327+
2f 75
328+
30 75
329+
33 75
330+
34 75
331+
35 75
332+
36 75
333+
37 75
334+
38 75
335+
39 76
336+
3a 76
337+
3b 76
338+
3d 76
339+
3e 76
340+
3f 76
341+
40 76
342+
41 77
343+
42 77
344+
43 77
345+
45 77
346+
46 77
347+
47 77
348+
48 77
349+
4a 78
350+
4b 78
351+
4c 78
352+
4d 78
353+
4e 78
354+
4f 78
355+
50 78
356+
52 79
357+
53 79
358+
54 79
359+
55 79
360+
56 79
361+
57 79
362+
58 79
363+
59 80
364+
5b 80
365+
5c 80
366+
5d 80
367+
5e 80
368+
5f 80
369+
60 80
370+
61 81
371+
62 81
372+
63 81
373+
64 81
374+
65 81
375+
66 82
372376
}
373377

374378
method 't (I)V' {
375-
0 83
379+
0 85
376380
}
377381

378382
method 't2 (II)V' {
379-
0 86
383+
0 88
380384
}
381385
}
382386

@@ -431,23 +435,23 @@ Lines mapping:
431435
78 <-> 66
432436
80 <-> 69
433437
81 <-> 70
434-
82 <-> 70
435-
83 <-> 70
436-
84 <-> 71
437-
85 <-> 71
438-
86 <-> 72
439-
87 <-> 72
440-
88 <-> 73
441-
89 <-> 73
442-
90 <-> 74
443-
91 <-> 74
444-
92 <-> 75
445-
93 <-> 75
446-
94 <-> 76
447-
95 <-> 77
448-
96 <-> 78
449-
97 <-> 79
450-
98 <-> 80
451-
99 <-> 81
452-
102 <-> 84
453-
106 <-> 87
438+
82 <-> 71
439+
83 <-> 71
440+
84 <-> 72
441+
85 <-> 72
442+
86 <-> 73
443+
87 <-> 74
444+
88 <-> 75
445+
89 <-> 75
446+
90 <-> 76
447+
91 <-> 76
448+
92 <-> 77
449+
93 <-> 77
450+
94 <-> 78
451+
95 <-> 79
452+
96 <-> 80
453+
97 <-> 81
454+
98 <-> 82
455+
99 <-> 83
456+
102 <-> 86
457+
106 <-> 89

0 commit comments

Comments
 (0)