[SYSTEMML-2272] Fix IPA size-preserving check for recursive functions

This patch fixes the inter-procedural analysis (IPA) - which was already
aware of recursive functions - to properly handle recursive functions
when checking for unary size-preserving functions. Guarding this check
for recursive functions is important because although seen at top-level
as a unary size-preserving function it might internally be called with
different sizes (e.g., common block-recursive cholesky).


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/f8dc5c18
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/f8dc5c18
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/f8dc5c18

Branch: refs/heads/master
Commit: f8dc5c18bd2cc63d9980467e67686ec85d5729e4
Parents: d368644
Author: Matthias Boehm <[email protected]>
Authored: Sat Apr 21 23:10:30 2018 -0700
Committer: Matthias Boehm <[email protected]>
Committed: Sat Apr 21 23:10:30 2018 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java     | 2 +-
 .../org/apache/sysml/hops/ipa/InterProceduralAnalysis.java  | 9 +++++++--
 .../applications/dml/ScalableDecompositionTest.java         | 2 +-
 3 files changed, 9 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/f8dc5c18/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 2d2f658..ec4439e 100644
--- a/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java
+++ b/src/main/java/org/apache/sysml/hops/ipa/FunctionCallSizeInfo.java
@@ -324,7 +324,7 @@ public class FunctionCallSizeInfo
                }
                
                if( !getInvalidFunctions().isEmpty() ) {
-                       sb.append("Invaid functions for propagation: \n");
+                       sb.append("Invalid functions for propagation: \n");
                        for( String fkey : getInvalidFunctions() ) {
                                sb.append("--");
                                sb.append(fkey);

http://git-wip-us.apache.org/repos/asf/systemml/blob/f8dc5c18/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java 
b/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
index 553fbb6..d39b4b6 100644
--- a/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
+++ b/src/main/java/org/apache/sysml/hops/ipa/InterProceduralAnalysis.java
@@ -181,9 +181,14 @@ public class InterProceduralAnalysis
                        //step 1: intra- and inter-procedural 
                        if( INTRA_PROCEDURAL_ANALYSIS ) {
                                //get unary dimension-preserving non-candidate 
functions
-                               for( String tmp : 
fcallSizes.getInvalidFunctions() )
-                                       if( 
isUnarySizePreservingFunction(_prog.getFunctionStatementBlock(tmp)) )
+                               //note: we have to guard against recursive 
functions because these might
+                               //be seen at top-level as a unary 
size-preserving function but internally
+                               //called with different sizes (e.g., common 
block-recursive cholesky)
+                               for( String tmp : 
fcallSizes.getInvalidFunctions() ) {
+                                       if( !_fgraph.isRecursiveFunction(tmp)
+                                               && 
isUnarySizePreservingFunction(_prog.getFunctionStatementBlock(tmp)) )
                                                
fcallSizes.addDimsPreservingFunction(tmp);
+                               }
                                if( LOG.isDebugEnabled() )
                                        LOG.debug("IPA: Extended 
FunctionCallSummary: \n" + fcallSizes);
                                

http://git-wip-us.apache.org/repos/asf/systemml/blob/f8dc5c18/src/test/java/org/apache/sysml/test/integration/applications/dml/ScalableDecompositionTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/applications/dml/ScalableDecompositionTest.java
 
b/src/test/java/org/apache/sysml/test/integration/applications/dml/ScalableDecompositionTest.java
index 607cac0..2fd1e7d 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/applications/dml/ScalableDecompositionTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/applications/dml/ScalableDecompositionTest.java
@@ -180,7 +180,7 @@ public class ScalableDecompositionTest extends 
AutomatedTestBase
                        OptimizerUtils.ALLOW_INTER_PROCEDURAL_ANALYSIS = 
rewrites;
                        
                        fullDMLScriptName = SCRIPT_DIR + TEST_DIR + testname + 
".dml";
-                       programArgs = new String[]{"-explain","-args",
+                       programArgs = new String[]{"-stats", "-explain", 
"hops", "-args",
                                String.valueOf(type.ordinal()), 
String.valueOf(blen),
                                input("A"), input("B"), output("C"), 
output("D"), output("E") };
                        

Reply via email to