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"