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 
        {

Reply via email to