@@ -683,20 +683,30 @@ private static boolean inlinePPIAndMMI(Exprent expr, Exprent next) {
683
683
// Try to find the first valid usage of a variable for PPMM inlining.
684
684
// Returns Pair{parent exprent, variable exprent to replace}
685
685
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 <>();
687
688
stack .add (next );
689
+ parent .add (null );
688
690
689
691
while (!stack .isEmpty ()) {
690
- Exprent expr = stack .removeLast ();
692
+ Exprent expr = stack .remove (stack .size () - 1 );
693
+ Exprent parentExpr = parent .remove (parent .size () - 1 );
691
694
692
695
List <Exprent > exprents = expr .getAllExprents ();
693
696
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
+
694
704
if (expr instanceof FunctionExprent ) {
695
705
FunctionExprent func = (FunctionExprent ) expr ;
696
706
697
707
// Don't inline ppmm into more ppmm
698
708
if (isPPMM (func )) {
699
- continue ;
709
+ return null ;
700
710
}
701
711
702
712
// Don't consider || or &&
@@ -718,30 +728,18 @@ private static Pair<Exprent, VarExprent> findFirstValidUsage(VarExprent match, E
718
728
// Reverse iteration to ensure DFS
719
729
for (int i = exprents .size () - 1 ; i >= 0 ; i --) {
720
730
Exprent ex = exprents .get (i );
721
- boolean add = true ;
722
-
723
- // Skip LHS of assignment as it is invalid
724
- if (expr instanceof AssignmentExprent ) {
725
- add = ex != ((AssignmentExprent ) expr ).getLeft ();
726
- }
727
731
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 );
732
+ // Avoid making something like `++a = 5`. It shouldn't happen but better be safe than sorry.
733
+ if (expr instanceof AssignmentExprent asExpr &&
734
+ ex == asExpr .getLeft () &&
735
+ ex instanceof VarExprent innerEx &&
736
+ innerEx .getIndex () == match .getIndex ()
737
+ ) {
738
+ continue ;
740
739
}
741
740
742
- if (add ) {
743
- stack .add (ex );
744
- }
741
+ stack .add (ex );
742
+ parent .add (expr );
745
743
}
746
744
}
747
745
0 commit comments