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

Reply via email to