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) ) {

Reply via email to