[SYSTEMML-1982] Improved IPA pass for recompile_once functions

This patch improved the existing inter-procedural-analysis pass for
recompile_once functions that are recompiled on function entry. So far
all functions with loops were marked for recompile_once. The problem is
that recompilation information is not available during IPA. Hence, we
correct these flags now after generating the runtime program and making
the decisions on recompilation.


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

Branch: refs/heads/master
Commit: ee6060bfc1576cf777dfa99c48126a5a7b35db3a
Parents: a2f0598
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Wed Nov 1 22:51:46 2017 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Thu Nov 2 00:39:17 2017 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/parser/DMLTranslator.java  | 57 +++++++++-----------
 .../apache/sysml/parser/ForStatementBlock.java  | 15 ++----
 .../apache/sysml/parser/IfStatementBlock.java   | 12 ++---
 .../org/apache/sysml/parser/StatementBlock.java |  7 +--
 .../sysml/parser/WhileStatementBlock.java       | 12 ++---
 5 files changed, 45 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/ee6060bf/src/main/java/org/apache/sysml/parser/DMLTranslator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java 
b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
index 75103d1..fb8404f 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -317,25 +317,21 @@ public class DMLTranslator
        }
        
        public void constructLops(DMLProgram dmlp) throws ParseException, 
LanguageException, HopsException, LopsException {
-
                // for each namespace, handle function program blocks handle 
function 
-               for (String namespaceKey : dmlp.getNamespaces().keySet()){
-                       for (String fname: 
dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
-                               FunctionStatementBlock current = 
dmlp.getFunctionStatementBlock(namespaceKey, fname);
-                               constructLops(current);
-                       }
-               }
+               for( String namespaceKey : dmlp.getNamespaces().keySet() )
+                       for( FunctionStatementBlock fsb : 
dmlp.getFunctionStatementBlocks(namespaceKey).values() )
+                               constructLops(fsb);
                
                // handle regular program blocks
-               for (int i = 0; i < dmlp.getNumStatementBlocks(); i++) {
-                       StatementBlock current = dmlp.getStatementBlock(i);
-                       constructLops(current);
-               }
+               for( StatementBlock sb : dmlp.getStatementBlocks() )
+                       constructLops(sb);
        }
 
-       public void constructLops(StatementBlock sb) 
+       public boolean constructLops(StatementBlock sb) 
                throws HopsException, LopsException 
-       {       
+       {
+               boolean ret = false;
+               
                if (sb instanceof WhileStatementBlock)
                {
                        WhileStatementBlock wsb = (WhileStatementBlock)sb;
@@ -348,13 +344,13 @@ public class DMLTranslator
                        }
                        // step through stmt blocks in while stmt body
                        for (StatementBlock stmtBlock : body){
-                               constructLops(stmtBlock);
+                               ret |= constructLops(stmtBlock);
                        }
                        
                        // handle while stmt predicate
                        Lop l = wsb.getPredicateHops().constructLops();
                        wsb.set_predicateLops(l);       
-                       wsb.updatePredicateRecompilationFlag();
+                       ret |= wsb.updatePredicateRecompilationFlag();
                }
                
                else if (sb instanceof IfStatementBlock)
@@ -370,16 +366,16 @@ public class DMLTranslator
                        }
                        // step through stmt blocks in if stmt ifBody
                        for (StatementBlock stmtBlock : ifBody)
-                               constructLops(stmtBlock);
+                               ret |= constructLops(stmtBlock);
                        
                        // step through stmt blocks in if stmt elseBody
                        for (StatementBlock stmtBlock : elseBody)
-                               constructLops(stmtBlock);
+                               ret |= constructLops(stmtBlock);
                        
                        // handle if stmt predicate
                        Lop l = isb.getPredicateHops().constructLops();
                        isb.set_predicateLops(l);
-                       isb.updatePredicateRecompilationFlag();
+                       ret |= isb.updatePredicateRecompilationFlag();
                }
                
                else if (sb instanceof ForStatementBlock) //NOTE: applies to 
ForStatementBlock and ParForStatementBlock
@@ -394,7 +390,7 @@ public class DMLTranslator
                        }
                        // step through stmt blocks in FOR stmt body
                        for (StatementBlock stmtBlock : body)
-                               constructLops(stmtBlock);
+                               ret |= constructLops(stmtBlock);
                        
                        // handle for stmt predicate
                        if (fsb.getFromHops() != null){
@@ -409,37 +405,36 @@ public class DMLTranslator
                                Lop llobs = 
fsb.getIncrementHops().constructLops();
                                fsb.setIncrementLops(llobs);
                        }
-                       fsb.updatePredicateRecompilationFlags();
+                       ret |= fsb.updatePredicateRecompilationFlags();
                }
-               else if (sb instanceof FunctionStatementBlock){
+               else if (sb instanceof FunctionStatementBlock) {
+                       FunctionStatementBlock fsb = (FunctionStatementBlock) 
sb;
                        FunctionStatement functStmt = 
(FunctionStatement)sb.getStatement(0);
                        ArrayList<StatementBlock> body = functStmt.getBody();
-                       
                        if (sb.get_hops() != null && !sb.get_hops().isEmpty()) {
                                LOG.error(sb.printBlockErrorLocation() + 
"FunctionStatementBlock should not have hops");
                                throw new 
HopsException(sb.printBlockErrorLocation() + "FunctionStatementBlock should not 
have hops");
                        }
                        // step through stmt blocks in while stmt body
-                       for (StatementBlock stmtBlock : body){
-                               constructLops(stmtBlock);
-                       }
+                       for( StatementBlock stmtBlock : body )
+                               ret |= constructLops(stmtBlock);
+                       if( fsb.isRecompileOnce() )
+                               fsb.setRecompileOnce(ret);
                }
                
                // handle default case for regular StatementBlock
                else {
-                       
                        if (sb.get_hops() == null)
                                sb.set_hops(new ArrayList<Hop>());
-                       
                        ArrayList<Lop> lops = new ArrayList<>();
-                       for (Hop hop : sb.get_hops()) {
+                       for (Hop hop : sb.get_hops())
                                lops.add(hop.constructLops());
-                       }
                        sb.setLops(lops);
-                       sb.updateRecompilationFlag(); 
+                       ret |= sb.updateRecompilationFlag(); 
                }
                
-       } // end method
+               return ret;
+       }
        
        
        public Program getRuntimeProgram(DMLProgram prog, DMLConfig config) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/ee6060bf/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/ForStatementBlock.java 
b/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
index 856e151..686ce7a 100644
--- a/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
@@ -410,29 +410,24 @@ public class ForStatementBlock extends StatementBlock
        // materialized hops recompilation flags
        ////
        
-       public void updatePredicateRecompilationFlags() 
-               throws HopsException
-       {
+       public boolean updatePredicateRecompilationFlags() throws HopsException 
{
                if( ConfigurationManager.isDynamicRecompilation() ) {
                        _requiresFromRecompile = 
Recompiler.requiresRecompilation(getFromHops());
                        _requiresToRecompile = 
Recompiler.requiresRecompilation(getToHops());
                        _requiresIncrementRecompile = 
Recompiler.requiresRecompilation(getIncrementHops());
                }
+               return (_requiresFromRecompile || _requiresToRecompile || 
_requiresIncrementRecompile);
        }
        
-       public boolean requiresFromRecompilation()
-       {
+       public boolean requiresFromRecompilation() {
                return _requiresFromRecompile;
        }
        
-       public boolean requiresToRecompilation()
-       {
+       public boolean requiresToRecompilation() {
                return _requiresToRecompile;
        }
        
-       public boolean requiresIncrementRecompilation()
-       {
+       public boolean requiresIncrementRecompilation() {
                return _requiresIncrementRecompile;
        }
-       
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/systemml/blob/ee6060bf/src/main/java/org/apache/sysml/parser/IfStatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/IfStatementBlock.java 
b/src/main/java/org/apache/sysml/parser/IfStatementBlock.java
index 2a66857..6803eb2 100644
--- a/src/main/java/org/apache/sysml/parser/IfStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/IfStatementBlock.java
@@ -524,15 +524,13 @@ public class IfStatementBlock extends StatementBlock
        // materialized hops recompilation flags
        ////
        
-       public void updatePredicateRecompilationFlag() 
-               throws HopsException
-       {
-               _requiresPredicateRecompile =  
ConfigurationManager.isDynamicRecompilation()    
-                                                  && 
Recompiler.requiresRecompilation(getPredicateHops());
+       public boolean updatePredicateRecompilationFlag() throws HopsException {
+               return (_requiresPredicateRecompile =
+                       ConfigurationManager.isDynamicRecompilation()
+                       && 
Recompiler.requiresRecompilation(getPredicateHops()));
        }
        
-       public boolean requiresPredicateRecompilation()
-       {
+       public boolean requiresPredicateRecompilation() {
                return _requiresPredicateRecompile;
        }
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/ee6060bf/src/main/java/org/apache/sysml/parser/StatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/StatementBlock.java 
b/src/main/java/org/apache/sysml/parser/StatementBlock.java
index 4a24675..c2a3e01 100644
--- a/src/main/java/org/apache/sysml/parser/StatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/StatementBlock.java
@@ -1044,9 +1044,10 @@ public class StatementBlock extends LiveVariableAnalysis 
implements ParseInfo
        // materialized hops recompilation / updateinplace flags
        ////
 
-       public void updateRecompilationFlag() throws HopsException {
-               _requiresRecompile = 
ConfigurationManager.isDynamicRecompilation()
-                                        && 
Recompiler.requiresRecompilation(get_hops());
+       public boolean updateRecompilationFlag() throws HopsException {
+               return (_requiresRecompile =
+                       ConfigurationManager.isDynamicRecompilation()
+                       && Recompiler.requiresRecompilation(get_hops()));
        }
 
        public boolean requiresRecompilation() {

http://git-wip-us.apache.org/repos/asf/systemml/blob/ee6060bf/src/main/java/org/apache/sysml/parser/WhileStatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/WhileStatementBlock.java 
b/src/main/java/org/apache/sysml/parser/WhileStatementBlock.java
index f3f613e..05e2c2c 100644
--- a/src/main/java/org/apache/sysml/parser/WhileStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/WhileStatementBlock.java
@@ -324,15 +324,13 @@ public class WhileStatementBlock extends StatementBlock
        // materialized hops recompilation flags
        ////
        
-       public void updatePredicateRecompilationFlag() 
-               throws HopsException
-       {
-               _requiresPredicateRecompile =  
ConfigurationManager.isDynamicRecompilation() 
-                                                  && 
Recompiler.requiresRecompilation(getPredicateHops());
+       public boolean updatePredicateRecompilationFlag() throws HopsException {
+               return (_requiresPredicateRecompile = 
+                       ConfigurationManager.isDynamicRecompilation() 
+                       && 
Recompiler.requiresRecompilation(getPredicateHops()));
        }
        
-       public boolean requiresPredicateRecompilation()
-       {
+       public boolean requiresPredicateRecompilation() {
                return _requiresPredicateRecompile;
        }
 }
\ No newline at end of file

Reply via email to