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());
