From 14e25949280de8c7ed76b3e4d338d5e4e3041139 Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 9 Oct 2024 16:30:14 +0200 Subject: [PATCH 01/24] correct spelling error --- .../sootup/java/bytecode/frontend/interceptors/AssertUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/AssertUtils.java b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/AssertUtils.java index 515b6ad188e..31c9d19159d 100644 --- a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/AssertUtils.java +++ b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/AssertUtils.java @@ -29,7 +29,7 @@ public static void assertLocalsEquiv(Body expected, Body actual) { } } - // assert whether two bodys have the same stmtGraphs + // assert whether two bodies have the same stmtGraphs public static void assertStmtGraphEquiv(Body expected, Body actual) { StmtGraph expected_SG = expected.getStmtGraph(); StmtGraph actual_SG = actual.getStmtGraph(); From c9f809543db2d4422f80034ac5ddb2da39b72d15 Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 9 Oct 2024 16:31:38 +0200 Subject: [PATCH 02/24] add interface BlockIterator --- .../java/sootup/core/graph/BlockIterator.java | 25 +++++++ .../core/graph/PostOrderBlockIterator.java | 75 +++++++++++++++++++ .../graph/ReversePostOrderBlockIterator.java | 56 ++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 sootup.core/src/main/java/sootup/core/graph/BlockIterator.java create mode 100644 sootup.core/src/main/java/sootup/core/graph/PostOrderBlockIterator.java create mode 100644 sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockIterator.java diff --git a/sootup.core/src/main/java/sootup/core/graph/BlockIterator.java b/sootup.core/src/main/java/sootup/core/graph/BlockIterator.java new file mode 100644 index 00000000000..aaeb37c541d --- /dev/null +++ b/sootup.core/src/main/java/sootup/core/graph/BlockIterator.java @@ -0,0 +1,25 @@ +package sootup.core.graph; +/*- + * #%L + * Soot - a J*va Optimization Framework + * %% + * Copyright (C) 2024 Junjie Shen + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +import java.util.Iterator; + +public interface BlockIterator extends Iterator> {} diff --git a/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockIterator.java b/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockIterator.java new file mode 100644 index 00000000000..d314282e24e --- /dev/null +++ b/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockIterator.java @@ -0,0 +1,75 @@ +package sootup.core.graph; +/*- + * #%L + * Soot - a J*va Optimization Framework + * %% + * Copyright (C) 2024 Junjie Shen + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ + +import java.util.*; +import javax.annotation.Nonnull; + +public class PostOrderBlockIterator implements BlockIterator { + + private final Stack stack = new Stack<>(); + private final Set> visited = new HashSet<>(); + + public PostOrderBlockIterator(@Nonnull BasicBlock startNode) { + visitNode(startNode); + stack.push(new Frame(startNode, ((List>) startNode.getSuccessors()).iterator())); + } + + private boolean visitNode(@Nonnull BasicBlock node) { + return visited.add(node); + } + + @Override + public boolean hasNext() { + return !stack.isEmpty(); + } + + @Override + public BasicBlock next() { + if (!hasNext()) { + throw new NoSuchElementException("There is no more block."); + } + while (!stack.isEmpty()) { + Frame frame = stack.peek(); + if (frame.succIterator.hasNext()) { + BasicBlock succ = frame.succIterator.next(); + if (visitNode(succ)) { + stack.push(new Frame(succ, ((List>) succ.getSuccessors()).iterator())); + } + } else { + stack.pop(); + return frame.node; + } + } + return null; + } + + private static class Frame { + final BasicBlock node; + final Iterator> succIterator; + + Frame(BasicBlock node, Iterator> childIterator) { + this.node = node; + this.succIterator = childIterator; + } + } +} diff --git a/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockIterator.java b/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockIterator.java new file mode 100644 index 00000000000..4780d773257 --- /dev/null +++ b/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockIterator.java @@ -0,0 +1,56 @@ +package sootup.core.graph; +/*- + * #%L + * Soot - a J*va Optimization Framework + * %% + * Copyright (C) 2024 Junjie Shen + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; +import javax.annotation.Nonnull; + +public class ReversePostOrderBlockIterator implements BlockIterator { + private List> blocks; + private int i = 0; + + public ReversePostOrderBlockIterator(@Nonnull BasicBlock startNode) { + blocks = + StreamSupport.stream( + Spliterators.spliteratorUnknownSize( + new PostOrderBlockIterator(startNode), Spliterator.ORDERED), + false) + .collect(Collectors.toList()); + Collections.reverse(blocks); + } + + @Override + public boolean hasNext() { + return i < blocks.size(); + } + + @Override + public BasicBlock next() { + if (!hasNext()) { + throw new NoSuchElementException("There is no more block."); + } + i++; + return blocks.get(i - 1); + } +} From 3fcafe0d8e8ae74334b4b8e72cae163f1fc2080d Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 9 Oct 2024 16:32:00 +0200 Subject: [PATCH 03/24] add interface BlockTraversal --- .../sootup/core/graph/BlockTraversal.java | 23 ++++++++ .../core/graph/PostOrderBlockTraversal.java | 54 +------------------ .../graph/ReversePostOrderBlockTraversal.java | 31 +---------- 3 files changed, 26 insertions(+), 82 deletions(-) create mode 100644 sootup.core/src/main/java/sootup/core/graph/BlockTraversal.java diff --git a/sootup.core/src/main/java/sootup/core/graph/BlockTraversal.java b/sootup.core/src/main/java/sootup/core/graph/BlockTraversal.java new file mode 100644 index 00000000000..5bcb4fb635c --- /dev/null +++ b/sootup.core/src/main/java/sootup/core/graph/BlockTraversal.java @@ -0,0 +1,23 @@ +package sootup.core.graph; +/*- + * #%L + * Soot - a J*va Optimization Framework + * %% + * Copyright (C) 2024 Junjie Shen + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ +public interface BlockTraversal {} diff --git a/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockTraversal.java b/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockTraversal.java index 7393dda3711..51c9abf2e54 100644 --- a/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockTraversal.java +++ b/sootup.core/src/main/java/sootup/core/graph/PostOrderBlockTraversal.java @@ -27,7 +27,7 @@ import java.util.stream.StreamSupport; import javax.annotation.Nonnull; -public class PostOrderBlockTraversal { +public class PostOrderBlockTraversal implements BlockTraversal { private final BasicBlock startNode; @@ -44,7 +44,7 @@ public Iterable> getOrder() { } public BlockIterator iterator() { - return new BlockIterator(startNode); + return new PostOrderBlockIterator(startNode); } @Nonnull @@ -55,54 +55,4 @@ public static List> getBlocksSorted(StmtGraph cfg) { false) .collect(Collectors.toList()); } - - public static class BlockIterator implements Iterator> { - private final Stack stack = new Stack<>(); - private final Set> visited = new HashSet<>(); - - public BlockIterator(@Nonnull BasicBlock startNode) { - visitNode(startNode); - stack.push( - new Frame(startNode, ((List>) startNode.getSuccessors()).iterator())); - } - - private boolean visitNode(@Nonnull BasicBlock node) { - return visited.add(node); - } - - @Override - public boolean hasNext() { - return !stack.isEmpty(); - } - - @Override - public BasicBlock next() { - if (!hasNext()) { - throw new NoSuchElementException("There is no more block."); - } - while (!stack.isEmpty()) { - Frame frame = stack.peek(); - if (frame.succIterator.hasNext()) { - BasicBlock succ = frame.succIterator.next(); - if (visitNode(succ)) { - stack.push(new Frame(succ, ((List>) succ.getSuccessors()).iterator())); - } - } else { - stack.pop(); - return frame.node; - } - } - return null; - } - - private static class Frame { - final BasicBlock node; - final Iterator> succIterator; - - Frame(BasicBlock node, Iterator> childIterator) { - this.node = node; - this.succIterator = childIterator; - } - } - } } diff --git a/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockTraversal.java b/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockTraversal.java index de35f349895..620201df789 100644 --- a/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockTraversal.java +++ b/sootup.core/src/main/java/sootup/core/graph/ReversePostOrderBlockTraversal.java @@ -45,7 +45,7 @@ public Iterable> getOrder() { @Nonnull public BlockIterator iterator() { - return new BlockIterator(startNode); + return new ReversePostOrderBlockIterator(startNode); } @Nonnull @@ -56,33 +56,4 @@ public static List> getBlocksSorted(StmtGraph cfg) { false) .collect(Collectors.toList()); } - - public static class BlockIterator implements Iterator> { - private List> blocks; - private int i = 0; - - public BlockIterator(@Nonnull BasicBlock startNode) { - blocks = - StreamSupport.stream( - Spliterators.spliteratorUnknownSize( - new PostOrderBlockTraversal.BlockIterator(startNode), Spliterator.ORDERED), - false) - .collect(Collectors.toList()); - Collections.reverse(blocks); - } - - @Override - public boolean hasNext() { - return i < blocks.size(); - } - - @Override - public BasicBlock next() { - if (!hasNext()) { - throw new NoSuchElementException("There is no more block."); - } - i++; - return blocks.get(i - 1); - } - } } From ea109c4aca41f305eeee07c27123fec441a2073e Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 9 Oct 2024 16:33:01 +0200 Subject: [PATCH 04/24] add test case and improve tests for BlockOrder --- .../core/graph/PostOrderTraversalTest.java | 123 +++++------------ .../graph/ReversePostOrderTraversalTest.java | 116 +++++----------- .../sootup/core/graph/TestGraphGenerator.java | 129 ++++++++++++++++++ 3 files changed, 195 insertions(+), 173 deletions(-) create mode 100644 sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java diff --git a/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java b/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java index b0ef50594d0..db25c1a6d13 100644 --- a/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java @@ -2,30 +2,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import sootup.core.jimple.basic.Local; -import sootup.core.jimple.basic.StmtPositionInfo; -import sootup.core.jimple.common.constant.IntConstant; -import sootup.core.jimple.common.expr.JAddExpr; -import sootup.core.jimple.common.expr.JLeExpr; -import sootup.core.jimple.common.stmt.*; -import sootup.core.types.PrimitiveType; @Tag("Java8") public class PostOrderTraversalTest { - StmtPositionInfo noPosInfo = StmtPositionInfo.getNoStmtPositionInfo(); + TestGraphGenerator graphGenerator = new TestGraphGenerator(); @Test - void testReversePostorderTraversal() { - MutableBlockStmtGraph graph = createStmtGraph(); - Map, Integer> blocksToId = new HashMap<>(); - Map, Integer> blockToPOId = new HashMap<>(); + void testPostOrderTraversal1() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); + Map, Integer> blockToId = new HashMap<>(); // assign ids according to blocks sorted by BasicBlock::toString List> blocks = graph.getBlocks().stream() @@ -33,87 +22,41 @@ void testReversePostorderTraversal() { .collect(Collectors.toList()); int i = 0; for (BasicBlock block : blocks) { - blocksToId.put(block, i); - i++; - } - - // assign po ids according to PostOrderBlockTraversal.getOrder - Iterable> PO = new PostOrderBlockTraversal(graph).getOrder(); - i = 0; - for (BasicBlock block : PO) { - blockToPOId.put(block, i); + blockToId.put(block, i); i++; } - Map expectedSortedIdToRPOId = new HashMap<>(); - expectedSortedIdToRPOId.put(0, 1); - expectedSortedIdToRPOId.put(1, 4); - expectedSortedIdToRPOId.put(2, 5); - expectedSortedIdToRPOId.put(3, 6); - expectedSortedIdToRPOId.put(4, 3); - expectedSortedIdToRPOId.put(5, 2); - expectedSortedIdToRPOId.put(6, 0); + List> postOrderBlocks = PostOrderBlockTraversal.getBlocksSorted(graph); + List PO = + postOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - for (BasicBlock block : PO) { - Integer id = blocksToId.get(block); - Integer poId = blockToPOId.get(block); - Integer expectedPOId = expectedSortedIdToRPOId.get(id); - - assertEquals(expectedPOId, poId); - } + Integer[] arr = new Integer[] {6, 0, 5, 4, 1, 2, 3}; + List expectedPO = Arrays.asList(arr); + assertEquals(expectedPO, PO); } - private MutableBlockStmtGraph createStmtGraph() { - MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); - - Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); - Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); - Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); - - JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); - JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); - JAssignStmt assign03 = new JAssignStmt(l2, IntConstant.getInstance(0), noPosInfo); - JAssignStmt assign41 = new JAssignStmt(l2, l3, noPosInfo); - JAssignStmt assign42 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(2)), noPosInfo); - JAssignStmt assign51 = new JAssignStmt(l2, l1, noPosInfo); - JAssignStmt assign52 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(1)), noPosInfo); - - BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); - BranchingStmt if3 = new JIfStmt(new JLeExpr(l2, IntConstant.getInstance(20)), noPosInfo); - - JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); - JGotoStmt goto4 = new JGotoStmt(noPosInfo); - JGotoStmt goto5 = new JGotoStmt(noPosInfo); - JGotoStmt goto6 = new JGotoStmt(noPosInfo); - - // block 0 - graph.setStartingStmt(assign01); - graph.putEdge(assign01, assign02); - graph.putEdge(assign02, assign03); - graph.putEdge(assign03, if1); - - // block 1 - graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); - graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, if3); - - // block 3 - graph.putEdge(if3, JIfStmt.FALSE_BRANCH_IDX, assign41); - graph.putEdge(if3, JIfStmt.TRUE_BRANCH_IDX, assign51); - - // block 4 - graph.putEdge(assign41, assign42); - graph.putEdge(assign42, goto4); - graph.putEdge(goto4, JGotoStmt.BRANCH_IDX, goto6); + @Test + void testPostOrderTraversal2() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph2(); + Map, Integer> blockToId = new HashMap<>(); + Map, Integer> blockToPOId = new HashMap<>(); + // assign ids according to blocks sorted by BasicBlock::toString + List> blocks = + graph.getBlocks().stream() + .sorted(Comparator.comparing(BasicBlock::toString)) + .collect(Collectors.toList()); + int i = 0; + for (BasicBlock block : blocks) { + blockToId.put(block, i); + i++; + } - // block 5 - graph.putEdge(assign51, assign52); - graph.putEdge(assign52, goto5); - graph.putEdge(goto5, JGotoStmt.BRANCH_IDX, goto6); + List> postOrderBlocks = PostOrderBlockTraversal.getBlocksSorted(graph); + List PO = + postOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - // block 6 - graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); - return graph; + Integer[] arr = new Integer[] {2, 5, 3, 0, 4, 1}; + List expectedPO = Arrays.asList(arr); + assertEquals(expectedPO, PO); } } diff --git a/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java b/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java index 205bf72902a..b8a59a934d0 100644 --- a/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java @@ -6,23 +6,16 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import sootup.core.jimple.basic.Local; -import sootup.core.jimple.basic.StmtPositionInfo; -import sootup.core.jimple.common.constant.IntConstant; -import sootup.core.jimple.common.expr.JAddExpr; -import sootup.core.jimple.common.expr.JLeExpr; -import sootup.core.jimple.common.stmt.*; -import sootup.core.types.PrimitiveType; @Tag("Java8") public class ReversePostOrderTraversalTest { - StmtPositionInfo noPosInfo = StmtPositionInfo.getNoStmtPositionInfo(); + + TestGraphGenerator graphGenerator = new TestGraphGenerator(); @Test - void testReversePostorderTraversal() { - MutableBlockStmtGraph graph = createStmtGraph(); + void testReversePostOrderTraversal1() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); Map, Integer> blockToId = new HashMap<>(); - Map, Integer> blockToRPOId = new HashMap<>(); // assign ids according to blocks sorted by BasicBlock::toString List> blocks = graph.getBlocks().stream() @@ -34,83 +27,40 @@ void testReversePostorderTraversal() { i++; } - // assign rpo ids according to ReversePostOrderBlockTraversal.getOrder - Iterable> RPO = new ReversePostOrderBlockTraversal(graph).getOrder(); - i = 0; - for (BasicBlock block : RPO) { - blockToRPOId.put(block, i); - i++; - } + List> reversePostOrderBlocks = + ReversePostOrderBlockTraversal.getBlocksSorted(graph); + List RPO = + reversePostOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - Map expectedSortedIdToRPOId = new HashMap<>(); - expectedSortedIdToRPOId.put(0, 5); - expectedSortedIdToRPOId.put(1, 2); - expectedSortedIdToRPOId.put(2, 1); - expectedSortedIdToRPOId.put(3, 0); - expectedSortedIdToRPOId.put(4, 3); - expectedSortedIdToRPOId.put(5, 4); - expectedSortedIdToRPOId.put(6, 6); - - for (BasicBlock block : RPO) { - Integer id = blockToId.get(block); - Integer rpoId = blockToRPOId.get(block); - Integer expectedRPOId = expectedSortedIdToRPOId.get(id); - - assertEquals(expectedRPOId, rpoId); - } + Integer[] arr = new Integer[] {3, 2, 1, 4, 5, 0, 6}; + List expectedRPO = Arrays.asList(arr); + assertEquals(expectedRPO, RPO); } - private MutableBlockStmtGraph createStmtGraph() { - MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); - - Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); - Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); - Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); - - JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); - JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); - JAssignStmt assign03 = new JAssignStmt(l2, IntConstant.getInstance(0), noPosInfo); - JAssignStmt assign41 = new JAssignStmt(l2, l3, noPosInfo); - JAssignStmt assign42 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(2)), noPosInfo); - JAssignStmt assign51 = new JAssignStmt(l2, l1, noPosInfo); - JAssignStmt assign52 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(1)), noPosInfo); - - BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); - BranchingStmt if3 = new JIfStmt(new JLeExpr(l2, IntConstant.getInstance(20)), noPosInfo); - - JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); - JGotoStmt goto4 = new JGotoStmt(noPosInfo); - JGotoStmt goto5 = new JGotoStmt(noPosInfo); - JGotoStmt goto6 = new JGotoStmt(noPosInfo); - - // block 0 - graph.setStartingStmt(assign01); - graph.putEdge(assign01, assign02); - graph.putEdge(assign02, assign03); - graph.putEdge(assign03, if1); - - // block 1 - graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); - graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, if3); - - // block 3 - graph.putEdge(if3, JIfStmt.FALSE_BRANCH_IDX, assign41); - graph.putEdge(if3, JIfStmt.TRUE_BRANCH_IDX, assign51); + @Test + void testReversePostOrderTraversal2() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph2(); + Map, Integer> blocksToId = new HashMap<>(); + Map, Integer> blockToRPOId = new HashMap<>(); + // assign ids according to blocks sorted by BasicBlock::toString + List> blocks = + graph.getBlocks().stream() + .sorted(Comparator.comparing(BasicBlock::toString)) + .collect(Collectors.toList()); + int i = 0; + for (BasicBlock block : blocks) { + blocksToId.put(block, i); + i++; + } - // block 4 - graph.putEdge(assign41, assign42); - graph.putEdge(assign42, goto4); - graph.putEdge(goto4, JGotoStmt.BRANCH_IDX, goto6); + List> reversePostOrderBlocks = + ReversePostOrderBlockTraversal.getBlocksSorted(graph); + List RPO = + reversePostOrderBlocks.stream().map(b -> blocksToId.get(b)).collect(Collectors.toList()); - // block 5 - graph.putEdge(assign51, assign52); - graph.putEdge(assign52, goto5); - graph.putEdge(goto5, JGotoStmt.BRANCH_IDX, goto6); + Integer[] arr = new Integer[] {1, 4, 0, 3, 5, 2}; + List expectedRPO = Arrays.asList(arr); - // block 6 - graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); - return graph; + assertEquals(expectedRPO, RPO); } } diff --git a/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java new file mode 100644 index 00000000000..c46a3f224da --- /dev/null +++ b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java @@ -0,0 +1,129 @@ +package sootup.core.graph; + +import sootup.core.jimple.basic.Local; +import sootup.core.jimple.basic.StmtPositionInfo; +import sootup.core.jimple.common.constant.IntConstant; +import sootup.core.jimple.common.expr.JAddExpr; +import sootup.core.jimple.common.expr.JEqExpr; +import sootup.core.jimple.common.expr.JLeExpr; +import sootup.core.jimple.common.expr.JLtExpr; +import sootup.core.jimple.common.stmt.*; +import sootup.core.types.PrimitiveType; + +public class TestGraphGenerator { + + StmtPositionInfo noPosInfo = StmtPositionInfo.getNoStmtPositionInfo(); + + public MutableBlockStmtGraph createStmtGraph() { + MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); + + Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); + Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); + Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); + + JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); + JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); + JAssignStmt assign03 = new JAssignStmt(l2, IntConstant.getInstance(0), noPosInfo); + JAssignStmt assign41 = new JAssignStmt(l2, l3, noPosInfo); + JAssignStmt assign42 = + new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(2)), noPosInfo); + JAssignStmt assign51 = new JAssignStmt(l2, l1, noPosInfo); + JAssignStmt assign52 = + new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(1)), noPosInfo); + + BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); + BranchingStmt if3 = new JIfStmt(new JLeExpr(l2, IntConstant.getInstance(20)), noPosInfo); + + JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); + JGotoStmt goto4 = new JGotoStmt(noPosInfo); + JGotoStmt goto5 = new JGotoStmt(noPosInfo); + JGotoStmt goto6 = new JGotoStmt(noPosInfo); + + // block 0 + graph.setStartingStmt(assign01); + graph.putEdge(assign01, assign02); + graph.putEdge(assign02, assign03); + graph.putEdge(assign03, if1); + + // block 1 + graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); + graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, if3); + + // block 2 + graph.putEdge(if3, JIfStmt.FALSE_BRANCH_IDX, assign41); + graph.putEdge(if3, JIfStmt.TRUE_BRANCH_IDX, assign51); + + // block 3 + graph.putEdge(assign41, assign42); + graph.putEdge(assign42, goto4); + graph.putEdge(goto4, JGotoStmt.BRANCH_IDX, goto6); + + // block 4 + graph.putEdge(assign51, assign52); + graph.putEdge(assign52, goto5); + graph.putEdge(goto5, JGotoStmt.BRANCH_IDX, goto6); + + // block 5 + graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); + return graph; + } + + // a control flow graph without returnStmt, because simulate the situation in the paper + // if doesn't pass the validation, please add a return stmt after ifl2l50 + public MutableBlockStmtGraph createStmtGraph2() { + MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); + + Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); + Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); + Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); + + JAssignStmt assignl1e1 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); + JAssignStmt assignl2e1 = new JAssignStmt(l2, IntConstant.getInstance(1), noPosInfo); + JAssignStmt assignl3e0 = new JAssignStmt(l3, IntConstant.getInstance(0), noPosInfo); + + JAssignStmt assignl3e1 = new JAssignStmt(l3, IntConstant.getInstance(1), noPosInfo); + + JAssignStmt assignl1aa = + new JAssignStmt(l1, new JAddExpr(l1, IntConstant.getInstance(1)), noPosInfo); + JAssignStmt assignl2aa = + new JAssignStmt(l2, new JAddExpr(l2, IntConstant.getInstance(1)), noPosInfo); + JAssignStmt assignl3el2al1 = new JAssignStmt(l3, new JAddExpr(l1, l2), noPosInfo); + + BranchingStmt ifl1e1 = new JIfStmt(new JEqExpr(l1, IntConstant.getInstance(1)), noPosInfo); + BranchingStmt ifl3e1 = new JIfStmt(new JEqExpr(l3, IntConstant.getInstance(1)), noPosInfo); + BranchingStmt ifl1l50 = new JIfStmt(new JLtExpr(l1, IntConstant.getInstance(50)), noPosInfo); + BranchingStmt ifl2l50 = new JIfStmt(new JLtExpr(l2, IntConstant.getInstance(50)), noPosInfo); + + // JReturnStmt returnl3 = new JReturnStmt(l3, noPosInfo); + + // block 0 + graph.setStartingStmt(assignl1e1); + graph.putEdge(assignl1e1, assignl2e1); + graph.putEdge(assignl2e1, assignl3e0); + graph.putEdge(assignl3e0, ifl1e1); + graph.putEdge(ifl1e1, JIfStmt.TRUE_BRANCH_IDX, assignl3e1); + graph.putEdge(ifl1e1, JIfStmt.FALSE_BRANCH_IDX, ifl3e1); + + // block 1 + graph.putEdge(assignl3e1, assignl1aa); + + // block 2 + graph.putEdge(ifl3e1, JIfStmt.TRUE_BRANCH_IDX, assignl3el2al1); + graph.putEdge(ifl3e1, JIfStmt.FALSE_BRANCH_IDX, assignl2aa); + + // block 3 + graph.putEdge(assignl1aa, assignl3el2al1); + + // block 4 + graph.putEdge(assignl2aa, ifl2l50); + graph.putEdge(ifl2l50, JIfStmt.FALSE_BRANCH_IDX, assignl3el2al1); + // graph.putEdge(ifl2l50, JIfStmt.TRUE_BRANCH_IDX, returnl3); + + // block 5 + graph.putEdge(assignl3el2al1, ifl1l50); + graph.putEdge(ifl1l50, JIfStmt.FALSE_BRANCH_IDX, assignl1aa); + graph.putEdge(ifl1l50, JIfStmt.TRUE_BRANCH_IDX, assignl2aa); + + return graph; + } +} From fda4bffe76b27fa1fc435ce48d8cdaf4d54a230a Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 10 Oct 2024 12:18:51 +0200 Subject: [PATCH 05/24] repair DominanceFinder --- .../sootup/core/graph/DominanceFinder.java | 70 +++---------------- 1 file changed, 10 insertions(+), 60 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java index 653c87bac25..372b79f1da9 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java @@ -26,7 +26,6 @@ import javax.annotation.Nonnull; /** - * @author Zun Wang * @see * https://www.researchgate.net/publication/2569680_A_Simple_Fast_Dominance_Algorithm @@ -38,79 +37,33 @@ public class DominanceFinder { private int[] doms; private ArrayList[] domFrontiers; - protected AnalysisDirection direction; - - public enum AnalysisDirection { - BACKWARD { - @Override - @Nonnull - List> getPredecessors(BasicBlock block) { - return block.getSuccessors(); - } - - @Nonnull - @Override - List> getSortedBlocks(StmtGraph blockGraph) { - return Collections.unmodifiableList(new BackwardsStmtGraph(blockGraph).getBlocksSorted()); - } - }, - FORWARD { - @Override - @Nonnull - List> getPredecessors(BasicBlock block) { - return block.getPredecessors(); - } - - @Nonnull - @Override - List> getSortedBlocks(StmtGraph blockGraph) { - return Collections.unmodifiableList(blockGraph.getBlocksSorted()); - } - }; - - @Nonnull - abstract List> getPredecessors(BasicBlock block); - - @Nonnull - abstract List> getSortedBlocks(StmtGraph blockGraph); - } - public DominanceFinder(@Nonnull StmtGraph blockGraph) { - this(blockGraph, AnalysisDirection.FORWARD); - } - protected DominanceFinder(@Nonnull StmtGraph blockGraph, AnalysisDirection direction) { - this.direction = direction; - - // we're locked into providing a List>, not a List>, so - // we'll use the block iterator directly (which provides this type) rather than - // #getBlocksSorted. - blocks = direction.getSortedBlocks(blockGraph); - - // assign each block a integer id. The starting block must have id 0; rely on - // getBlocksSorted to have put the starting block first. + // blocks should be in reverse post order + blocks = ReversePostOrderBlockTraversal.getBlocksSorted(blockGraph); for (int i = 0; i < blocks.size(); i++) { BasicBlock block = blocks.get(i); blockToIdx.put(block, i); } - final BasicBlock startingStmtBlock = blocks.get(0); // initialize doms + final BasicBlock rootBlock = blockGraph.getStartingStmtBlock(); + int rootBlockId = blockToIdx.get(rootBlock); doms = new int[blocks.size()]; Arrays.fill(doms, -1); - doms[0] = 0; + doms[rootBlockId] = rootBlockId; // calculate immediate dominator for each block boolean isChanged = true; while (isChanged) { isChanged = false; for (BasicBlock block : blocks) { - if (block.equals(startingStmtBlock)) { + if (block.equals(rootBlock)) { continue; } int blockIdx = blockToIdx.get(block); - List> preds = new ArrayList<>(direction.getPredecessors(block)); // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); + List> preds = new ArrayList<>(block.getPredecessors()); int newIdom = getFirstDefinedBlockPredIdx(preds); if (!preds.isEmpty() && newIdom != -1) { BasicBlock processed = blocks.get(newIdom); @@ -131,24 +84,21 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, AnalysisDirection di } } - // startBlockId should not have immediate dominator, actually. - doms[0] = -1; - // initialize domFrontiers - domFrontiers = new ArrayList[blockGraph.getBlocks().size()]; + domFrontiers = new ArrayList[blocks.size()]; for (int i = 0; i < domFrontiers.length; i++) { domFrontiers[i] = new ArrayList<>(); } // calculate dominance frontiers for each block for (BasicBlock block : blocks) { - List> preds = new ArrayList<>(direction.getPredecessors(block)); + List> preds = new ArrayList<>(block.getPredecessors()); // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); if (preds.size() > 1) { int blockId = blockToIdx.get(block); for (BasicBlock pred : preds) { int predId = blockToIdx.get(pred); - while (predId != -1 && predId != doms[blockId]) { + while (predId != doms[blockId]) { domFrontiers[predId].add(blockId); predId = doms[predId]; } From efed95bcf7ca0f82039781a6286ee5e7370de6bd Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 10 Oct 2024 12:19:22 +0200 Subject: [PATCH 06/24] test DominanceFinder --- .../core/graph/DominanceFinderTest.java | 175 +++++++----------- 1 file changed, 64 insertions(+), 111 deletions(-) diff --git a/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java b/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java index 919da1e481f..7ac4257379d 100644 --- a/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java @@ -6,79 +6,52 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import sootup.core.jimple.basic.Local; -import sootup.core.jimple.basic.StmtPositionInfo; -import sootup.core.jimple.common.constant.IntConstant; -import sootup.core.jimple.common.expr.JAddExpr; -import sootup.core.jimple.common.expr.JLeExpr; import sootup.core.jimple.common.stmt.*; -import sootup.core.types.PrimitiveType; @Tag("Java8") public class DominanceFinderTest { - StmtPositionInfo noPosInfo = StmtPositionInfo.getNoStmtPositionInfo(); + TestGraphGenerator graphGenerator = new TestGraphGenerator(); @Test public void testDominanceFinder() { - MutableBlockStmtGraph graph = createStmtGraph(); - Map, Integer> blockToId = new HashMap<>(); - // assign ids according to blocks sorted by BasicBlock::toString - List> blocks = - graph.getBlocks().stream() - .sorted(Comparator.comparing(BasicBlock::toString)) - .collect(Collectors.toList()); - int i = 0; - for (BasicBlock block : blocks) { - blockToId.put(block, i); - i++; - } + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); + DominanceFinder dominanceFinder = new DominanceFinder(graph); - DominanceFinder dom = new DominanceFinder(graph); + int[] domsArr = dominanceFinder.getImmediateDominators(); + List doms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); - Map> expectedFrontiers = new HashMap<>(); - expectedFrontiers.put(0, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(1, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(2, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(3, new HashSet<>()); - expectedFrontiers.put(4, new HashSet<>(Collections.singletonList(0))); - expectedFrontiers.put(5, new HashSet<>(Collections.singletonList(0))); - expectedFrontiers.put(6, new HashSet<>()); - - Map expectedDominators = new HashMap<>(); - expectedDominators.put(0, 1); - expectedDominators.put(1, 2); - expectedDominators.put(2, 3); - expectedDominators.put(3, -1); - expectedDominators.put(4, 1); - expectedDominators.put(5, 1); - expectedDominators.put(6, 2); - - // check dominators - for (BasicBlock block : blocks) { - Integer dominatorId = -1; - BasicBlock dominator = dom.getImmediateDominator(block); - if (dominator != null) { - dominatorId = blockToId.get(dominator); - } - Integer expectedId = expectedDominators.get(blockToId.get(block)); - - assertEquals(expectedId, dominatorId); - } + List expectedDoms = Arrays.asList(0, 0, 1, 2, 2, 2, 1); + assertEquals(expectedDoms, doms); + } - // check frontiers - for (BasicBlock block : blocks) { - Set> frontier = dom.getDominanceFrontiers(block); - Set frontierIds = frontier.stream().map(blockToId::get).collect(Collectors.toSet()); - Set expectedIds = expectedFrontiers.get(blockToId.get(block)); + @Test + public void testDominanceFrontiers() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); + DominanceFinder dominanceFinder = new DominanceFinder(graph); + + List> blocks = dominanceFinder.getIdxToBlock(); + List>> dfList = + blocks.stream() + .map(block -> dominanceFinder.getDominanceFrontiers(block)) + .collect(Collectors.toList()); - assertEquals(expectedIds, frontierIds); - } + // create expectedDFList + List>> expectedDFList = new ArrayList<>(); + expectedDFList.add(Collections.emptySet()); + expectedDFList.add(Collections.singleton(blocks.get(1))); + expectedDFList.add(Collections.singleton(blocks.get(1))); + expectedDFList.add(Collections.singleton(blocks.get(5))); + expectedDFList.add(Collections.singleton(blocks.get(5))); + expectedDFList.add(Collections.singleton(blocks.get(1))); + expectedDFList.add(Collections.emptySet()); + + assertEquals(expectedDFList, dfList); } @Test public void testBlockToIdxInverse() { - MutableBlockStmtGraph graph = createStmtGraph(); + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); DominanceFinder dom = new DominanceFinder(graph); // check that getBlockToIdx and getIdxToBlock are inverses @@ -89,59 +62,39 @@ public void testBlockToIdxInverse() { } } - private MutableBlockStmtGraph createStmtGraph() { - // reconstruct the example given in - // https://soot-oss.github.io/SootUp/v1.1.2/advanced-topics/#dominancefinder. - MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); - - Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); - Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); - Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); - - JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); - JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); - JAssignStmt assign03 = new JAssignStmt(l2, IntConstant.getInstance(0), noPosInfo); - JAssignStmt assign41 = new JAssignStmt(l2, l3, noPosInfo); - JAssignStmt assign42 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(2)), noPosInfo); - JAssignStmt assign51 = new JAssignStmt(l2, l1, noPosInfo); - JAssignStmt assign52 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(1)), noPosInfo); - - BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); - BranchingStmt if3 = new JIfStmt(new JLeExpr(l2, IntConstant.getInstance(20)), noPosInfo); - - JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); - JGotoStmt goto4 = new JGotoStmt(noPosInfo); - JGotoStmt goto5 = new JGotoStmt(noPosInfo); - JGotoStmt goto6 = new JGotoStmt(noPosInfo); - - // block 0 - graph.setStartingStmt(assign01); - graph.putEdge(assign01, assign02); - graph.putEdge(assign02, assign03); - graph.putEdge(assign03, if1); - - // block 1 - graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); - graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, if3); - - // block 3 - graph.putEdge(if3, JIfStmt.FALSE_BRANCH_IDX, assign41); - graph.putEdge(if3, JIfStmt.TRUE_BRANCH_IDX, assign51); - - // block 4 - graph.putEdge(assign41, assign42); - graph.putEdge(assign42, goto4); - graph.putEdge(goto4, JGotoStmt.BRANCH_IDX, goto6); - - // block 5 - graph.putEdge(assign51, assign52); - graph.putEdge(assign52, goto5); - graph.putEdge(goto5, JGotoStmt.BRANCH_IDX, goto6); - - // block 6 - graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); - return graph; + @Test + public void testDominanceFinder2() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph2(); + DominanceFinder dominanceFinder = new DominanceFinder(graph); + + int[] domsArr = dominanceFinder.getImmediateDominators(); + List doms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); + + List expectedDoms = Arrays.asList(0, 0, 0, 0, 0, 0); + + assertEquals(expectedDoms, doms); + } + + @Test + public void testDominanceFrontiers2() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph2(); + DominanceFinder dominanceFinder = new DominanceFinder(graph); + + List> blocks = dominanceFinder.getIdxToBlock(); + List>> dfList = + blocks.stream() + .map(block -> dominanceFinder.getDominanceFrontiers(block)) + .collect(Collectors.toList()); + + // create expectedDFList + List>> expectedDFList = new ArrayList<>(); + expectedDFList.add(Collections.emptySet()); + expectedDFList.add(Collections.singleton(blocks.get(5))); + expectedDFList.add(new HashSet<>(Arrays.asList(blocks.get(3), blocks.get(4)))); + expectedDFList.add(Collections.singleton(blocks.get(4))); + expectedDFList.add(new HashSet<>(Arrays.asList(blocks.get(3), blocks.get(5)))); + expectedDFList.add(Collections.singleton(blocks.get(4))); + + assertEquals(expectedDFList, dfList); } } From 0a6c36c575b692239641536a916142749ab0c533 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 10 Oct 2024 12:35:59 +0200 Subject: [PATCH 07/24] remove redundant statements --- .../test/java/sootup/core/graph/PostOrderTraversalTest.java | 6 ++---- .../sootup/core/graph/ReversePostOrderTraversalTest.java | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java b/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java index db25c1a6d13..7289074b453 100644 --- a/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/PostOrderTraversalTest.java @@ -30,8 +30,7 @@ void testPostOrderTraversal1() { List PO = postOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - Integer[] arr = new Integer[] {6, 0, 5, 4, 1, 2, 3}; - List expectedPO = Arrays.asList(arr); + List expectedPO = Arrays.asList(6, 0, 5, 4, 1, 2, 3); assertEquals(expectedPO, PO); } @@ -55,8 +54,7 @@ void testPostOrderTraversal2() { List PO = postOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - Integer[] arr = new Integer[] {2, 5, 3, 0, 4, 1}; - List expectedPO = Arrays.asList(arr); + List expectedPO = Arrays.asList(2, 5, 3, 0, 4, 1); assertEquals(expectedPO, PO); } } diff --git a/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java b/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java index b8a59a934d0..c74f5816ad6 100644 --- a/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/ReversePostOrderTraversalTest.java @@ -32,8 +32,7 @@ void testReversePostOrderTraversal1() { List RPO = reversePostOrderBlocks.stream().map(b -> blockToId.get(b)).collect(Collectors.toList()); - Integer[] arr = new Integer[] {3, 2, 1, 4, 5, 0, 6}; - List expectedRPO = Arrays.asList(arr); + List expectedRPO = Arrays.asList(3, 2, 1, 4, 5, 0, 6); assertEquals(expectedRPO, RPO); } @@ -58,8 +57,7 @@ void testReversePostOrderTraversal2() { List RPO = reversePostOrderBlocks.stream().map(b -> blocksToId.get(b)).collect(Collectors.toList()); - Integer[] arr = new Integer[] {1, 4, 0, 3, 5, 2}; - List expectedRPO = Arrays.asList(arr); + List expectedRPO = Arrays.asList(1, 4, 0, 3, 5, 2); assertEquals(expectedRPO, RPO); } From 9ef3cdf8c3cd75b1940f7de49e537d03d6a0b155 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 10 Oct 2024 15:54:34 +0200 Subject: [PATCH 08/24] recover analysis direction things --- .../core/graph/BlockAnalysisDirection.java | 89 +++++++++++++++++++ .../sootup/core/graph/DominanceFinder.java | 17 ++-- .../core/graph/PostDominanceFinder.java | 2 +- 3 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java diff --git a/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java new file mode 100644 index 00000000000..d5d0a44ae23 --- /dev/null +++ b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java @@ -0,0 +1,89 @@ +package sootup.core.graph; +/*- + * #%L + * Soot - a J*va Optimization Framework + * %% + * Copyright (C) 2024 Junjie Shen + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 2.1 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * . + * #L% + */ + +import java.util.Collections; +import java.util.List; +import javax.annotation.Nonnull; + +public enum BlockAnalysisDirection { + BACKWARD { + @Override + @Nonnull + List> getPredecessors(BasicBlock block) { + return block.getSuccessors(); + } + + @Nonnull + @Override + List> getSortedBlocks(StmtGraph blockGraph) { + return Collections.unmodifiableList(new BackwardsStmtGraph(blockGraph).getBlocksSorted()); + } + }, + FORWARD { + @Override + @Nonnull + List> getPredecessors(BasicBlock block) { + return block.getPredecessors(); + } + + @Nonnull + @Override + List> getSortedBlocks(StmtGraph blockGraph) { + // for MutableStmtGraph is in reversePostOrder, but for other stmtGraphs not. + return Collections.unmodifiableList(blockGraph.getBlocksSorted()); + } + }, + POSTORDER { + @Override + @Nonnull + List> getPredecessors(BasicBlock block) { + return block.getPredecessors(); + } + + @Nonnull + @Override + List> getSortedBlocks(StmtGraph blockGraph) { + return Collections.unmodifiableList(PostOrderBlockTraversal.getBlocksSorted(blockGraph)); + } + }, + REVERSEPOSTORDER { + @Override + @Nonnull + List> getPredecessors(BasicBlock block) { + return block.getPredecessors(); + } + + @Nonnull + @Override + List> getSortedBlocks(StmtGraph blockGraph) { + return Collections.unmodifiableList( + ReversePostOrderBlockTraversal.getBlocksSorted(blockGraph)); + } + }; + + @Nonnull + abstract List> getPredecessors(BasicBlock block); + + @Nonnull + abstract List> getSortedBlocks(StmtGraph blockGraph); +} diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java index 372b79f1da9..8845094220f 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java @@ -36,11 +36,18 @@ public class DominanceFinder { private Map, Integer> blockToIdx = new HashMap<>(); private int[] doms; private ArrayList[] domFrontiers; + private BlockAnalysisDirection direction; - public DominanceFinder(@Nonnull StmtGraph blockGraph) { + public DominanceFinder(StmtGraph blockGraph) { + // normal DominanceFinder should be in reverse post order + this(blockGraph, BlockAnalysisDirection.REVERSEPOSTORDER); + } + + protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirection direction) { - // blocks should be in reverse post order - blocks = ReversePostOrderBlockTraversal.getBlocksSorted(blockGraph); + // define the blocks' order + this.direction = direction; + blocks = direction.getSortedBlocks(blockGraph); for (int i = 0; i < blocks.size(); i++) { BasicBlock block = blocks.get(i); blockToIdx.put(block, i); @@ -63,7 +70,7 @@ public DominanceFinder(@Nonnull StmtGraph blockGraph) { } int blockIdx = blockToIdx.get(block); // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); - List> preds = new ArrayList<>(block.getPredecessors()); + List> preds = new ArrayList<>(direction.getPredecessors(block)); int newIdom = getFirstDefinedBlockPredIdx(preds); if (!preds.isEmpty() && newIdom != -1) { BasicBlock processed = blocks.get(newIdom); @@ -92,7 +99,7 @@ public DominanceFinder(@Nonnull StmtGraph blockGraph) { // calculate dominance frontiers for each block for (BasicBlock block : blocks) { - List> preds = new ArrayList<>(block.getPredecessors()); + List> preds = new ArrayList<>(direction.getPredecessors(block)); // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); if (preds.size() > 1) { int blockId = blockToIdx.get(block); diff --git a/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java index 60751ed7ae3..37462b82c1f 100644 --- a/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java @@ -25,6 +25,6 @@ public class PostDominanceFinder extends DominanceFinder { public PostDominanceFinder(StmtGraph blockGraph) { - super(blockGraph, AnalysisDirection.BACKWARD); + super(blockGraph, BlockAnalysisDirection.BACKWARD); } } From 6024cd0d639fc09302d0be04eff7b0a524ceffbc Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 16 Oct 2024 08:43:19 +0200 Subject: [PATCH 09/24] remove comment --- .../src/main/java/sootup/core/graph/BlockAnalysisDirection.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java index d5d0a44ae23..72aaa96baec 100644 --- a/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java +++ b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java @@ -49,7 +49,6 @@ List> getPredecessors(BasicBlock block) { @Nonnull @Override List> getSortedBlocks(StmtGraph blockGraph) { - // for MutableStmtGraph is in reversePostOrder, but for other stmtGraphs not. return Collections.unmodifiableList(blockGraph.getBlocksSorted()); } }, From d492acc72dea6a622b1eb7f889f2b998aa63e1b8 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 09:13:34 +0200 Subject: [PATCH 10/24] add test graph for PD --- .../sootup/core/graph/TestGraphGenerator.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java index c46a3f224da..fef91773c75 100644 --- a/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java +++ b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java @@ -126,4 +126,33 @@ public MutableBlockStmtGraph createStmtGraph2() { return graph; } + + //a graph with two end blocks + public MutableBlockStmtGraph createStmtGraph3() { + MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); + + Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); + Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); + Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); + + JAssignStmt assignl1e1 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); + JAssignStmt assignl2e1 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); + JAssignStmt assignl3e0 = new JAssignStmt(l3, IntConstant.getInstance(0), noPosInfo); + + JAssignStmt assignl3e1 = new JAssignStmt(l3, IntConstant.getInstance(1), noPosInfo); + + BranchingStmt ifl2e100 = new JIfStmt(new JLtExpr(l3, IntConstant.getInstance(100)), noPosInfo); + + JReturnStmt returnl1 = new JReturnStmt(l1, noPosInfo); + JReturnStmt returnl2 = new JReturnStmt(l2, noPosInfo); + + graph.setStartingStmt(assignl1e1); + graph.putEdge(assignl1e1, assignl2e1); + graph.putEdge(assignl2e1, assignl3e0); + graph.putEdge(assignl3e0, ifl2e100); + graph.putEdge(ifl2e100, JIfStmt.TRUE_BRANCH_IDX, returnl1); + graph.putEdge(ifl2e100, JIfStmt.FALSE_BRANCH_IDX, returnl2); + + return graph; + } } From f1f3e630c71dbc45898465e4fc538a4d0d79e6eb Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 09:14:59 +0200 Subject: [PATCH 11/24] add test case to check PD add test case for PD --- .../core/graph/PostDominanceFinderTest.java | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java b/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java index 3c0dd45b80f..4b7364a6bdd 100644 --- a/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java @@ -76,6 +76,71 @@ public void testDominanceFinder() { } } + @Test + public void testDominanceFinder2() { + MutableBlockStmtGraph graph = createStmtGraph2(); + Map, Integer> blockToId = new HashMap<>(); + + + // assign ids according to blocks sorted by BasicBlock::toString + /*List> blocks = + graph.getBlocks().stream() + .sorted(Comparator.comparing(BasicBlock::toString)) + .collect(Collectors.toList());*/ + List> blocks = PostOrderBlockTraversal.getBlocksSorted(graph); + int i = 0; + for (BasicBlock block : blocks) { + blockToId.put(block, i); + i++; + } + + PostDominanceFinder postDom = new PostDominanceFinder(graph); + for (BasicBlock block : blocks) { + BasicBlock dominator = postDom.getImmediateDominator(block); + System.out.println(block + " -- " + dominator); + } + + + /*Map> expectedFrontiers = new HashMap<>(); + expectedFrontiers.put(0, new HashSet<>(Collections.singletonList(2))); + expectedFrontiers.put(1, new HashSet<>(Collections.singletonList(2))); + expectedFrontiers.put(2, new HashSet<>(Collections.singletonList(2))); + expectedFrontiers.put(3, new HashSet<>()); + expectedFrontiers.put(4, new HashSet<>(Collections.singletonList(1))); + expectedFrontiers.put(5, new HashSet<>(Collections.singletonList(1))); + expectedFrontiers.put(6, new HashSet<>()); + + Map expectedDominators = new HashMap<>(); + expectedDominators.put(0, 2); + expectedDominators.put(1, 0); + expectedDominators.put(2, 6); + expectedDominators.put(3, 2); + expectedDominators.put(4, 0); + expectedDominators.put(5, 0); + expectedDominators.put(6, -1); + + // check dominators + for (BasicBlock block : blocks) { + BasicBlock dominator = postDom.getImmediateDominator(block); + Integer dominatorId = -1; + if (dominator != null) { + dominatorId = blockToId.get(dominator); + } + Integer expectedId = expectedDominators.get(blockToId.get(block)); + + assertEquals(expectedId, dominatorId); + } + + // check frontiers + for (BasicBlock block : blocks) { + Set> frontier = postDom.getDominanceFrontiers(block); + Set frontierIds = frontier.stream().map(blockToId::get).collect(Collectors.toSet()); + Set expectedIds = expectedFrontiers.get(blockToId.get(block)); + + assertEquals(expectedIds, frontierIds); + }*/ + } + @Test public void testBlockToIdxInverse() { MutableBlockStmtGraph graph = createStmtGraph(); @@ -142,4 +207,33 @@ private MutableBlockStmtGraph createStmtGraph() { graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); return graph; } + + private MutableBlockStmtGraph createStmtGraph2() { + MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); + + Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); + Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); + Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); + + JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); + JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); + JAssignStmt assign03 = new JAssignStmt(l3, IntConstant.getInstance(0), noPosInfo); + + BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); + + JReturnStmt return1 = new JReturnStmt(l1, noPosInfo); + JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); + + // block 0 + graph.setStartingStmt(assign01); + graph.putEdge(assign01, assign02); + graph.putEdge(assign02, assign03); + graph.putEdge(assign03, if1); + + // block 1 and 2 + graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, return1); + graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); + + return graph; + } } From 61a98219646b34edc09594efeb6da49f4b16fb40 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 16:00:00 +0200 Subject: [PATCH 12/24] add function getTailBlocks in StmtGraph --- .../main/java/sootup/core/graph/ForwardingStmtGraph.java | 5 +++++ .../java/sootup/core/graph/ImmutableBlockStmtGraph.java | 5 +++++ .../main/java/sootup/core/graph/MutableBlockStmtGraph.java | 6 ++++++ sootup.core/src/main/java/sootup/core/graph/StmtGraph.java | 2 ++ 4 files changed, 18 insertions(+) diff --git a/sootup.core/src/main/java/sootup/core/graph/ForwardingStmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/ForwardingStmtGraph.java index 5019922f46a..31fc94837fa 100644 --- a/sootup.core/src/main/java/sootup/core/graph/ForwardingStmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/ForwardingStmtGraph.java @@ -49,6 +49,11 @@ public BasicBlock getStartingStmtBlock() { return backingGraph.getStartingStmtBlock(); } + @Override + public List> getTailStmtBlocks() { + return backingGraph.getTailStmtBlocks(); + } + @Override public BasicBlock getBlockOf(@Nonnull Stmt stmt) { return backingGraph.getBlockOf(stmt); diff --git a/sootup.core/src/main/java/sootup/core/graph/ImmutableBlockStmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/ImmutableBlockStmtGraph.java index 5084e5fe31b..cb80e6f6e4c 100644 --- a/sootup.core/src/main/java/sootup/core/graph/ImmutableBlockStmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/ImmutableBlockStmtGraph.java @@ -61,6 +61,11 @@ public BasicBlock getStartingStmtBlock() { throw new UnsupportedOperationException("Not implemented yet!"); } + @Override + public List> getTailStmtBlocks() { + throw new UnsupportedOperationException("Not implemented yet!"); + } + @Override public BasicBlock getBlockOf(@Nonnull Stmt stmt) { throw new UnsupportedOperationException("Not implemented yet!"); diff --git a/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java index 119c7d75fb6..97b5be60758 100644 --- a/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java @@ -25,6 +25,7 @@ import com.google.common.collect.ComparisonChain; import com.google.common.collect.Lists; import java.util.*; +import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; import org.apache.commons.lang3.tuple.MutablePair; @@ -1381,6 +1382,11 @@ public BasicBlock getStartingStmtBlock() { return getBlockOf(startingStmt); } + @Override + public List> getTailStmtBlocks() { + return getTails().stream().map(stmt -> getBlockOf(stmt)).collect(Collectors.toList()); + } + @Override @Nullable public BasicBlock getBlockOf(@Nonnull Stmt stmt) { diff --git a/sootup.core/src/main/java/sootup/core/graph/StmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/StmtGraph.java index 3a484d7f90b..77852d05829 100644 --- a/sootup.core/src/main/java/sootup/core/graph/StmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/StmtGraph.java @@ -66,6 +66,8 @@ public abstract class StmtGraph> implements Iterable getStartingStmtBlock(); + public abstract List> getTailStmtBlocks(); + /** * returns the nodes in this graph in a non-deterministic order (->Set) to get the nodes in * linearized, ordered manner use iterator() or getStmts. From a0d28e57b0198d996403b7ddfd1f85753f404b57 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 16:00:45 +0200 Subject: [PATCH 13/24] rename direction --- .../core/graph/BlockAnalysisDirection.java | 30 ++----------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java index 72aaa96baec..dfbf54411f7 100644 --- a/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java +++ b/sootup.core/src/main/java/sootup/core/graph/BlockAnalysisDirection.java @@ -26,46 +26,20 @@ import javax.annotation.Nonnull; public enum BlockAnalysisDirection { - BACKWARD { + POSTORDERBACKWARD { @Override @Nonnull List> getPredecessors(BasicBlock block) { return block.getSuccessors(); } - @Nonnull - @Override - List> getSortedBlocks(StmtGraph blockGraph) { - return Collections.unmodifiableList(new BackwardsStmtGraph(blockGraph).getBlocksSorted()); - } - }, - FORWARD { - @Override - @Nonnull - List> getPredecessors(BasicBlock block) { - return block.getPredecessors(); - } - - @Nonnull - @Override - List> getSortedBlocks(StmtGraph blockGraph) { - return Collections.unmodifiableList(blockGraph.getBlocksSorted()); - } - }, - POSTORDER { - @Override - @Nonnull - List> getPredecessors(BasicBlock block) { - return block.getPredecessors(); - } - @Nonnull @Override List> getSortedBlocks(StmtGraph blockGraph) { return Collections.unmodifiableList(PostOrderBlockTraversal.getBlocksSorted(blockGraph)); } }, - REVERSEPOSTORDER { + REVERSEPOSTORDERFORWARD { @Override @Nonnull List> getPredecessors(BasicBlock block) { From 45698f3b62d520de0401486c829859efb7cbc039 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 16:01:53 +0200 Subject: [PATCH 14/24] repair DominanceFinder --- .../sootup/core/graph/DominanceFinder.java | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java index 8845094220f..3a5afe1fd7c 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java @@ -23,6 +23,7 @@ */ import java.util.*; +import java.util.stream.Collectors; import javax.annotation.Nonnull; /** @@ -40,7 +41,7 @@ public class DominanceFinder { public DominanceFinder(StmtGraph blockGraph) { // normal DominanceFinder should be in reverse post order - this(blockGraph, BlockAnalysisDirection.REVERSEPOSTORDER); + this(blockGraph, BlockAnalysisDirection.REVERSEPOSTORDERFORWARD); } protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirection direction) { @@ -54,18 +55,32 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirecti } // initialize doms - final BasicBlock rootBlock = blockGraph.getStartingStmtBlock(); - int rootBlockId = blockToIdx.get(rootBlock); + final BasicBlock startBlock; + if (direction == BlockAnalysisDirection.REVERSEPOSTORDERFORWARD) { + startBlock = blockGraph.getStartingStmtBlock(); + } else if (direction == BlockAnalysisDirection.POSTORDERBACKWARD) { + // todo: improve algorithm for graph with multiple tail-blocks + List> tails = blockGraph.getTailStmtBlocks(); + if (tails.size() > 1) { + throw new RuntimeException( + "BlockAnalysisDirection 'BACKWARD' supports block-graphs containing only one tail-block!"); + } + startBlock = tails.get(0); + } else { + throw new RuntimeException("Invalid BlockAnalysisDirection!"); + } + + int startBlockId = blockToIdx.get(startBlock); doms = new int[blocks.size()]; Arrays.fill(doms, -1); - doms[rootBlockId] = rootBlockId; + doms[startBlockId] = startBlockId; // calculate immediate dominator for each block boolean isChanged = true; while (isChanged) { isChanged = false; for (BasicBlock block : blocks) { - if (block.equals(rootBlock)) { + if (block.equals(startBlock)) { continue; } int blockIdx = blockToIdx.get(block); @@ -97,21 +112,29 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirecti domFrontiers[i] = new ArrayList<>(); } + doms[startBlockId] = -1; // calculate dominance frontiers for each block for (BasicBlock block : blocks) { List> preds = new ArrayList<>(direction.getPredecessors(block)); - // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); if (preds.size() > 1) { int blockId = blockToIdx.get(block); for (BasicBlock pred : preds) { int predId = blockToIdx.get(pred); - while (predId != doms[blockId]) { + while (predId != -1 && predId != doms[blockId]) { domFrontiers[predId].add(blockId); predId = doms[predId]; } } } } + + if (direction == BlockAnalysisDirection.POSTORDERBACKWARD) { + for (int i = 0; i < domFrontiers.length; i++) { + if (domFrontiers[i].contains(i)) { + domFrontiers[i].remove(new Integer(i)); + } + } + } } public void replaceBlock(@Nonnull BasicBlock newBlock, BasicBlock oldBlock) { From 572bf45736b5889318c70b54a5bfde914af8f507 Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 16:03:26 +0200 Subject: [PATCH 15/24] repair tests for DominanceFinder --- .../core/graph/PostDominanceFinder.java | 2 +- .../core/graph/DominanceFinderTest.java | 4 +- .../core/graph/PostDominanceFinderTest.java | 236 +++--------------- .../sootup/core/graph/TestGraphGenerator.java | 2 +- 4 files changed, 40 insertions(+), 204 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java index 37462b82c1f..6ba2895af63 100644 --- a/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/PostDominanceFinder.java @@ -25,6 +25,6 @@ public class PostDominanceFinder extends DominanceFinder { public PostDominanceFinder(StmtGraph blockGraph) { - super(blockGraph, BlockAnalysisDirection.BACKWARD); + super(blockGraph, BlockAnalysisDirection.POSTORDERBACKWARD); } } diff --git a/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java b/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java index 7ac4257379d..2372262b4f2 100644 --- a/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/DominanceFinderTest.java @@ -21,7 +21,7 @@ public void testDominanceFinder() { int[] domsArr = dominanceFinder.getImmediateDominators(); List doms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); - List expectedDoms = Arrays.asList(0, 0, 1, 2, 2, 2, 1); + List expectedDoms = Arrays.asList(-1, 0, 1, 2, 2, 2, 1); assertEquals(expectedDoms, doms); } @@ -70,7 +70,7 @@ public void testDominanceFinder2() { int[] domsArr = dominanceFinder.getImmediateDominators(); List doms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); - List expectedDoms = Arrays.asList(0, 0, 0, 0, 0, 0); + List expectedDoms = Arrays.asList(-1, 0, 0, 0, 0, 0); assertEquals(expectedDoms, doms); } diff --git a/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java b/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java index 4b7364a6bdd..fb46e584e4b 100644 --- a/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java +++ b/sootup.core/src/test/java/sootup/core/graph/PostDominanceFinderTest.java @@ -6,144 +6,63 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import sootup.core.jimple.basic.Local; -import sootup.core.jimple.basic.StmtPositionInfo; -import sootup.core.jimple.common.constant.IntConstant; -import sootup.core.jimple.common.expr.JAddExpr; -import sootup.core.jimple.common.expr.JLeExpr; import sootup.core.jimple.common.stmt.*; -import sootup.core.types.PrimitiveType; @Tag("Java8") public class PostDominanceFinderTest { - StmtPositionInfo noPosInfo = StmtPositionInfo.getNoStmtPositionInfo(); + TestGraphGenerator graphGenerator = new TestGraphGenerator(); @Test - public void testDominanceFinder() { - MutableBlockStmtGraph graph = createStmtGraph(); - Map, Integer> blockToId = new HashMap<>(); - // assign ids according to blocks sorted by BasicBlock::toString - List> blocks = - graph.getBlocks().stream() - .sorted(Comparator.comparing(BasicBlock::toString)) - .collect(Collectors.toList()); - int i = 0; - for (BasicBlock block : blocks) { - blockToId.put(block, i); - i++; - } - - PostDominanceFinder postDom = new PostDominanceFinder(graph); - - Map> expectedFrontiers = new HashMap<>(); - expectedFrontiers.put(0, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(1, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(2, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(3, new HashSet<>()); - expectedFrontiers.put(4, new HashSet<>(Collections.singletonList(1))); - expectedFrontiers.put(5, new HashSet<>(Collections.singletonList(1))); - expectedFrontiers.put(6, new HashSet<>()); - - Map expectedDominators = new HashMap<>(); - expectedDominators.put(0, 2); - expectedDominators.put(1, 0); - expectedDominators.put(2, 6); - expectedDominators.put(3, 2); - expectedDominators.put(4, 0); - expectedDominators.put(5, 0); - expectedDominators.put(6, -1); - - // check dominators - for (BasicBlock block : blocks) { - BasicBlock dominator = postDom.getImmediateDominator(block); - Integer dominatorId = -1; - if (dominator != null) { - dominatorId = blockToId.get(dominator); - } - Integer expectedId = expectedDominators.get(blockToId.get(block)); - - assertEquals(expectedId, dominatorId); - } + public void testPostDominanceFinder() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); + PostDominanceFinder postDominanceFinder = new PostDominanceFinder(graph); - // check frontiers - for (BasicBlock block : blocks) { - Set> frontier = postDom.getDominanceFrontiers(block); - Set frontierIds = frontier.stream().map(blockToId::get).collect(Collectors.toSet()); - Set expectedIds = expectedFrontiers.get(blockToId.get(block)); + int[] domsArr = postDominanceFinder.getImmediateDominators(); + List pDoms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); - assertEquals(expectedIds, frontierIds); - } + List expectedPDoms = Arrays.asList(-1, 5, 1, 1, 1, 0, 5); + assertEquals(expectedPDoms, pDoms); } @Test - public void testDominanceFinder2() { - MutableBlockStmtGraph graph = createStmtGraph2(); - Map, Integer> blockToId = new HashMap<>(); - - - // assign ids according to blocks sorted by BasicBlock::toString - /*List> blocks = - graph.getBlocks().stream() - .sorted(Comparator.comparing(BasicBlock::toString)) - .collect(Collectors.toList());*/ - List> blocks = PostOrderBlockTraversal.getBlocksSorted(graph); - int i = 0; - for (BasicBlock block : blocks) { - blockToId.put(block, i); - i++; - } + public void testPostDominanceFrontiers() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); + PostDominanceFinder postDominanceFinder = new PostDominanceFinder(graph); + + List> blocks = postDominanceFinder.getIdxToBlock(); + List>> pdfList = + blocks.stream() + .map(block -> postDominanceFinder.getDominanceFrontiers(block)) + .collect(Collectors.toList()); - PostDominanceFinder postDom = new PostDominanceFinder(graph); - for (BasicBlock block : blocks) { - BasicBlock dominator = postDom.getImmediateDominator(block); - System.out.println(block + " -- " + dominator); - } + List>> expectedPDFList = new ArrayList<>(); + expectedPDFList.add(Collections.emptySet()); + expectedPDFList.add(Collections.singleton(blocks.get(5))); + expectedPDFList.add(Collections.singleton(blocks.get(4))); + expectedPDFList.add(Collections.singleton(blocks.get(4))); + expectedPDFList.add(Collections.singleton(blocks.get(5))); + expectedPDFList.add(Collections.emptySet()); + expectedPDFList.add(Collections.emptySet()); + assertEquals(expectedPDFList, pdfList); + } - /*Map> expectedFrontiers = new HashMap<>(); - expectedFrontiers.put(0, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(1, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(2, new HashSet<>(Collections.singletonList(2))); - expectedFrontiers.put(3, new HashSet<>()); - expectedFrontiers.put(4, new HashSet<>(Collections.singletonList(1))); - expectedFrontiers.put(5, new HashSet<>(Collections.singletonList(1))); - expectedFrontiers.put(6, new HashSet<>()); - - Map expectedDominators = new HashMap<>(); - expectedDominators.put(0, 2); - expectedDominators.put(1, 0); - expectedDominators.put(2, 6); - expectedDominators.put(3, 2); - expectedDominators.put(4, 0); - expectedDominators.put(5, 0); - expectedDominators.put(6, -1); - - // check dominators - for (BasicBlock block : blocks) { - BasicBlock dominator = postDom.getImmediateDominator(block); - Integer dominatorId = -1; - if (dominator != null) { - dominatorId = blockToId.get(dominator); - } - Integer expectedId = expectedDominators.get(blockToId.get(block)); - - assertEquals(expectedId, dominatorId); - } + @Test + public void testDominanceFinder2() { + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph3(); + /*PostDominanceFinder postDom = new PostDominanceFinder(graph); - // check frontiers - for (BasicBlock block : blocks) { - Set> frontier = postDom.getDominanceFrontiers(block); - Set frontierIds = frontier.stream().map(blockToId::get).collect(Collectors.toSet()); - Set expectedIds = expectedFrontiers.get(blockToId.get(block)); + int[] domsArr = postDom.getImmediateDominators(); + List pDoms = Arrays.stream(domsArr).boxed().collect(Collectors.toList()); - assertEquals(expectedIds, frontierIds); - }*/ + List expectedPDoms = Arrays.asList(2,2,2); + assertEquals(expectedPDoms, pDoms);*/ } @Test public void testBlockToIdxInverse() { - MutableBlockStmtGraph graph = createStmtGraph(); + MutableBlockStmtGraph graph = graphGenerator.createStmtGraph(); DominanceFinder dom = new PostDominanceFinder(graph); // check that getBlockToIdx and getIdxToBlock are inverses @@ -153,87 +72,4 @@ public void testBlockToIdxInverse() { assertEquals(block, idxToBlock.get(blockToIdx.get(block))); } } - - private MutableBlockStmtGraph createStmtGraph() { - MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); - - Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); - Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); - Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); - - JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); - JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); - JAssignStmt assign03 = new JAssignStmt(l2, IntConstant.getInstance(0), noPosInfo); - JAssignStmt assign41 = new JAssignStmt(l2, l3, noPosInfo); - JAssignStmt assign42 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(2)), noPosInfo); - JAssignStmt assign51 = new JAssignStmt(l2, l1, noPosInfo); - JAssignStmt assign52 = - new JAssignStmt(l3, new JAddExpr(l3, IntConstant.getInstance(1)), noPosInfo); - - BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); - BranchingStmt if3 = new JIfStmt(new JLeExpr(l2, IntConstant.getInstance(20)), noPosInfo); - - JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); - JGotoStmt goto4 = new JGotoStmt(noPosInfo); - JGotoStmt goto5 = new JGotoStmt(noPosInfo); - JGotoStmt goto6 = new JGotoStmt(noPosInfo); - - // block 0 - graph.setStartingStmt(assign01); - graph.putEdge(assign01, assign02); - graph.putEdge(assign02, assign03); - graph.putEdge(assign03, if1); - - // block 1 - graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); - graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, if3); - - // block 3 - graph.putEdge(if3, JIfStmt.FALSE_BRANCH_IDX, assign41); - graph.putEdge(if3, JIfStmt.TRUE_BRANCH_IDX, assign51); - - // block 4 - graph.putEdge(assign41, assign42); - graph.putEdge(assign42, goto4); - graph.putEdge(goto4, JGotoStmt.BRANCH_IDX, goto6); - - // block 5 - graph.putEdge(assign51, assign52); - graph.putEdge(assign52, goto5); - graph.putEdge(goto5, JGotoStmt.BRANCH_IDX, goto6); - - // block 6 - graph.putEdge(goto6, JGotoStmt.BRANCH_IDX, if1); - return graph; - } - - private MutableBlockStmtGraph createStmtGraph2() { - MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); - - Local l1 = new Local("l1", PrimitiveType.IntType.getInstance()); - Local l2 = new Local("l2", PrimitiveType.IntType.getInstance()); - Local l3 = new Local("l3", PrimitiveType.IntType.getInstance()); - - JAssignStmt assign01 = new JAssignStmt(l1, IntConstant.getInstance(1), noPosInfo); - JAssignStmt assign02 = new JAssignStmt(l2, IntConstant.getInstance(2), noPosInfo); - JAssignStmt assign03 = new JAssignStmt(l3, IntConstant.getInstance(0), noPosInfo); - - BranchingStmt if1 = new JIfStmt(new JLeExpr(l3, IntConstant.getInstance(100)), noPosInfo); - - JReturnStmt return1 = new JReturnStmt(l1, noPosInfo); - JReturnStmt return2 = new JReturnStmt(l2, noPosInfo); - - // block 0 - graph.setStartingStmt(assign01); - graph.putEdge(assign01, assign02); - graph.putEdge(assign02, assign03); - graph.putEdge(assign03, if1); - - // block 1 and 2 - graph.putEdge(if1, JIfStmt.TRUE_BRANCH_IDX, return1); - graph.putEdge(if1, JIfStmt.FALSE_BRANCH_IDX, return2); - - return graph; - } } diff --git a/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java index fef91773c75..4d3a6ff3664 100644 --- a/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java +++ b/sootup.core/src/test/java/sootup/core/graph/TestGraphGenerator.java @@ -127,7 +127,7 @@ public MutableBlockStmtGraph createStmtGraph2() { return graph; } - //a graph with two end blocks + // a graph with two end blocks public MutableBlockStmtGraph createStmtGraph3() { MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); From b7916159f2e44c97f8ad8bf507da065da1c2a24a Mon Sep 17 00:00:00 2001 From: zunwang Date: Thu, 17 Oct 2024 16:08:39 +0200 Subject: [PATCH 16/24] format --- sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java index 3a5afe1fd7c..a4646bd8316 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java @@ -23,7 +23,6 @@ */ import java.util.*; -import java.util.stream.Collectors; import javax.annotation.Nonnull; /** From c225762ca0a4d19ffa37019b5b24a45f3d160294 Mon Sep 17 00:00:00 2001 From: zunhoho Date: Wed, 23 Oct 2024 10:43:54 +0200 Subject: [PATCH 17/24] fix test --- .../sootup/core/graph/DominanceFinder.java | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java index a4646bd8316..27d722b70e0 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceFinder.java @@ -24,6 +24,8 @@ import java.util.*; import javax.annotation.Nonnull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @see > blocks; private Map, Integer> blockToIdx = new HashMap<>(); private int[] doms; @@ -55,24 +59,23 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirecti // initialize doms final BasicBlock startBlock; - if (direction == BlockAnalysisDirection.REVERSEPOSTORDERFORWARD) { - startBlock = blockGraph.getStartingStmtBlock(); - } else if (direction == BlockAnalysisDirection.POSTORDERBACKWARD) { - // todo: improve algorithm for graph with multiple tail-blocks - List> tails = blockGraph.getTailStmtBlocks(); - if (tails.size() > 1) { - throw new RuntimeException( - "BlockAnalysisDirection 'BACKWARD' supports block-graphs containing only one tail-block!"); + if (direction == BlockAnalysisDirection.REVERSEPOSTORDERFORWARD + || direction == BlockAnalysisDirection.POSTORDERBACKWARD) { + startBlock = blocks.get(0); + if (direction == BlockAnalysisDirection.POSTORDERBACKWARD) { + // todo: Postdominantor (POSTORDERBACKWARD) doesn't work for with multiple tail-blocks. + List> tails = blockGraph.getTailStmtBlocks(); + if (tails.size() > 1) { + LOGGER.warn( + "BlockGraph has multiple tail-blocks, the Post-Dominators Computation could be incorrect!"); + } } - startBlock = tails.get(0); } else { throw new RuntimeException("Invalid BlockAnalysisDirection!"); } - - int startBlockId = blockToIdx.get(startBlock); doms = new int[blocks.size()]; Arrays.fill(doms, -1); - doms[startBlockId] = startBlockId; + doms[0] = 0; // calculate immediate dominator for each block boolean isChanged = true; @@ -83,7 +86,6 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirecti continue; } int blockIdx = blockToIdx.get(block); - // ms: should not be necessary preds.addAll(block.getExceptionalPredecessors()); List> preds = new ArrayList<>(direction.getPredecessors(block)); int newIdom = getFirstDefinedBlockPredIdx(preds); if (!preds.isEmpty() && newIdom != -1) { @@ -111,7 +113,7 @@ protected DominanceFinder(@Nonnull StmtGraph blockGraph, BlockAnalysisDirecti domFrontiers[i] = new ArrayList<>(); } - doms[startBlockId] = -1; + doms[0] = -1; // calculate dominance frontiers for each block for (BasicBlock block : blocks) { List> preds = new ArrayList<>(direction.getPredecessors(block)); From 7184d0066a34c9ab904207472e2f5800c3e84a31 Mon Sep 17 00:00:00 2001 From: zunhoho Date: Mon, 28 Oct 2024 09:21:09 +0100 Subject: [PATCH 18/24] fix DominanceTree --- sootup.core/src/main/java/sootup/core/graph/DominanceTree.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/DominanceTree.java b/sootup.core/src/main/java/sootup/core/graph/DominanceTree.java index c77b069e317..1234556558b 100644 --- a/sootup.core/src/main/java/sootup/core/graph/DominanceTree.java +++ b/sootup.core/src/main/java/sootup/core/graph/DominanceTree.java @@ -47,7 +47,7 @@ public DominanceTree(@Nonnull DominanceFinder dominanceFinder) { } for (int i = 0; i < treeSize; i++) { - if (iDoms[i] != i) { + if (iDoms[i] != -1 && iDoms[i] != i) { parents[i] = iDoms[i]; children[iDoms[i]].add(i); } From a99f775468d3ff9f5d88a109ef908a3fb4343a25 Mon Sep 17 00:00:00 2001 From: zunhoho Date: Tue, 29 Oct 2024 22:11:19 +0100 Subject: [PATCH 19/24] build graph for SSA test --- .../StaticSingleAssignmentFormer.java | 21 ++-- .../StaticSingleAssignmentFormerTest.java | 100 ++++++++++++------ 2 files changed, 77 insertions(+), 44 deletions(-) diff --git a/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java b/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java index 0bc4c6bf3b7..f3eee016d57 100644 --- a/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java +++ b/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java @@ -90,7 +90,7 @@ public void interceptBody(@Nonnull Body.BodyBuilder builder, @Nonnull View view) DominanceFinder dominanceFinder = new DominanceFinder(stmtGraph); - // decide which block should be add a phi assignStmt, and store such info in a map + // decide which block should be added a phi assignStmt, and store such info in a map // key: Block which contains phiStmts. Values : a set of phiStmts which contained by // corresponding Block Map, Set> blockToPhiStmts = @@ -117,7 +117,7 @@ public void interceptBody(@Nonnull Body.BodyBuilder builder, @Nonnull View view) for (Stmt stmt : block.getStmts()) { // replace use final List uses = stmt.getUses().collect(Collectors.toList()); - if (!uses.isEmpty() && !constainsPhiExpr(stmt)) { + if (!uses.isEmpty() && !containsPhiExpr(stmt)) { for (Value use : uses) { if (use instanceof Local) { Local newUse = localToNameStack.get(use).peek(); @@ -138,7 +138,7 @@ public void interceptBody(@Nonnull Body.BodyBuilder builder, @Nonnull View view) localToNameStack.get(def).push(newDef); FallsThroughStmt newStmt = ((AbstractDefinitionStmt) stmt).withNewDef(newDef); stmtGraph.replaceNode(stmt, newStmt); - if (constainsPhiExpr(newStmt)) { + if (containsPhiExpr(newStmt)) { newPhiStmts.add(newStmt); } } @@ -201,11 +201,11 @@ public void interceptBody(@Nonnull Body.BodyBuilder builder, @Nonnull View view) * This method is used to decide which block should add phiStmts. Note: some phiStmts maybe * contain just one argument, it should be not added into StmtGraph * - * @param dominanceFinder an object of DomimanceFinder, it should be created by the given + * @param dominanceFinder an object of DominanceFinder, it should be created by the given * blockGraph * @param blockToDefs maps each block to the set of defs' local in itself * @param localToBlocks maps each def local to the set of blocks where it is defined. - * @return a map, key: block, value: a set of phiStmts that are added in front of the + * @return a map, key: block, value: a set of empty phiStmts that are added in front of the * corresponding block */ private Map, Set> decideBlockToPhiStmts( @@ -233,17 +233,14 @@ private Map, Set> decideBlockToPhiStmts( JAssignStmt phiStmt = createEmptyPhiStmt(local); // store phiStmt into map - if (blockToPhiStmts.containsKey(df)) { - blockToPhiStmts.get(df).add(phiStmt); - blockToPhiLocals.get(df).add(local); - } else { + if (!blockToPhiStmts.containsKey(df)) { Set phiStmts = new LinkedHashSet<>(); - phiStmts.add(phiStmt); blockToPhiStmts.put(df, phiStmts); Set phiLocals = new HashSet<>(); - phiLocals.add(local); blockToPhiLocals.put(df, phiLocals); } + blockToPhiStmts.get(df).add(phiStmt); + blockToPhiLocals.get(df).add(local); // if the dominance frontier contains no such local, its dominance frontier should add a // phiStmt, so add it into queue @@ -326,7 +323,7 @@ private boolean containsAllChildren(Set> blockSet, List iterator = stmt.getUses().iterator(); iterator.hasNext(); ) { Value use = iterator.next(); diff --git a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java index 57f76ad6f2d..a8179197dbc 100644 --- a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java +++ b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java @@ -12,10 +12,7 @@ import sootup.core.jimple.basic.StmtPositionInfo; import sootup.core.jimple.common.constant.IntConstant; import sootup.core.jimple.common.ref.IdentityRef; -import sootup.core.jimple.common.stmt.BranchingStmt; -import sootup.core.jimple.common.stmt.FallsThroughStmt; -import sootup.core.jimple.common.stmt.JGotoStmt; -import sootup.core.jimple.common.stmt.Stmt; +import sootup.core.jimple.common.stmt.*; import sootup.core.model.Body; import sootup.core.signatures.MethodSignature; import sootup.core.types.ClassType; @@ -53,38 +50,40 @@ public class StaticSingleAssignmentFormerTest { Local l3 = JavaJimple.newLocal("l3", intType); Local stack4 = JavaJimple.newLocal("stack4", refType); - Stmt startingStmt = JavaJimple.newIdentityStmt(l0, identityRef, noStmtPositionInfo); - Stmt assign1tol1 = JavaJimple.newAssignStmt(l1, IntConstant.getInstance(1), noStmtPositionInfo); - Stmt assign1tol2 = JavaJimple.newAssignStmt(l2, IntConstant.getInstance(1), noStmtPositionInfo); - Stmt assign0tol3 = JavaJimple.newAssignStmt(l3, IntConstant.getInstance(0), noStmtPositionInfo); + JIdentityStmt startingStmt = JavaJimple.newIdentityStmt(l0, identityRef, noStmtPositionInfo); + JAssignStmt assign1tol1 = JavaJimple.newAssignStmt(l1, IntConstant.getInstance(1), noStmtPositionInfo); + JAssignStmt assign1tol2 = JavaJimple.newAssignStmt(l2, IntConstant.getInstance(1), noStmtPositionInfo); + JAssignStmt assign0tol3 = JavaJimple.newAssignStmt(l3, IntConstant.getInstance(0), noStmtPositionInfo); BranchingStmt ifStmt = JavaJimple.newIfStmt( JavaJimple.newLtExpr(l3, IntConstant.getInstance(100)), noStmtPositionInfo); BranchingStmt ifStmt2 = JavaJimple.newIfStmt( JavaJimple.newLtExpr(l2, IntConstant.getInstance(20)), noStmtPositionInfo); - Stmt returnStmt = JavaJimple.newReturnStmt(l2, noStmtPositionInfo); - Stmt assignl1tol2 = JavaJimple.newAssignStmt(l2, l1, noStmtPositionInfo); - Stmt assignl3plus1tol3 = + JReturnStmt returnStmt = JavaJimple.newReturnStmt(l2, noStmtPositionInfo); + JAssignStmt assignl1tol2 = JavaJimple.newAssignStmt(l2, l1, noStmtPositionInfo); + JAssignStmt assignl3plus1tol3 = JavaJimple.newAssignStmt( l3, JavaJimple.newAddExpr(l3, IntConstant.getInstance(1)), noStmtPositionInfo); - Stmt assignl3tol2 = JavaJimple.newAssignStmt(l2, l3, noStmtPositionInfo); - Stmt assignl3plus2tol3 = + JAssignStmt assignl3tol2 = JavaJimple.newAssignStmt(l2, l3, noStmtPositionInfo); + JAssignStmt assignl3plus2tol3 = JavaJimple.newAssignStmt( l3, JavaJimple.newAddExpr(l3, IntConstant.getInstance(2)), noStmtPositionInfo); - BranchingStmt gotoStmt = JavaJimple.newGotoStmt(noStmtPositionInfo); + JGotoStmt gotoStmt1 = JavaJimple.newGotoStmt(noStmtPositionInfo); + JGotoStmt gotoStmt2 = JavaJimple.newGotoStmt(noStmtPositionInfo); FallsThroughStmt handlerStmt = JavaJimple.newIdentityStmt(stack4, caughtExceptionRef, noStmtPositionInfo); FallsThroughStmt l2eq0 = JavaJimple.newAssignStmt(l2, IntConstant.getInstance(0), noStmtPositionInfo); - BranchingStmt goTo = JavaJimple.newGotoStmt(noStmtPositionInfo); + JGotoStmt goTo = JavaJimple.newGotoStmt(noStmtPositionInfo); @Test public void testSSA() { StaticSingleAssignmentFormer ssa = new StaticSingleAssignmentFormer(); Body.BodyBuilder builder = createBody(); ssa.interceptBody(builder, new JavaView(Collections.emptyList())); + System.out.println(builder.build()); String expectedBodyString = "{\n" @@ -203,20 +202,54 @@ public void testTrapedSSA() { * l2 = 1 * l3 = 0 * label1: - * if l3 < 100 goto label3 - * if l2 < 20 goto label 2 - * l2 = l1 - * l3 = l3 + 1 - * goto label1; + * if l3 < 100 goto label2 + * return l2 * label2: + * if l2 < 20 goto label3 * l2 = l3 * l3 = l3 + 2 + * goto label4; * label3: - * return l2 + * l2 = l1 + * l3 = l3 + 1 + * goto label4 + * label3: + * goto label1 * */ private Body.BodyBuilder createBody() { MutableBlockStmtGraph graph = new MutableBlockStmtGraph(); + + //Block0 + graph.setStartingStmt(startingStmt); + graph.putEdge(startingStmt, assign1tol1); + graph.putEdge(assign1tol1, assign1tol2); + graph.putEdge(assign1tol2, assign0tol3); + + //block1 + graph.putEdge(assign0tol3, ifStmt); + + //block2 + graph.putEdge(ifStmt,JIfStmt.TRUE_BRANCH_IDX, ifStmt2); + + //block3 + graph.putEdge(ifStmt,JIfStmt.FALSE_BRANCH_IDX, returnStmt); + + //block4 + graph.putEdge(ifStmt2, JIfStmt.TRUE_BRANCH_IDX, assignl1tol2); + graph.putEdge(assignl1tol2, assignl3plus1tol3); + graph.putEdge(assignl3plus1tol3, gotoStmt1); + + //block 5 + graph.putEdge(ifStmt2, JIfStmt.FALSE_BRANCH_IDX, assignl3tol2); + graph.putEdge(assignl3tol2, assignl3plus2tol3); + graph.putEdge(assignl3plus2tol3, gotoStmt2); + + //block 6 + graph.putEdge(gotoStmt1, JGotoStmt.BRANCH_IDX, goTo); + graph.putEdge(gotoStmt2, JGotoStmt.BRANCH_IDX, goTo); + graph.putEdge(goTo, JGotoStmt.BRANCH_IDX, ifStmt); + Body.BodyBuilder builder = Body.builder(graph); builder.setMethodSignature(methodSignature); @@ -224,19 +257,22 @@ private Body.BodyBuilder createBody() { Set locals = ImmutableUtils.immutableSet(l0, l1, l2, l3); builder.setLocals(locals); - Map> successorMap = new HashMap<>(); - successorMap.put(ifStmt, Collections.singletonList(returnStmt)); - successorMap.put(ifStmt2, Collections.singletonList(assignl1tol2)); - successorMap.put(gotoStmt, Collections.singletonList(ifStmt)); - + // todo: how to use initializeWith? + /*Map> successorMap = new HashMap<>(); + successorMap.put(ifStmt, Arrays.asList(ifStmt2, returnStmt)); + successorMap.put(ifStmt2, Arrays.asList(assignl1tol2, assignl3tol2)); + successorMap.put(goTo, Collections.singletonList(ifStmt)); graph.initializeWith( Arrays.asList( - Arrays.asList(startingStmt, assign1tol1, assign1tol2, assign0tol3, ifStmt), + Arrays.asList(startingStmt, assign1tol1, assign1tol2, assign0tol3), + Collections.singletonList(ifStmt), Collections.singletonList(ifStmt2), - Arrays.asList(assignl1tol2, assignl3plus1tol3, gotoStmt), - Arrays.asList(assignl3tol2, assignl3plus2tol3, returnStmt)), + Arrays.asList(assignl1tol2, assignl3plus1tol3, gotoStmt1), + Arrays.asList(assignl3tol2, assignl3plus2tol3, gotoStmt2), + Arrays.asList(goTo), + Collections.singletonList(returnStmt)), successorMap, - Collections.emptyList()); + Collections.emptyList());*/ return builder; } @@ -281,13 +317,13 @@ private Body.BodyBuilder createTrapBody() { Map> successorMap = new HashMap<>(); successorMap.put(ifStmt, Collections.singletonList(returnStmt)); successorMap.put(ifStmt2, Collections.singletonList(assignl1tol2)); - successorMap.put(gotoStmt, Collections.singletonList(ifStmt)); + successorMap.put(gotoStmt1, Collections.singletonList(ifStmt)); graph.initializeWith( Arrays.asList( Arrays.asList(startingStmt, assign1tol1, assign1tol2, assign0tol3, ifStmt), Collections.singletonList(ifStmt2), - Arrays.asList(assignl1tol2, assignl3plus1tol3, gotoStmt), + Arrays.asList(assignl1tol2, assignl3plus1tol3, gotoStmt1), Arrays.asList(assignl3tol2, assignl3plus2tol3, returnStmt)), successorMap, Collections.emptyList()); From d8e2769684d5befd96b9c3fd6abeda3cb4223857 Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 30 Oct 2024 16:28:23 +0100 Subject: [PATCH 20/24] return a modified block and correct mergeable --- .../sootup/core/graph/MutableBlockStmtGraph.java | 13 +++++++++---- .../java/sootup/core/graph/MutableStmtGraph.java | 6 +++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java index 97b5be60758..b018b1b4fc6 100644 --- a/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/MutableBlockStmtGraph.java @@ -787,7 +787,7 @@ protected boolean isMergeable( } // if we are here the datastructure should have managed that the next if is true.. final List sBlockPredecessors = followingBlock.getPredecessors(); - if (sBlockPredecessors.size() != 1 || sBlockPredecessors.get(0) != firstBlock) { + if (sBlockPredecessors.size() > 1 || (sBlockPredecessors.size()==1 && sBlockPredecessors.get(0) != firstBlock)) { return false; } // check if the same traps are applied to both blocks @@ -1070,12 +1070,12 @@ public void validateBlocks() { * simplifies the handling of BranchingStmts) * @param stmts */ - public void insertBefore( + public BasicBlock insertBefore( @Nonnull Stmt beforeStmt, @Nonnull List stmts, @Nonnull Map exceptionMap) { if (stmts.isEmpty()) { - return; + return stmtToBlock.get(beforeStmt).getRight(); } final Pair beforeStmtBlockPair = stmtToBlock.get(beforeStmt); if (beforeStmtBlockPair == null) { @@ -1098,7 +1098,8 @@ public void insertBefore( // all inserted Stmts are FallingThrough: so successorIdx = 0 predecessorBlock.linkSuccessor(0, block); } - + checkAndResetStartingStmt(beforeStmt, stmts); + return predecessorBlock; } else { // TODO: check conditions before splitting if split will be necessary instead of // split-and-merge @@ -1122,8 +1123,12 @@ public void insertBefore( } blocks.add(successorBlock); } + checkAndResetStartingStmt(beforeStmt, stmts); + return block; } + } + private void checkAndResetStartingStmt(Stmt beforeStmt, List stmts){ if (beforeStmt == getStartingStmt()) { setStartingStmt(stmts.get(0)); } diff --git a/sootup.core/src/main/java/sootup/core/graph/MutableStmtGraph.java b/sootup.core/src/main/java/sootup/core/graph/MutableStmtGraph.java index 48ebfe01a54..3861243f57c 100644 --- a/sootup.core/src/main/java/sootup/core/graph/MutableStmtGraph.java +++ b/sootup.core/src/main/java/sootup/core/graph/MutableStmtGraph.java @@ -67,7 +67,7 @@ public void addBlock(@Nonnull List stmts) { */ public abstract void replaceNode(@Nonnull Stmt oldStmt, @Nonnull Stmt newStmt); - public abstract void insertBefore( + public abstract BasicBlock insertBefore( @Nonnull Stmt beforeStmt, @Nonnull List stmts, @Nonnull Map exceptionMap); @@ -76,8 +76,8 @@ public abstract void insertBefore( * inserts the "newStmt" before the position of "beforeStmt" i.e. * newStmt.successors().contains(beforeStmt) will be true */ - public void insertBefore(@Nonnull Stmt beforeStmt, @Nonnull FallsThroughStmt newStmt) { - insertBefore(beforeStmt, Collections.singletonList(newStmt), Collections.emptyMap()); + public BasicBlock insertBefore(@Nonnull Stmt beforeStmt, @Nonnull FallsThroughStmt newStmt) { + return insertBefore(beforeStmt, Collections.singletonList(newStmt), Collections.emptyMap()); } /** removes "stmt" from the StmtGraph */ From 907448a89a14f01006b995a0bf55bb7c1b939644 Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 30 Oct 2024 16:28:48 +0100 Subject: [PATCH 21/24] fix ssa --- .../StaticSingleAssignmentFormer.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java b/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java index f3eee016d57..f4fe58a4c23 100644 --- a/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java +++ b/sootup.interceptors/src/main/java/sootup/interceptors/StaticSingleAssignmentFormer.java @@ -99,7 +99,8 @@ public void interceptBody(@Nonnull Body.BodyBuilder builder, @Nonnull View view) // delete meaningless phiStmts and add other phiStmts into stmtGraph addPhiStmts(blockToPhiStmts, stmtGraph, blockToDefs); - DominanceTree tree = new DominanceTree(dominanceFinder); + //some blocks are modified, so DominanceFinder must be updated for building dominance tree + DominanceTree tree = new DominanceTree(new DominanceFinder(stmtGraph)); Map> localToNameStack = new HashMap<>(); for (Local local : builder.getLocals()) { @@ -300,6 +301,7 @@ private void addPhiStmts( // if the arguments' size of a phiStmt is less than 2, delete it from blockToPhiStmts map // add other phiStmts into corresponding block + Map, BasicBlock> old2UpdatedBlock = new HashMap<>(); for (BasicBlock block : blockToPhiStmts.keySet()) { Set phis = blockToPhiStmts.get(block); Set checkedPhis = new HashSet<>(blockToPhiStmts.get(block)); @@ -309,7 +311,18 @@ private void addPhiStmts( } } for (FallsThroughStmt phi : phis) { - blockGraph.insertBefore(block.getHead(), phi); + BasicBlock updatedBlock = blockGraph.insertBefore(block.getHead(), phi); + if(!updatedBlock.equals(block)){ + old2UpdatedBlock.put(block, updatedBlock); + } + } + } + //update new blocks in blockToPhiStmts + if(!old2UpdatedBlock.isEmpty()){ + for(BasicBlock oldB : old2UpdatedBlock.keySet()){ + Set phis = blockToPhiStmts.get(oldB); + blockToPhiStmts.remove(oldB); + blockToPhiStmts.put(old2UpdatedBlock.get(oldB), phis); } } } From 09df25125a50ed214beeb958b0127331ae98bc94 Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 30 Oct 2024 16:29:01 +0100 Subject: [PATCH 22/24] fix ssa test_1 --- .../StaticSingleAssignmentFormerTest.java | 84 +++++++++---------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java index a8179197dbc..7b803a841b3 100644 --- a/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java +++ b/sootup.java.bytecode.frontend/src/test/java/sootup/java/bytecode/frontend/interceptors/StaticSingleAssignmentFormerTest.java @@ -44,7 +44,7 @@ public class StaticSingleAssignmentFormerTest { IdentityRef caughtExceptionRef = javaJimple.newCaughtExceptionRef(); // build locals - Local l0 = JavaJimple.newLocal("l0", intType); + Local l0 = JavaJimple.newLocal("l0", classType); Local l1 = JavaJimple.newLocal("l1", intType); Local l2 = JavaJimple.newLocal("l2", intType); Local l3 = JavaJimple.newLocal("l3", intType); @@ -52,7 +52,7 @@ public class StaticSingleAssignmentFormerTest { JIdentityStmt startingStmt = JavaJimple.newIdentityStmt(l0, identityRef, noStmtPositionInfo); JAssignStmt assign1tol1 = JavaJimple.newAssignStmt(l1, IntConstant.getInstance(1), noStmtPositionInfo); - JAssignStmt assign1tol2 = JavaJimple.newAssignStmt(l2, IntConstant.getInstance(1), noStmtPositionInfo); + JAssignStmt assign1tol2 = JavaJimple.newAssignStmt(l2, IntConstant.getInstance(2), noStmtPositionInfo); JAssignStmt assign0tol3 = JavaJimple.newAssignStmt(l3, IntConstant.getInstance(0), noStmtPositionInfo); BranchingStmt ifStmt = JavaJimple.newIfStmt( @@ -82,55 +82,53 @@ public class StaticSingleAssignmentFormerTest { public void testSSA() { StaticSingleAssignmentFormer ssa = new StaticSingleAssignmentFormer(); Body.BodyBuilder builder = createBody(); + System.out.println(builder.build()); ssa.interceptBody(builder, new JavaView(Collections.emptyList())); System.out.println(builder.build()); - String expectedBodyString = - "{\n" - + " int l0, l1, l2, l3, l0#0, l1#1, l2#2, l3#3, l3#4, l2#5, l2#6, l3#7, l2#8, l3#9, l3#10, l2#11;\n" - + "\n" - + "\n" - + " l0#0 := @this: Test;\n" - + "\n" - + " l1#1 = 1;\n" - + "\n" - + " l2#2 = 1;\n" - + "\n" - + " l3#3 = 0;\n" - + "\n" - + " label1:\n" - + " l3#4 = phi(l3#3, l3#10);\n" - + "\n" - + " l2#5 = phi(l2#2, l2#11);\n" - + "\n" - + " if l3#4 < 100 goto label3;\n" - + "\n" - + " if l2#5 < 20 goto label2;\n" - + "\n" - + " l2#8 = l1#1;\n" - + "\n" - + " l3#9 = l3#4 + 1;\n" - + "\n" - + " l3#10 = phi(l3#7, l3#9);\n" - + "\n" - + " l2#11 = phi(l2#6, l2#8);\n" - + "\n" - + " goto label1;\n" - + "\n" - + " label2:\n" - + " l2#6 = l3#4;\n" - + "\n" - + " l3#7 = l3#4 + 2;\n" - + "\n" - + " label3:\n" - + " return l2#5;\n" - + "}\n"; + "{\n" + + " Test l0, l0#0;\n" + + " int l1, l1#1, l2, l2#10, l2#2, l2#4, l2#6, l2#8, l3, l3#11, l3#3, l3#5, l3#7, l3#9;\n" + + "\n" + + "\n" + + " l0#0 := @this: Test;\n" + + " l1#1 = 1;\n" + + " l2#2 = 2;\n" + + " l3#3 = 0;\n" + + "\n" + + " label1:\n" + + " l2#4 = phi(l2#2, l2#10);\n" + + " l3#5 = phi(l3#3, l3#11);\n" + + "\n" + + " if l3#5 < 100 goto label2;\n" + + "\n" + + " return l2#4;\n" + + "\n" + + " label2:\n" + + " if l2#4 < 20 goto label3;\n" + + " l2#8 = l3#5;\n" + + " l3#9 = l3#5 + 2;\n" + + "\n" + + " goto label4;\n" + + "\n" + + " label3:\n" + + " l2#6 = l1#1;\n" + + " l3#7 = l3#5 + 1;\n" + + "\n" + + " goto label4;\n" + + "\n" + + " label4:\n" + + " l2#10 = phi(l2#6, l2#8);\n" + + " l3#11 = phi(l3#7, l3#9);\n" + + "\n" + + " goto label1;\n" + + "}\n"; assertEquals(expectedBodyString, builder.build().toString()); } @Test - public void testTrapedSSA() { + public void testTrappedSSA() { StaticSingleAssignmentFormer ssa = new StaticSingleAssignmentFormer(); Body.BodyBuilder builder = createTrapBody(); ssa.interceptBody(builder, new JavaView(Collections.emptyList())); From f9cfe327b7030dad43e96f5e67f0fd49188fdd2e Mon Sep 17 00:00:00 2001 From: zunwang Date: Wed, 30 Oct 2024 16:29:25 +0100 Subject: [PATCH 23/24] update ssa_example --- docs/assets/figures/SSA Example_1.png | Bin 1095791 -> 0 bytes docs/assets/figures/SSA Example_2.png | Bin 1352932 -> 0 bytes docs/assets/figures/SSA_Example.png | Bin 0 -> 323932 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/assets/figures/SSA Example_1.png delete mode 100644 docs/assets/figures/SSA Example_2.png create mode 100644 docs/assets/figures/SSA_Example.png diff --git a/docs/assets/figures/SSA Example_1.png b/docs/assets/figures/SSA Example_1.png deleted file mode 100644 index 31dcde3e7ebf061efc9313fc1f1ea23824f98848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1095791 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

p)E3JpAEr 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 z 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