Repository: systemml Updated Branches: refs/heads/master 686e3831d -> 42071989c
[SYSTEMML-2284] Improved IPA for propagating string args into functions This patch improves the existing inter-procedural analysis (IPA) for propagating scalar strings into functions (if it is safe to do so). So far we only considered long/double/boolean scalars but there are opportunities for scalar strings (often used as type parameters) because it allows for predicate folding and branch removal, which are often prerequisites for additional function inlining. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/42071989 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/42071989 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/42071989 Branch: refs/heads/master Commit: 42071989c59721ec34e394e7947268275a78da7f Parents: 686e383 Author: Matthias Boehm <[email protected]> Authored: Fri Apr 27 21:00:35 2018 -0700 Committer: Matthias Boehm <[email protected]> Committed: Fri Apr 27 21:00:35 2018 -0700 ---------------------------------------------------------------------- .../sysml/hops/recompile/LiteralReplacement.java | 18 +++--------------- .../sysml/hops/rewrite/HopRewriteUtils.java | 18 +++++++----------- .../hops/rewrite/RewriteConstantFolding.java | 12 ++---------- .../instructions/cp/ScalarObjectFactory.java | 12 ++++++++++++ 4 files changed, 24 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/42071989/src/main/java/org/apache/sysml/hops/recompile/LiteralReplacement.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/recompile/LiteralReplacement.java b/src/main/java/org/apache/sysml/hops/recompile/LiteralReplacement.java index de04ed9..575e187 100644 --- a/src/main/java/org/apache/sysml/hops/recompile/LiteralReplacement.java +++ b/src/main/java/org/apache/sysml/hops/recompile/LiteralReplacement.java @@ -40,6 +40,7 @@ import org.apache.sysml.runtime.controlprogram.LocalVariableMap; import org.apache.sysml.runtime.controlprogram.caching.MatrixObject; import org.apache.sysml.runtime.instructions.cp.Data; import org.apache.sysml.runtime.instructions.cp.ScalarObject; +import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory; import org.apache.sysml.runtime.matrix.data.MatrixBlock; import org.apache.sysml.utils.Statistics; @@ -116,22 +117,9 @@ public class LiteralReplacement && c.getDataType()==DataType.SCALAR ) { Data dat = vars.get(c.getName()); - if( dat != null ) //required for selective constant propagation - { + if( dat != null ) { //required for selective constant propagation ScalarObject sdat = (ScalarObject)dat; - switch( sdat.getValueType() ) { - case INT: - ret = new LiteralOp(sdat.getLongValue()); - break; - case DOUBLE: - ret = new LiteralOp(sdat.getDoubleValue()); - break; - case BOOLEAN: - ret = new LiteralOp(sdat.getBooleanValue()); - break; - default: - //otherwise: do nothing - } + ret = ScalarObjectFactory.createLiteralOp(sdat); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/42071989/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java index 8abe90b..427b075 100644 --- a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java +++ b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java @@ -827,19 +827,15 @@ public class HopRewriteUtils return hop.getSparsity() < threshold; } - public static boolean isEqualValue( LiteralOp hop1, LiteralOp hop2 ) - { + public static boolean isEqualValue( LiteralOp hop1, LiteralOp hop2 ) { //check for string (no defined double value) - if( hop1.getValueType()==ValueType.STRING - || hop2.getValueType()==ValueType.STRING ) - { - return false; + if( hop1.getValueType()==ValueType.STRING + || hop2.getValueType()==ValueType.STRING ) { + return hop1.getStringValue() + .equals(hop2.getStringValue()); } - - double val1 = getDoubleValue(hop1); - double val2 = getDoubleValue(hop2); - - return ( val1 == val2 ); + return getDoubleValue(hop1) + == getDoubleValue(hop2); } public static boolean isNotMatrixVectorBinaryOperation( Hop hop ) http://git-wip-us.apache.org/repos/asf/systemml/blob/42071989/src/main/java/org/apache/sysml/hops/rewrite/RewriteConstantFolding.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteConstantFolding.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteConstantFolding.java index ed34956..304fbc3 100644 --- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteConstantFolding.java +++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteConstantFolding.java @@ -28,7 +28,6 @@ import org.apache.sysml.hops.Hop; import org.apache.sysml.hops.Hop.DataOpTypes; import org.apache.sysml.hops.Hop.OpOp1; import org.apache.sysml.hops.Hop.OpOp2; -import org.apache.sysml.hops.HopsException; import org.apache.sysml.hops.LiteralOp; import org.apache.sysml.hops.UnaryOp; import org.apache.sysml.hops.recompile.Recompiler; @@ -41,6 +40,7 @@ import org.apache.sysml.runtime.controlprogram.context.ExecutionContext; import org.apache.sysml.runtime.controlprogram.context.ExecutionContextFactory; import org.apache.sysml.runtime.instructions.Instruction; import org.apache.sysml.runtime.instructions.cp.ScalarObject; +import org.apache.sysml.runtime.instructions.cp.ScalarObjectFactory; /** * Rule: Constant Folding. For all statement blocks, @@ -185,15 +185,7 @@ public class RewriteConstantFolding extends HopRewriteRule //get scalar result (check before invocation) and create literal according //to observed scalar output type (not hop type) for runtime consistency ScalarObject so = (ScalarObject) ec.getVariable(TMP_VARNAME); - LiteralOp literal = null; - switch( so.getValueType() ){ - case DOUBLE: literal = new LiteralOp(so.getDoubleValue()); break; - case INT: literal = new LiteralOp(so.getLongValue()); break; - case BOOLEAN: literal = new LiteralOp(so.getBooleanValue()); break; - case STRING: literal = new LiteralOp(so.getStringValue()); break; - default: - throw new HopsException("Unsupported literal value type: "+bop.getValueType()); - } + LiteralOp literal = ScalarObjectFactory.createLiteralOp(so); //cleanup tmpWrite.getInput().clear(); http://git-wip-us.apache.org/repos/asf/systemml/blob/42071989/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 ba5fad0..f9c1a5d 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 @@ -19,6 +19,7 @@ package org.apache.sysml.runtime.instructions.cp; +import org.apache.sysml.hops.HopsException; import org.apache.sysml.hops.LiteralOp; import org.apache.sysml.parser.Expression.ValueType; import org.apache.sysml.runtime.util.UtilFunctions; @@ -74,4 +75,15 @@ public abstract class ScalarObjectFactory default: throw new RuntimeException("Unsupported scalar value type: "+vt.name()); } } + + public static LiteralOp createLiteralOp(ScalarObject so) { + switch( so.getValueType() ){ + case DOUBLE: return new LiteralOp(so.getDoubleValue()); + case INT: return new LiteralOp(so.getLongValue()); + case BOOLEAN: return new LiteralOp(so.getBooleanValue()); + case STRING: return new LiteralOp(so.getStringValue()); + default: + throw new HopsException("Unsupported literal value type: "+so.getValueType()); + } + } }
