Branch removal (original) (raw)
Vladimir Kozlov vladimir.kozlov at oracle.com
Thu Sep 27 12:04:59 PDT 2012
- Previous message: Branch removal
- Next message: Branch removal
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
I think the best solution for you is to modify the java code:
aSwap = a.getCopy(); for (E e : arrayList) { aSwap.do(); if (e.condition()) a = aSwap; aSwap = a.getCopy(); }
Vladimir
Patrick Metzler wrote:
Hi Vladimir,
Thanks for your fast answers. > Could you give a java code example you are trying to optimize? A minimized source code example would be (see below for the complete example I'm working on): MyObject a, aSwap; // ... code left out here ... for (E e : arrayList) { aSwap = a.getCopy(); aSwap.do(); if (e.condition()) a = aSwap; } I want the assignment following 'if' to be a 'conditional move'. After parsing, the two branches resulting of the 'if' statement are connected to two different Loop nodes: ... ___ | | | Loop | / | __ ... | | | / | | Loop | | \ | | ... ... ... \ | | If ... ... / \ | | IfTrue IfFalse | |/ _|_ (Here, IfTrue corresponds to e.condition()==false, i.e. the assignment is not executed. '...' stands for multiple basic blocks here.) I want to delete the else (IfTrue) branch, which is empty in the source code but not in the IDEA graph, including the second Loop. Then I want to provide the data input to CallStaticJava (a.getCopy()) through the CMove. > You can't replace such Phi because its data inputs come from different > conditions (If nodes). You can only replace Phi from "diamond" shaped > graphs: Is it possible to first transform the sub graph into a CFG diamond and then optimize it? Best regards, Patrick Complete source code (borrowed from the JGraphT library, http://jgrapht.org/): public void runKruskal(final Graph<V, E> graph) { Forest forest = new Forest(graph.vertexSet()); Forest forestSwap; double spanningTreeCost; Set edgeList; Set edgeListSwap; ArrayList allEdges = new ArrayList(graph.edgeSet()); Collections.sort(allEdges, new Comparator() { @Override public int compare(E edge1, E edge2) { return Double.valueOf(graph.getEdgeWeight(edge1)) .compareTo(graph.getEdgeWeight(edge2)); } }); spanningTreeCost = 0; edgeList = new HashSet(); for (E edge : allEdges) { forestSwap = forest.getCopy(); edgeListSwap = new HashSet(edgeList); V source = graph.getEdgeSource(edge); V target = graph.getEdgeTarget(edge); forestSwap.union(source, target); edgeListSwap.add(edge); /* Branch to eliminate */ if (!forestSwap.find(source).equals(forestSwap.find(target))) { forest = forestSwap; edgeList = edgeListSwap; spanningTreeCost += graph.getEdgeWeight(edge); } } }
- Previous message: Branch removal
- Next message: Branch removal
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the hotspot-compiler-dev mailing list