Repository: systemml Updated Branches: refs/heads/master 223066eeb -> 4ae6beee5
[HOTFIX][SYSTEMML-2010] Fix merge of blocks w/ external functions Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/4ae6beee Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/4ae6beee Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/4ae6beee Branch: refs/heads/master Commit: 4ae6beee527569886770fa8cfa7b9d3f185fde6f Parents: 223066e Author: Matthias Boehm <[email protected]> Authored: Sat Nov 11 14:17:00 2017 -0800 Committer: Matthias Boehm <[email protected]> Committed: Sat Nov 11 14:17:00 2017 -0800 ---------------------------------------------------------------------- .../hops/rewrite/RewriteMergeBlockSequence.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/4ae6beee/src/main/java/org/apache/sysml/hops/rewrite/RewriteMergeBlockSequence.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteMergeBlockSequence.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteMergeBlockSequence.java index 9593f5f..c1a6332 100644 --- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteMergeBlockSequence.java +++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteMergeBlockSequence.java @@ -29,6 +29,8 @@ import org.apache.sysml.hops.FunctionOp; import org.apache.sysml.hops.Hop; import org.apache.sysml.hops.Hop.DataOpTypes; import org.apache.sysml.hops.HopsException; +import org.apache.sysml.parser.ExternalFunctionStatement; +import org.apache.sysml.parser.FunctionStatementBlock; import org.apache.sysml.parser.StatementBlock; import org.apache.sysml.parser.VariableSet; @@ -66,6 +68,7 @@ public class RewriteMergeBlockSequence extends StatementBlockRewriteRule if( HopRewriteUtils.isLastLevelStatementBlock(sb1) && HopRewriteUtils.isLastLevelStatementBlock(sb2) && !sb1.isSplitDag() && !sb2.isSplitDag() + && !(hasExternalFunctionOpRoot(sb1) && hasExternalFunctionOpRoot(sb2)) && (!hasFunctionOpRoot(sb1) || !hasFunctionIOConflict(sb1,sb2)) && (!hasFunctionOpRoot(sb2) || !hasFunctionIOConflict(sb2,sb1)) ) { @@ -167,6 +170,22 @@ public class RewriteMergeBlockSequence extends StatementBlockRewriteRule return ret; } + private static boolean hasExternalFunctionOpRoot(StatementBlock sb) + throws HopsException { + if( sb == null || sb.get_hops() == null ) + return false; + for( Hop root : sb.get_hops() ) + if( root instanceof FunctionOp ) { + FunctionStatementBlock fsb = sb.getDMLProg() + .getFunctionStatementBlock(((FunctionOp)root).getFunctionKey()); + //note: in case of builtin multi-return functions such as qr (namespace _internal), + //there is no function statement block and hence we need to check for null + if( fsb != null && fsb.getStatement(0) instanceof ExternalFunctionStatement ) + return true; + } + return false; + } + private static boolean hasFunctionIOConflict(StatementBlock sb1, StatementBlock sb2) throws HopsException {
