Repository: systemml Updated Branches: refs/heads/master 4e5ed3df6 -> 73f131b8c
[SYSTEMML-2390] Fix robustness IPA reuse of function call graphs The recently introduced IPA dead code elimination (including function calls) revealed hidden robustness issues with IPA. Specifically the reuse of the function call graph created problems during repeated IPA when functions where removed. We now made IPA more robust to tolerate these scenarios without the need to recreated the function call graph for every IPA iteration. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/73f131b8 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/73f131b8 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/73f131b8 Branch: refs/heads/master Commit: 73f131b8cd6bc65a2a3ff6043f9fc620445d7866 Parents: 4e5ed3d Author: Matthias Boehm <[email protected]> Authored: Thu Jun 14 13:53:25 2018 -0700 Committer: Matthias Boehm <[email protected]> Committed: Thu Jun 14 13:53:25 2018 -0700 ---------------------------------------------------------------------- .../org/apache/sysml/hops/ipa/FunctionCallGraph.java | 4 +--- .../org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java | 11 +++++++++-- .../apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java | 9 +++++++-- .../sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java | 6 +++++- 4 files changed, 22 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/73f131b8/src/main/java/org/apache/sysml/hops/ipa/FunctionCallGraph.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/ipa/FunctionCallGraph.java b/src/main/java/org/apache/sysml/hops/ipa/FunctionCallGraph.java index 8db298e..74ee056 100644 --- a/src/main/java/org/apache/sysml/hops/ipa/FunctionCallGraph.java +++ b/src/main/java/org/apache/sysml/hops/ipa/FunctionCallGraph.java @@ -174,13 +174,11 @@ public class FunctionCallGraph * Removes a single function call identified by target function name, * and source function op and statement block. * - * @param srcFkey source function key * @param fkey function key of called function * @param fop source function call operator * @param sb source statement block */ - public void removeFunctionCall(String srcFkey, String fkey, FunctionOp fop, StatementBlock sb) { - _fGraph.get(srcFkey).remove(fkey); + public void removeFunctionCall(String fkey, FunctionOp fop, StatementBlock sb) { _fCalls.get(fkey).remove(fop); _fCallsSB.get(fkey).remove(sb); } http://git-wip-us.apache.org/repos/asf/systemml/blob/73f131b8/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java b/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java index ec4439e..8406fab 100644 --- a/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java +++ b/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java @@ -209,7 +209,9 @@ public class FunctionCallSizeInfo //step 1: determine function candidates by evaluating all function calls for( String fkey : _fgraph.getReachableFunctions() ) { List<FunctionOp> flist = _fgraph.getFunctionCalls(fkey); - + if( flist.isEmpty() ) //robustness removed functions + continue; + //condition 1: function called just once if( flist.size() == 1 ) { _fcand.add(fkey); @@ -245,7 +247,10 @@ public class FunctionCallSizeInfo //step 2: determine safe nnz propagation per input //(considered for valid functions only) for( String fkey : _fcand ) { - FunctionOp first = _fgraph.getFunctionCalls(fkey).get(0); + List<FunctionOp> flist = _fgraph.getFunctionCalls(fkey); + if( flist.isEmpty() ) //robustness removed functions + continue; + FunctionOp first = flist.get(0); HashSet<Integer> tmp = new HashSet<>(); for( int j=0; j<first.getInput().size(); j++ ) { //if nnz known it is safe to propagate those nnz because for multiple calls @@ -261,6 +266,8 @@ public class FunctionCallSizeInfo //(considered for all functions) for( String fkey : _fgraph.getReachableFunctions() ) { List<FunctionOp> flist = _fgraph.getFunctionCalls(fkey); + if( flist.isEmpty() ) //robustness removed functions + continue; FunctionOp first = flist.get(0); //initialize w/ all literals of first call HashSet<Integer> tmp = new HashSet<>(); http://git-wip-us.apache.org/repos/asf/systemml/blob/73f131b8/src/main/java/org/apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java b/src/main/java/org/apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java index 344619e..022ea6a 100644 --- a/src/main/java/org/apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java +++ b/src/main/java/org/apache/sysml/hops/ipa/IPAPassEliminateDeadCode.java @@ -75,8 +75,13 @@ public class IPAPassEliminateDeadCode extends IPAPass List<Hop> roots = sbs.get(i).getHops(); for( int j=0; j<roots.size(); j++ ) { Hop root = roots.get(j); - if( (HopRewriteUtils.isData(root, DataOpTypes.TRANSIENTWRITE) && !usedVars.contains(root.getName())) - || isFunctionCallWithUnusedOutputs(root, usedVars, fgraph) ) { + boolean isTWrite = HopRewriteUtils.isData(root, DataOpTypes.TRANSIENTWRITE); + boolean isFCall = isFunctionCallWithUnusedOutputs(root, usedVars, fgraph); + if( (isTWrite && !usedVars.contains(root.getName())) || isFCall ) { + if( isFCall ) { + String fkey = ((FunctionOp) root).getFunctionKey(); + fgraph.removeFunctionCall(fkey, (FunctionOp) root, sbs.get(i)); + } roots.remove(j); j--; rRemoveOpFromDAG(root); } http://git-wip-us.apache.org/repos/asf/systemml/blob/73f131b8/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java b/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java index 165998c..da1481f 100644 --- a/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java +++ b/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java @@ -20,6 +20,7 @@ package org.apache.sysml.hops.ipa; import java.util.ArrayList; +import java.util.List; import org.apache.sysml.hops.FunctionOp; import org.apache.sysml.hops.Hop; @@ -77,7 +78,10 @@ public class IPAPassPropagateReplaceLiterals extends IPAPass //step 2: propagate literals into functions for( String fkey : fgraph.getReachableFunctions() ) { - FunctionOp first = fgraph.getFunctionCalls(fkey).get(0); + List<FunctionOp> flist = fgraph.getFunctionCalls(fkey); + if( flist.isEmpty() ) //robustness removed functions + continue; + FunctionOp first = flist.get(0); //propagate and replace amenable literals into function if( fcallSizes.hasSafeLiterals(fkey) ) {
