Repository: systemml
Updated Branches:
  refs/heads/master 2fed357e2 -> 2b86a4d92


[SYSTEMML-2356] Improved IPA constant propagation and replacement

After SYSTEMML-2340 had to disable the parser constant propagation into
conditional control flow, this patch now improves the IPA constant
propagation pass to recognize constant scalars and propagate and replace
them whenever it's save to do so.


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

Branch: refs/heads/master
Commit: dbc844c12db6cb4d0e617be46d7fc51fa3eaee67
Parents: 2fed357
Author: Matthias Boehm <[email protected]>
Authored: Sat Jun 2 16:56:06 2018 -0700
Committer: Matthias Boehm <[email protected]>
Committed: Sat Jun 2 20:45:54 2018 -0700

----------------------------------------------------------------------
 .../ipa/IPAPassPropagateReplaceLiterals.java    | 21 ++++++++++++++++++++
 .../apache/sysml/parser/ForStatementBlock.java  |  6 ++----
 .../instructions/cp/ScalarObjectFactory.java    |  4 ++++
 3 files changed, 27 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/dbc844c1/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java 
b/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java
index 4d9af5a..165998c 100644
--- 
a/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java
+++ 
b/src/main/java/org/apache/sysml/hops/ipa/IPAPassPropagateReplaceLiterals.java
@@ -25,7 +25,9 @@ import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
 import org.apache.sysml.hops.HopsException;
 import org.apache.sysml.hops.LiteralOp;
+import org.apache.sysml.hops.Hop.DataOpTypes;
 import org.apache.sysml.hops.recompile.Recompiler;
+import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.parser.DataIdentifier;
 import org.apache.sysml.parser.ForStatement;
@@ -55,6 +57,25 @@ public class IPAPassPropagateReplaceLiterals extends IPAPass
        @Override
        public void rewriteProgram( DMLProgram prog, FunctionCallGraph fgraph, 
FunctionCallSizeInfo fcallSizes ) 
        {
+               //step 1: propagate final literals across main program
+               LocalVariableMap constants = new LocalVariableMap();
+               for( StatementBlock sb : prog.getStatementBlocks() ) {
+                       //delete update constant variables
+                       
constants.removeAllIn(sb.variablesUpdated().getVariableNames());
+                       //literal replacement
+                       rReplaceLiterals(sb, constants);
+                       //extract literal assignments
+                       if( HopRewriteUtils.isLastLevelStatementBlock(sb) ) {
+                               for( Hop root : sb.getHops() )
+                                       if( HopRewriteUtils.isData(root, 
DataOpTypes.TRANSIENTWRITE)
+                                               && root.getInput().get(0) 
instanceof LiteralOp) {
+                                               constants.put(root.getName(), 
ScalarObjectFactory
+                                                       
.createScalarObject((LiteralOp)root.getInput().get(0)));
+                                       }
+                       }
+               }
+               
+               //step 2: propagate literals into functions
                for( String fkey : fgraph.getReachableFunctions() ) {
                        FunctionOp first = fgraph.getFunctionCalls(fkey).get(0);
                        

http://git-wip-us.apache.org/repos/asf/systemml/blob/dbc844c1/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 62f59dd..dd6f7a4 100644
--- a/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
@@ -89,8 +89,7 @@ public class ForStatementBlock extends StatementBlock
                //validate body
                _dmlProg = dmlProg;
                for(StatementBlock sb : body) {
-                       ids = sb.validate(dmlProg, ids, constVars,
-                               !(this instanceof ParForStatementBlock));
+                       ids = sb.validate(dmlProg, ids, constVars, true);
                        constVars = sb.getConstOut();
                }
                
@@ -166,8 +165,7 @@ public class ForStatementBlock extends StatementBlock
                        //validate body
                        _dmlProg = dmlProg;
                        for(StatementBlock sb : body) {
-                               ids = sb.validate(dmlProg, ids, constVars,
-                                       !(this instanceof 
ParForStatementBlock));
+                               ids = sb.validate(dmlProg, ids, constVars, 
true);
                                constVars = sb.getConstOut();
                        }
                        if (!body.isEmpty()){

http://git-wip-us.apache.org/repos/asf/systemml/blob/dbc844c1/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
index f9c1a5d..7f5342a 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarObjectFactory.java
@@ -66,6 +66,10 @@ public abstract class ScalarObjectFactory
                }
        }
        
+       public static ScalarObject createScalarObject(LiteralOp lit) {
+               return createScalarObject(lit.getValueType(), lit);
+       }
+       
        public static ScalarObject createScalarObject(ValueType vt, LiteralOp 
lit) {
                switch( vt ) {
                        case DOUBLE:  return new 
DoubleObject(lit.getDoubleValue());

Reply via email to