@@ -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,18 @@ 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 ;
722-
723- // Skip LHS of assignment as it is invalid
724- if (expr instanceof AssignmentExprent ) {
725- add = ex != ((AssignmentExprent ) expr ).getLeft ();
726- }
727731
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 ;
740739 }
741740
742- if (add ) {
743- stack .add (ex );
744- }
741+ stack .add (ex );
742+ parent .add (expr );
745743 }
746744 }
747745
0 commit comments