This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new eafd5094e7 [MINOR] Improved mvvar instruction general (del unnecessary 
rmvar)
eafd5094e7 is described below

commit eafd5094e7f3c0d3fbeb4cef454249627baf5618
Author: Matthias Boehm <[email protected]>
AuthorDate: Sun Jul 2 21:47:20 2023 +0200

    [MINOR] Improved mvvar instruction general (del unnecessary rmvar)
    
    This patch extends the existing cleanup pass for mvvar instruction
    generation. When compiling loops such as "for(i in 1:n) A+=i" the
    generated program blocks improved from
    
    ----FOR (lines 0-0)
    ------CP assignvar 1.SCALAR.INT64.true __pred.SCALAR.INT64
    ------CP assignvar 1000000.0.SCALAR.FP64.true __pred.SCALAR.FP64
    ------CP assignvar 1.SCALAR.INT64.true __pred.SCALAR.INT64
    ------GENERIC (lines 3-3) [recompile=false]
    --------CP createvar _mVar1 ...1 true MATRIX binary 10 10 1000 -1 copy
    --------CP + X.MATRIX.FP64 i.SCALAR.INT64.false _mVar1.MATRIX.FP64 8
    --------CP rmvar X
    --------CP mvvar _mVar1 X
    ------CP rmvar i
    
    to
    
    ----FOR (lines 0-0)
    ------CP assignvar 1.SCALAR.INT64.true __pred.SCALAR.INT64
    ------CP assignvar 1000000.0.SCALAR.FP64.true __pred.SCALAR.FP64
    ------CP assignvar 1.SCALAR.INT64.true __pred.SCALAR.INT64
    ------GENERIC (lines 3-3) [recompile=false]
    --------CP createvar _mVar1 ...1 true MATRIX binary 10 10 1000 -1 copy
    --------CP + X.MATRIX.FP64 i.SCALAR.INT64.false _mVar1.MATRIX.FP64 8
    --------CP mvvar _mVar1 X
    ------CP rmvar i
---
 src/main/java/org/apache/sysds/lops/compile/Dag.java          | 11 ++++++++++-
 .../sysds/runtime/instructions/cp/VariableCPInstruction.java  |  4 ++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/sysds/lops/compile/Dag.java 
b/src/main/java/org/apache/sysds/lops/compile/Dag.java
index 260d8484a4..e96cbd9d78 100644
--- a/src/main/java/org/apache/sysds/lops/compile/Dag.java
+++ b/src/main/java/org/apache/sysds/lops/compile/Dag.java
@@ -1027,7 +1027,8 @@ public class Dag<N extends Lop>
         */
        private static ArrayList<Instruction> 
cleanupInstructions(List<Instruction> insts) {
                //step 1: create mvvar instructions: assignvar s1 s2, rmvar s1 
-> mvvar s1 s2,
-               //                                   cpvar m1 m2, rmvar m1 --> 
mvvar m1 m2 
+               //                                   cpvar m1 m2, rmvar m1 --> 
mvvar m1 m2
+               //                                   rmvar m2, mvvar m1 m2 -> 
mvvar m1 m2
                List<Instruction> tmp1 = 
collapseAssignvarAndRmvarInstructions(insts);
                
                //step 2: create packed rmvar instructions: rmvar m1, rmvar m2 
-> rmvar m1 m2
@@ -1049,6 +1050,14 @@ public class Dag<N extends Lop>
                                        && 
((VariableCPInstruction)inst2).isRemoveVariableNoFile()
                                        && inst1.getInput1().getName().equals(
                                                
((VariableCPInstruction)inst2).getInput1().getName()) ) {
+                                       //remove unnecessary rmvar before mvvar
+                                       Instruction last = 
ret.get(ret.size()-1);
+                                       if( last instanceof 
VariableCPInstruction
+                                               && 
((VariableCPInstruction)last).isRemoveVariableNoFile()
+                                               && 
((VariableCPInstruction)last).getInputs().size() == 1
+                                               && 
((VariableCPInstruction)last).getInput1().getName().equals(inst1.getInput2().getName()))
+                                               ret.remove(ret.size()-1);
+                                       //add fused mvvar instruction
                                        
ret.add(VariableCPInstruction.prepMoveInstruction(
                                                inst1.getInput1().getName(), 
inst1.getInput2().getName()));
                                }
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
index 3237a6c591..8bec222b0d 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/VariableCPInstruction.java
@@ -259,6 +259,10 @@ public class VariableCPInstruction extends CPInstruction 
implements LineageTrace
                return opcode == VariableOperationCode.RemoveVariable
                        || opcode == 
VariableOperationCode.RemoveVariableAndFile;
        }
+       
+       public boolean isMoveVariable() {
+               return opcode == VariableOperationCode.MoveVariable;
+       }
 
        public boolean isAssignVariable() {
                return opcode == VariableOperationCode.AssignVariable;

Reply via email to