[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") };
