You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by ac...@apache.org on 2016/03/07 21:06:17 UTC

incubator-systemml git commit: [SYSTEMML-410] Fix UpdateInPlace intermediate candidate

Repository: incubator-systemml
Updated Branches:
  refs/heads/master 354ec0217 -> 28467c3fe


[SYSTEMML-410] Fix UpdateInPlace intermediate candidate


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

Branch: refs/heads/master
Commit: 28467c3fea6b8ed86ecfdc7d321bbd2390745010
Parents: 354ec02
Author: Arvind Surve <ac...@yahoo.com>
Authored: Mon Mar 7 12:05:56 2016 -0800
Committer: Arvind Surve <ac...@yahoo.com>
Committed: Mon Mar 7 12:05:56 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/sysml/hops/DataGenOp.java   |  3 +-
 .../apache/sysml/hops/recompile/Recompiler.java |  2 +-
 .../parfor/opt/OptimizerConstrained.java        |  4 +-
 .../parfor/opt/OptimizerRuleBased.java          | 99 +++++++++++++++-----
 .../instructions/cp/VariableCPInstruction.java  |  3 +-
 .../java/org/apache/sysml/utils/Explain.java    |  4 +-
 .../java/org/apache/sysml/utils/Statistics.java | 16 ++++
 .../updateinplace/UpdateInPlaceTest.java        | 48 ++++++----
 .../functions/updateinplace/updateinplace10.dml |  2 +
 9 files changed, 130 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/DataGenOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/DataGenOp.java b/src/main/java/org/apache/sysml/hops/DataGenOp.java
index c8d7fc4..c584d9c 100644
--- a/src/main/java/org/apache/sysml/hops/DataGenOp.java
+++ b/src/main/java/org/apache/sysml/hops/DataGenOp.java
@@ -168,7 +168,8 @@ public class DataGenOp extends Hop implements MultiThreadedHop
 				(getRowsInBlock()>0)?getRowsInBlock():DMLTranslator.DMLBlockSize, 
 				(getColsInBlock()>0)?getColsInBlock():DMLTranslator.DMLBlockSize,  
 				//actual rand nnz might differ (in cp/mr they are corrected after execution)
-				(_op==DataGenMethod.RAND && et==ExecType.SPARK && getNnz()!=0) ? -1 : getNnz() );
+				(_op==DataGenMethod.RAND && et==ExecType.SPARK && getNnz()!=0) ? -1 : getNnz(),
+				getUpdateInPlace());
 		
 		setLineNumbers(rnd);
 		setLops(rnd);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
index 0f2add5..aa0eb03 100644
--- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
+++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
@@ -905,7 +905,7 @@ public class Recompiler
 		
 	}
 	
-
+	
 	/**
 	 * 
 	 * @param oldCallVars

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
index 3c67bd7..5f3fb75 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
@@ -162,7 +162,7 @@ public class OptimizerConstrained extends OptimizerRuleBased
 		
 			//rewrite 14:
 			HashSet<String> inplaceResultVars = new HashSet<String>();
-			super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars);
+			super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec);
 			
 			//rewrite 15:
 			super.rewriteDisableCPCaching(pn, inplaceResultVars, ec.getVariables());
@@ -178,7 +178,7 @@ public class OptimizerConstrained extends OptimizerRuleBased
 
 			// rewrite 14: set in-place result indexing
 			HashSet<String> inplaceResultVars = new HashSet<String>();
-			super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars);
+			super.rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec);
 			
 			if( !OptimizerUtils.isSparkExecutionMode() ) {
 				// rewrite 16: runtime piggybacking

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
index 6c4d254..6d17a06 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
@@ -35,6 +35,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.conf.DMLConfig;
 import org.apache.sysml.hops.AggBinaryOp;
+import org.apache.sysml.hops.DataGenOp;
 import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
@@ -101,6 +102,7 @@ import org.apache.sysml.runtime.matrix.MatrixFormatMetaData;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 import org.apache.sysml.runtime.matrix.data.OutputInfo;
 import org.apache.sysml.runtime.matrix.data.SparseRow;
+import org.apache.sysml.utils.Explain;
 import org.apache.sysml.yarn.ropt.YarnClusterAnalyzer;
 
 /**
@@ -155,7 +157,7 @@ public class OptimizerRuleBased extends Optimizer
 	public static final boolean APPLY_REWRITE_NESTED_PARALLELISM = false;
 	public static final String FUNCTION_UNFOLD_NAMEPREFIX = "__unfold_";
 	
-	public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = false;
+	public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = true;
 	
 	public static final double PAR_K_FACTOR        = OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; 
 	public static final double PAR_K_MR_FACTOR     = 1.0 * OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; 
@@ -290,7 +292,7 @@ public class OptimizerRuleBased extends Optimizer
 			
 			// rewrite 14: set in-place result indexing
 			HashSet<String> inplaceResultVars = new HashSet<String>();
-			rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars);
+			rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec);
 			
 			// rewrite 15: disable caching
 			rewriteDisableCPCaching(pn, inplaceResultVars, ec.getVariables());
@@ -305,7 +307,7 @@ public class OptimizerRuleBased extends Optimizer
 			
 			// rewrite 14: set in-place result indexing
 			HashSet<String> inplaceResultVars = new HashSet<String>();
-			rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars);
+			rewriteSetInPlaceResultIndexing(pn, M1, ec.getVariables(), inplaceResultVars, ec);
 			
 			if( !OptimizerUtils.isSparkExecutionMode() ) {
 				// rewrite 16: runtime piggybacking
@@ -1863,7 +1865,7 @@ public class OptimizerRuleBased extends Optimizer
 	 * @param inPlaceResultVars
 	 * @throws DMLRuntimeException
 	 */
-	protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, LocalVariableMap vars, HashSet<String> inPlaceResultVars) 
+	protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, LocalVariableMap vars, HashSet<String> inPlaceResultVars, ExecutionContext ec) 
 		throws DMLRuntimeException 
 	{
 		//assertions (warnings of corrupt optimizer decisions)
@@ -1933,11 +1935,11 @@ public class OptimizerRuleBased extends Optimizer
 					
 					if (uipCandHopList != null) {
 						for (UIPCandidateHop uipCandHop: uipCandHopList)
-							if(uipCandHop.isLoopApplicable() && uipCandHop.isUpdateInPlace())
+							if(uipCandHop.isIntermediate() && uipCandHop.isLoopApplicable() && uipCandHop.isUpdateInPlace())
 							{
 								uipCandHop.getHop().setUpdateInPlace(true);
 								bAnyUIPApplicable = true;
-								
+
 								if(LOG.isDebugEnabled())
 									listUIPRes.get().add(uipCandHop.getHop().getName());
 							}
@@ -1945,8 +1947,9 @@ public class OptimizerRuleBased extends Optimizer
 				}
 				if(bAnyUIPApplicable)
 					try {
-						//Recompile this block if there is any update in place applicable.
-						Recompiler.recompileProgramBlockInstructions(pfpb);		//TODO: Recompile @ very high level ok?
+						//Recompile this block recursively if there is any update in place applicable.
+						LocalVariableMap localVaraibleMap = (LocalVariableMap) ec.getVariables().clone();
+						Recompiler.recompileProgramBlockHierarchy(pfpb.getChildBlocks(), localVaraibleMap, 0L, true);
 					}
 					catch(Exception ex){
 						throw new DMLRuntimeException(ex);
@@ -1956,7 +1959,9 @@ public class OptimizerRuleBased extends Optimizer
 
 		if(APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE && LOG.isTraceEnabled())
 		{
-			LOG.trace("UpdateInPlace = " + apply + " for lines between " + pn.getBeginLine() + " and " + pn.getEndLine());
+			LOG.trace("UpdateInPlace = " + apply + " for lines between " + pn.getBeginLine() + " and " + pn.getEndLine()
+					+ " for " + uipCandHopHM.size() + " intermediate matrix objects:" + uipCandHopHM.keySet().toString());
+				
 			for(Entry<String, ArrayList <UIPCandidateHop>> entry: uipCandHopHM.entrySet())
 			{
 				ArrayList <UIPCandidateHop> uipCandHopList = entry.getValue();
@@ -1964,8 +1969,18 @@ public class OptimizerRuleBased extends Optimizer
 				if (uipCandHopList != null) {
 					for (UIPCandidateHop uipCandHop: uipCandHopList)
 					{
-						LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ ">, InLoop:"
-								+ uipCandHop.isLoopApplicable() + ", UIPApplicable:" + uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + uipCandHop.getHop().getUpdateInPlace());	
+						if(uipCandHop.getHop() != null)
+						{
+							LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ ">, InLoop:"
+								+ uipCandHop.isLoopApplicable() + ", UIPApplicable:" + uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + uipCandHop.getHop().getUpdateInPlace());
+							LOG.trace("Explain Candidate HOP after recompile");
+							LOG.trace(Explain.explain(uipCandHop.getHop()));
+						}
+						else
+						{
+							LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ ">, InLoop:"
+									+ uipCandHop.isLoopApplicable() + ", Not an Intermediate matrix object");
+						}
 					}
 				}
 			}
@@ -2024,7 +2039,7 @@ public class OptimizerRuleBased extends Optimizer
 	{
 		rIsInLoop(pn, uipCandHopHM, false);
 		
-		// Prune candidate list based on non-existance of candidate in the loop
+		// Prune candidate list based on non-existance of intermediate candidate in the loop
 		Iterator<Map.Entry<String, ArrayList <UIPCandidateHop>>> uipCandHopHMIter = uipCandHopHM.entrySet().iterator();
 		while(uipCandHopHMIter.hasNext())
 		{
@@ -2035,12 +2050,18 @@ public class OptimizerRuleBased extends Optimizer
 				for (Iterator<UIPCandidateHop> uipCandHopListIter = uipCandHopList.iterator(); uipCandHopListIter.hasNext();) 
 				{
 					UIPCandidateHop uipCandHop = uipCandHopListIter.next();
-					if (!uipCandHop.isLoopApplicable())	//If Loop is not applicable then remove it from the list. 
+					if (!uipCandHop.isIntermediate() || !uipCandHop.isLoopApplicable())	//If Loop is not applicable then remove it from the list. 
 					{
 						uipCandHopListIter.remove();
 						if(LOG.isTraceEnabled())
-							LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ 
-									">, removed from the candidate list as it does not have loop criteria applicable.");
+						{
+							if (!uipCandHop.isIntermediate())
+								LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ 
+										">, removed from the candidate list as it is not an intermediate matrix object.");
+							else
+								LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ 
+										">, removed from the candidate list as it does not have loop criteria applicable.");
+						}
 					}
 				}
 				if(uipCandHopList.isEmpty())
@@ -2074,7 +2095,7 @@ public class OptimizerRuleBased extends Optimizer
 								{
 									uipCandHopListIter.remove();
 									if(LOG.isTraceEnabled())
-										LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ 
+										LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + uipCandHop.getLixHop().getBeginLine() + "," + uipCandHop.getLixHop().getEndLine()+ 
 												">, removed from the candidate list as one of the consumer is FunctionOp.");
 									break;
 								}
@@ -2135,7 +2156,7 @@ public class OptimizerRuleBased extends Optimizer
 				rIsInLoop(optNode, uipCandHopHM, bLoop);
 			}
 		}
-		else if(bInLoop)
+		else 
 		{
 			Hop hop = (Hop) OptTreeConverter.getAbstractPlanMapping().getMappedHop(pn.getID());
 
@@ -2147,8 +2168,16 @@ public class OptimizerRuleBased extends Optimizer
 				{
 					for (UIPCandidateHop uipCandHop: uipCandHopList)
 					{
+						//Identify where intermediate object has been defined.
+						if (hop instanceof DataGenOp && hop.getName().equals(uipCandHop.getLixHop().getName()))
+						{
+							uipCandHop.setHop(hop);
+							uipCandHop.setLocation(hop.getBeginLine());
+							uipCandHop.setIntermediate(true);
+						}
+							
 						//Update if candiate hop defined outside this loop, and leftindexing is within this loop.
-						if (uipCandHop.getLocation() <= hop.getBeginLine() && uipCandHop.getHop().getBeginLine() <= hop.getEndLine())
+						if ((bInLoop) && (uipCandHop.getLocation() <= hop.getBeginLine() && uipCandHop.getLixHop().getBeginLine() <= hop.getEndLine()))
 							uipCandHop.setIsLoopApplicable(true);
 					}
 				}
@@ -2725,8 +2754,8 @@ public class OptimizerRuleBased extends Optimizer
 				uipCandidateHM.put(uipCandiateID, uipCandiHopList);
 
 				StatementBlock sb = (StatementBlock) OptTreeConverter.getAbstractPlanMapping().getMappedProg(OptTreeConverter.getAbstractPlanMapping().getMappedParentID(n.getID()))[0];
-				if(LOG.isDebugEnabled())
-					LOG.debug("Candidate Hop:" + h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + 
+				if(LOG.isTraceEnabled())
+					LOG.trace("Candidate Hop:" + h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + 
 						h.getBeginColumn() + "," + h.getEndColumn() + "> PB:" + "<" + pb.getBeginLine() + "," + pb.getEndLine() + ">,<" + 
 						pb.getBeginColumn() + "," + pb.getEndColumn() + "> SB:" + "<" + sb.getBeginLine() + "," + sb.getEndLine() + ">,<" + 
 						sb.getBeginColumn() + "," + sb.getEndColumn() + ">");
@@ -3894,22 +3923,32 @@ public class OptimizerRuleBased extends Optimizer
 	 * as location, flag to indicate if its in loop (for, parfor, while), flag to indicate if hop can be marked as "UpdateInPlace".
 	 */
 	class UIPCandidateHop {
-		Hop hop;
+		Hop hopCandidate, hopLix;
 		int iLocation = -1;
 		ProgramBlock pb;
-		Boolean bIsLoopApplicable = false, bUpdateInPlace = true;
+		Boolean bIntermediate = false, bIsLoopApplicable = false, bUpdateInPlace = true;
 		ArrayList<Hop> consumerHops = null;
 		
 		
-		UIPCandidateHop(Hop hop, ProgramBlock pb)
+		UIPCandidateHop(Hop hopLix, ProgramBlock pb)
 		{
-			this.hop = hop;
+			this.hopLix = hopLix;
 			this.pb = pb;
 		}
 		
+		Hop getLixHop()
+		{
+			return hopLix;
+		}
+		
 		Hop getHop()
 		{
-			return hop;
+			return hopCandidate;
+		}
+		
+		void setHop(Hop hopCandidate)
+		{
+			this.hopCandidate = hopCandidate;
 		}
 		
 		ProgramBlock getProgramBlock()
@@ -3927,6 +3966,16 @@ public class OptimizerRuleBased extends Optimizer
 			this.iLocation = iLocation;
 		}
 		
+		boolean isIntermediate()
+		{
+			return(bIntermediate);
+		}
+		
+		void setIntermediate(boolean bIntermediate)
+		{
+			this.bIntermediate = bIntermediate;
+		}
+		
 		boolean isLoopApplicable()
 		{
 			return(bIsLoopApplicable);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
index 22bd2ab..dac114b 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
@@ -22,6 +22,7 @@ package org.apache.sysml.runtime.instructions.cp;
 import java.io.IOException;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.lops.Lop;
 import org.apache.sysml.lops.UnaryCP;
 import org.apache.sysml.parser.Expression.DataType;
@@ -446,7 +447,7 @@ public class VariableCPInstruction extends CPInstruction
 				mobj.setFileFormatProperties(formatProperties);
 				mobj.enableUpdateInPlace(updateInPlace);
 				ec.setVariable(input1.getName(), mobj);
-				if(updateInPlace)
+				if(DMLScript.STATISTICS && updateInPlace)
 					Statistics.incrementTotalUIPVar();
 			}
 			else if ( input1.getDataType() == DataType.SCALAR ){

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Explain.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/utils/Explain.java b/src/main/java/org/apache/sysml/utils/Explain.java
index 1986265..c070378 100644
--- a/src/main/java/org/apache/sysml/utils/Explain.java
+++ b/src/main/java/org/apache/sysml/utils/Explain.java
@@ -28,9 +28,7 @@ import java.util.Map.Entry;
 import org.apache.sysml.api.DMLException;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
-import org.apache.sysml.hops.Hop.DataOpTypes;
 import org.apache.sysml.hops.Hop.VisitStatus;
-import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.HopsException;
 import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.hops.OptimizerUtils;
@@ -686,7 +684,7 @@ public class Explain
 		               + hop.getColsInBlock() + "," 
 				       + hop.getNnz());
 		
-		if (hop instanceof DataOp && ((DataOp)hop).getDataOpType() == DataOpTypes.TRANSIENTREAD && hop.getUpdateInPlace())
+		if (hop.getUpdateInPlace())
 			sb.append("," + hop.getUpdateInPlace());
 		
 		sb.append("]");

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Statistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/utils/Statistics.java b/src/main/java/org/apache/sysml/utils/Statistics.java
index ce133ff..a517136 100644
--- a/src/main/java/org/apache/sysml/utils/Statistics.java
+++ b/src/main/java/org/apache/sysml/utils/Statistics.java
@@ -159,14 +159,26 @@ public class Statistics
 		iNoOfCompiledSPInst ++;
 	}
 	
+	public static long getTotalUIPVar() {
+		return lTotalUIPVar.get();
+	}
+
 	public static void incrementTotalUIPVar() {
 		lTotalUIPVar.incrementAndGet();
 	}
 
+	public static long getTotalLixUIP() {
+		return lTotalLixUIP.get();
+	}
+
 	public static void incrementTotalLixUIP() {
 		lTotalLixUIP.incrementAndGet();
 	}
 
+	public static long getTotalLix() {
+		return lTotalLix.get();
+	}
+
 	public static void incrementTotalLix() {
 		lTotalLix.incrementAndGet();
 	}
@@ -320,6 +332,10 @@ public class Statistics
 		parforInitTime = 0;
 		parforMergeTime = 0;
 		
+		lTotalLix.set(0);
+		lTotalLixUIP.set(0);
+		lTotalUIPVar.set(0);
+		
 		resetJITCompileTime();
 		resetJVMgcTime();
 		resetJVMgcCount();

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
index 503a42f..062a680 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
@@ -29,6 +29,7 @@ import org.apache.sysml.runtime.controlprogram.parfor.opt.OptimizerRuleBased;
 import org.apache.sysml.test.integration.AutomatedTestBase;
 import org.apache.sysml.test.integration.TestConfiguration;
 import org.apache.sysml.test.utils.TestUtils;
+import org.apache.sysml.utils.Statistics;
 
 public class UpdateInPlaceTest extends AutomatedTestBase 
 {
@@ -101,13 +102,12 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 		addTestConfiguration(TEST_NAME, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME, null));
 	}
 
-	//public void testUIPOverlapStatement(1)
 	@Test
 	public void testUIP() 
 	{
 		List<String> listUIPRes = Arrays.asList("A");
 
-		runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes, 2, 4, 4);
 	}
 	
 	@Test
@@ -115,7 +115,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -123,7 +123,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -131,7 +131,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList("A");
 
-		runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes, 2, 4, 4);
 	}
 	
 	@Test
@@ -139,7 +139,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -147,7 +147,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -155,7 +155,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -163,7 +163,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -171,7 +171,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -179,7 +179,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes, 0, 0, 12);
 	}
 	
 	@Test
@@ -187,7 +187,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes, 0, 0, 8);
 	}
 	
 	@Test
@@ -195,7 +195,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -203,7 +203,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes, 0, 0, 4);
 	}
 	
 	@Test
@@ -211,7 +211,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList("A");
 
-		runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes, 2, 4, 8);
 	}
 		
 	@Test
@@ -219,17 +219,16 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 	{
 		List<String> listUIPRes = Arrays.asList();
 
-		runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes);
+		runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes, 0, 0, 4);
 	}
 	
-
 	/**
 	 * 
 	 * @param TEST_NAME
 	 * @param iTestNumber
 	 * @param listUIPRes
 	 */
-	private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, List<String> listUIPExp )
+	private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, List<String> listUIPExp, long lTotalUIPVar, long lTotalLixUIP, long lTotalLix)
 	{
 		try
 		{
@@ -272,6 +271,19 @@ public class UpdateInPlaceTest extends AutomatedTestBase
 							" does not match with the # of matrix objects " + "0" + " from optimization result.", 
 							(listUIPRes == null || listUIPRes.size() == 0));
 				}
+				
+				Assert.assertTrue("Expected # of UpdateInPlace create variables of type matrix " + lTotalUIPVar + 
+						" does not match with the # of UpdateInPlace create variables of type matrix objects " + Statistics.getTotalUIPVar() + " from optimization result.", 
+						(Statistics.getTotalUIPVar() == lTotalUIPVar));
+				
+				Assert.assertTrue("Expected # of UpdateInPlace LeftIndexing " + lTotalLixUIP + 
+						" does not match with the # of UpdateInPlace LeftIndexing " + Statistics.getTotalLixUIP() + " from optimization result.", 
+						(Statistics.getTotalLixUIP() == lTotalLixUIP));
+				
+				Assert.assertTrue("Expected # of total LeftIndexing " + lTotalLix + 
+						" does not match with the # of total LeftIndexing " + Statistics.getTotalLix() + " from optimization result.", 
+						(Statistics.getTotalLix() == lTotalLix));
+				
 			}
 		}
 		finally{

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/scripts/functions/updateinplace/updateinplace10.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/updateinplace/updateinplace10.dml b/src/test/scripts/functions/updateinplace/updateinplace10.dml
index 936bbfe..0d3a99a 100644
--- a/src/test/scripts/functions/updateinplace/updateinplace10.dml
+++ b/src/test/scripts/functions/updateinplace/updateinplace10.dml
@@ -31,6 +31,8 @@ parfor (j in 1:m, log=DEBUG){
 		if(1 == 1)
 			B = A
 		A[i,2] = j*3+i;
+		if(1 == 1)
+			B = A
 		A[i,3] = j*4+i;
 	}
 }