Branch removal

Vladimir Kozlov vladimir.kozlov at oracle.com
Thu Sep 27 12:04:59 PDT 2012


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<V> forest = new Forest<V>(graph.vertexSet());
>   Forest<V> forestSwap;
>   double spanningTreeCost;
>   Set<E> edgeList;
>   Set<E> edgeListSwap;
>   ArrayList<E> allEdges = new ArrayList<E>(graph.edgeSet());
>   Collections.sort(allEdges, new Comparator<E>() {
>     @Override
>     public int compare(E edge1, E edge2) {
>     return Double.valueOf(graph.getEdgeWeight(edge1))
>     .compareTo(graph.getEdgeWeight(edge2));
>     }
>   });
> 
>   spanningTreeCost = 0;
>   edgeList = new HashSet<E>();
> 
>   for (E edge : allEdges) {
>     forestSwap = forest.getCopy();
>     edgeListSwap = new HashSet<E>(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);
>     }
>   }
> }


More information about the hotspot-compiler-dev mailing list