Author: luc
Date: Mon Oct  8 17:13:23 2012
New Revision: 1395676

URL: http://svn.apache.org/viewvc?rev=1395676&view=rev
Log:
Updated bytecode trimmers to the new DerivativeStructure patterns.

Added:
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
   (with props)
Removed:
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/DLoadPop2Trimmer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDstoreTrimmer.java
Modified:
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/BytecodeTrimmer.java
    
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDloadTrimmer.java

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java?rev=1395676&r1=1395675&r2=1395676&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.java
 Mon Oct  8 17:13:23 2012
@@ -42,14 +42,13 @@ import org.apache.commons.nabla.forward.
 import org.apache.commons.nabla.forward.instructions.Dup2X1Transformer;
 import org.apache.commons.nabla.forward.instructions.Dup2X2Transformer;
 import org.apache.commons.nabla.forward.instructions.GetTransformer;
-import org.apache.commons.nabla.forward.instructions.InvokeNonMathTransformer;
 import org.apache.commons.nabla.forward.instructions.InvokeMathTransformer;
+import org.apache.commons.nabla.forward.instructions.InvokeNonMathTransformer;
 import org.apache.commons.nabla.forward.instructions.NarrowingTransformer;
 import org.apache.commons.nabla.forward.instructions.Pop2Transformer;
 import org.apache.commons.nabla.forward.instructions.WideningTransformer;
-import org.apache.commons.nabla.forward.trimming.DLoadPop2Trimmer;
 import org.apache.commons.nabla.forward.trimming.SwappedDloadTrimmer;
-import org.apache.commons.nabla.forward.trimming.SwappedDstoreTrimmer;
+import org.apache.commons.nabla.forward.trimming.SwappedLDCTrimmer;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
 import org.objectweb.asm.tree.AbstractInsnNode;
@@ -160,8 +159,7 @@ public class MethodDifferentiator {
 
             // trim generated instructions list
             new SwappedDloadTrimmer().trim(method.instructions);
-            new SwappedDstoreTrimmer().trim(method.instructions);
-            new DLoadPop2Trimmer().trim(method.instructions);
+            new SwappedLDCTrimmer().trim(method.instructions);
 
             // mark the local variables that are used
             markUsedLocalVariables(method.instructions, usedLocals);

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/BytecodeTrimmer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/BytecodeTrimmer.java?rev=1395676&r1=1395675&r2=1395676&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/BytecodeTrimmer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/BytecodeTrimmer.java
 Mon Oct  8 17:13:23 2012
@@ -24,14 +24,14 @@ import org.objectweb.asm.tree.InsnList;
  */
 public abstract class BytecodeTrimmer {
 
-    /** Current instructions window. */
-    private AbstractInsnNode[] currentWindow;
+    /** Number of instructions to look at. */
+    private final int lookahead;
 
     /** Simple constructor.
      * @param lookahead number of lookahead instructions
      */
     protected BytecodeTrimmer(final int lookahead) {
-        currentWindow = new AbstractInsnNode[lookahead];
+        this.lookahead = lookahead;
     }
 
     /** Trim a list of instructions.
@@ -40,38 +40,42 @@ public abstract class BytecodeTrimmer {
     public void trim(final InsnList instructions) {
 
         // set up lookahead instructions
-        currentWindow[0] = instructions.get(0);
-        for (int i = 1; (i < currentWindow.length) && (currentWindow[i - 1] != 
null); ++i) {
-            currentWindow[i] = currentWindow[i - 1].getNext();
-        }
+        AbstractInsnNode insn = instructions.get(0);
 
         // trim the whole instructions set using a sliding window
-        while (currentWindow[currentWindow.length - 1] != null) {
-
-            // trim current window
-            final boolean updated = trimWindow(instructions, currentWindow);
+        while (hasEnoughInstructions(insn)) {
 
-            if (!updated) {
-                // slide the window ourselves one instruction forward
-                for (int i = 1; i < currentWindow.length; ++i) {
-                    currentWindow[i - 1] = currentWindow[i];
-                }
-                if (currentWindow[currentWindow.length - 1] != null) {
-                    currentWindow[currentWindow.length - 1] = 
currentWindow[currentWindow.length - 1].getNext();
-                }
-            }
+            // trim current instructions window
+            insn = trimWindow(instructions, insn);
 
         }
 
     }
 
+    /** Check if there are enough instructions to look at.
+     * @param insn first instruction to look at (may be null)
+     * @return true if there are enough instructions to look at
+     */
+    private boolean hasEnoughInstructions(AbstractInsnNode insn) {
+        for (int i = 0; i < lookahead; ++i) {
+            if (insn == null) {
+                return false;
+            }
+            insn = insn.getNext();
+        }
+        return true;
+    }
+
     /** Trim the current window of lookahead instructions.
+     * <p>
+     * When this method is called, it is already known that the list contains
+     * at least the required number of lookahead instructions, counting the
+     * first one. 
+     * </p>
      * @param instructions complete instructions list of instructions to trim
-     * @param window current instructions window (belongs to the list)
-     * @return true if instructions and window have been updated and are ready
-     * for next iteration
+     * @param insn0 start instruction of the lookahead window (belongs to the 
list)
+     * @return next instruction to check
      */
-    protected abstract boolean trimWindow(InsnList instructions,
-                                          AbstractInsnNode[] window);
+    protected abstract AbstractInsnNode trimWindow(InsnList instructions, 
AbstractInsnNode insn0);
 
 }

Modified: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDloadTrimmer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDloadTrimmer.java?rev=1395676&r1=1395675&r2=1395676&view=diff
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDloadTrimmer.java
 (original)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedDloadTrimmer.java
 Mon Oct  8 17:13:23 2012
@@ -21,7 +21,7 @@ import org.objectweb.asm.tree.AbstractIn
 import org.objectweb.asm.tree.InsnList;
 import org.objectweb.asm.tree.VarInsnNode;
 
-/** Trimmer replacing (DLOAD i, DLOAD j, DUP2_X2, POP2) with (DLOAD j, DLOAD 
i).
+/** Trimmer replacing (DLOAD i, ALOAD j, DUP_X2, POP) with (ALOAD j, DLOAD i).
  * @version $Id$
  */
 public class SwappedDloadTrimmer extends BytecodeTrimmer {
@@ -34,32 +34,34 @@ public class SwappedDloadTrimmer extends
 
     /** {@inheritDoc} */
     @Override
-    protected boolean trimWindow(final InsnList instructions,
-                                 final AbstractInsnNode[] window) {
+    protected AbstractInsnNode trimWindow(final InsnList instructions, final 
AbstractInsnNode insn0) {
 
-        if ((window[0].getOpcode() == Opcodes.DLOAD) &&
-            (window[1].getOpcode() == Opcodes.DLOAD) &&
-            (window[2].getOpcode() == Opcodes.DUP2_X2) &&
-            (window[3].getOpcode() == Opcodes.POP2)) {
-
-            // reverse the DLOAD orders
-            final int tmp = ((VarInsnNode) window[0]).var;
-            ((VarInsnNode) window[0]).var = ((VarInsnNode) window[1]).var;
-            ((VarInsnNode) window[1]).var = tmp;
-
-            // remove the operand stack swap instructions
-            instructions.remove(window[2]);
-            instructions.remove(window[3]);
-
-            // slide window two instructions forward
-            window[2] = window[1].getNext();
-            window[3] = (window[2] == null) ? null : window[2].getNext();
-            return true;
+        final AbstractInsnNode insn1 = insn0.getNext();
+        final AbstractInsnNode insn2 = insn1.getNext();
+        final AbstractInsnNode insn3 = insn2.getNext();
+        if ((insn0.getOpcode() == Opcodes.DLOAD) &&
+            (insn1.getOpcode() == Opcodes.ALOAD) &&
+            (insn2.getOpcode() == Opcodes.DUP_X2) &&
+            (insn3.getOpcode() == Opcodes.POP)) {
+
+            // add a new DLOAD instruction after the ALOAD
+            final VarInsnNode newDload = new VarInsnNode(Opcodes.DLOAD, 
((VarInsnNode) insn0).var);
+            instructions.insert(insn1, newDload);
+
+            // remove the original DLOAD instruction
+            instructions.remove(insn0);
+
+            // remove the stack swap instructions
+            instructions.remove(insn2);
+            instructions.remove(insn3);
+
+            // prepare next window
+            return newDload.getNext();
 
         }
 
-        // nothing have been done
-        return false;
+        // nothing has been done
+        return insn1;
 
     }
 

Added: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java?rev=1395676&view=auto
==============================================================================
--- 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
 (added)
+++ 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
 Mon Oct  8 17:13:23 2012
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.nabla.forward.trimming;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.LdcInsnNode;
+
+/** Trimmer replacing (LDC double, ALOAD i, DUP_X2, POP) with (ALOAD i, LDC 
double).
+ * @version $Id$
+ */
+public class SwappedLDCTrimmer extends BytecodeTrimmer {
+
+    /** Simple constructor.
+     */
+    public SwappedLDCTrimmer() {
+        super(4);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    protected AbstractInsnNode trimWindow(final InsnList instructions, final 
AbstractInsnNode insn0) {
+
+        final AbstractInsnNode insn1 = insn0.getNext();
+        final AbstractInsnNode insn2 = insn1.getNext();
+        final AbstractInsnNode insn3 = insn2.getNext();
+        if ((insn0.getOpcode() == Opcodes.LDC) &&
+            (insn1.getOpcode() == Opcodes.ALOAD) &&
+            (insn2.getOpcode() == Opcodes.DUP_X2) &&
+            (insn3.getOpcode() == Opcodes.POP)) {
+
+            final Object constant = ((LdcInsnNode) insn0).cst;
+            if (constant instanceof Double) {
+
+                // add a new LDC instruction after the ALOAD
+                final LdcInsnNode newLDC = new LdcInsnNode(constant);
+                instructions.insert(insn1, newLDC);
+
+                // remove the original LDC instruction
+                instructions.remove(insn0);
+
+                // remove the stack swap instructions
+                instructions.remove(insn2);
+                instructions.remove(insn3);
+
+                // prepare next window
+                return newLDC.getNext();
+
+            }
+
+        }
+
+        // nothing has been done
+        return insn1;
+
+    }
+
+}

Propchange: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/trimming/SwappedLDCTrimmer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"


Reply via email to