Skip to content

Commit b020f51

Browse files
committed
Clarify address target optimization test
1 parent 8fd3555 commit b020f51

2 files changed

Lines changed: 28 additions & 3 deletions

File tree

src/main/java/io/jawk/intermediate/AwkTuples.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1882,7 +1882,7 @@ private boolean peepholeOptimizePass() {
18821882
int[] indexMapping = new int[originalSize];
18831883
Arrays.fill(indexMapping, -1);
18841884
java.util.List<Tuple> optimizedQueue = new ArrayList<Tuple>(originalSize);
1885-
boolean[] addressTargets = addressTargets(original, originalSize);
1885+
boolean[] isAddressTarget = addressTargets(original, originalSize);
18861886

18871887
boolean modified = false;
18881888
int oldIndex = 0;
@@ -1898,7 +1898,7 @@ private boolean peepholeOptimizePass() {
18981898
// unless the POP itself is a branch target. Branches that land on
18991899
// the POP must continue to skip the assignment and only discard the
19001900
// already-computed expression result.
1901-
if (nextTuple.getOpcode() == Opcode.POP && !addressTargets[oldIndex + 1]) {
1901+
if (nextTuple.getOpcode() == Opcode.POP && !isAddressTarget[oldIndex + 1]) {
19021902
Tuple replacement = createAssignNoPush(tuple);
19031903
optimizedQueue.add(replacement);
19041904
mapFoldedRange(indexMapping, oldIndex, 2, newIndex);

src/test/java/io/jawk/AwkTupleOptimizationTest.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public void keepsAssignmentPopWhenPopIsBranchTarget() throws Exception {
181181
AwkProgram tuples = new Awk().compile(script);
182182
assertTrue(
183183
"ASSIGN followed by targeted POP should not be folded",
184-
hasAdjacentOpcodes(tuples, Opcode.ASSIGN, Opcode.POP));
184+
hasAddressTargetWithPredecessor(tuples, Opcode.ASSIGN, Opcode.POP));
185185
}
186186

187187
@Test
@@ -533,6 +533,31 @@ private static boolean hasAdjacentOpcodes(AwkProgram tuples, Opcode first, Opcod
533533
return false;
534534
}
535535

536+
private static boolean hasAddressTargetWithPredecessor(AwkProgram tuples, Opcode predecessor, Opcode target) {
537+
Set<Integer> targetIndexes = new HashSet<>();
538+
PositionTracker tracker = rawTuples(tuples).top();
539+
while (!tracker.isEOF()) {
540+
Address address = tracker.current().getAddress();
541+
if (address != null) {
542+
targetIndexes.add(Integer.valueOf(address.index()));
543+
}
544+
tracker.next();
545+
}
546+
547+
tracker = rawTuples(tuples).top();
548+
Opcode previous = null;
549+
while (!tracker.isEOF()) {
550+
if (targetIndexes.contains(Integer.valueOf(tracker.currentIndex()))
551+
&& previous == predecessor
552+
&& tracker.opcode() == target) {
553+
return true;
554+
}
555+
previous = tracker.opcode();
556+
tracker.next();
557+
}
558+
return false;
559+
}
560+
536561
private static int countOpcode(AwkProgram tuples, Opcode opcode) {
537562
int count = 0;
538563
PositionTracker tracker = rawTuples(tuples).top();

0 commit comments

Comments
 (0)