You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2012/09/28 21:12:36 UTC
svn commit: r1391604 - in
/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward:
analysis/ instructions/
Author: luc
Date: Fri Sep 28 19:12:36 2012
New Revision: 1391604
URL: http://svn.apache.org/viewvc?rev=1391604&view=rev
Log:
Updated DCMPx bytecode transformation.
Added:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java (with props)
Removed:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer1.java
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer12.java
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer2.java
Modified:
commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/analysis/MethodDifferentiator.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=1391604&r1=1391603&r2=1391604&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 Fri Sep 28 19:12:36 2012
@@ -17,7 +17,6 @@
package org.apache.commons.nabla.forward.analysis;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
@@ -38,9 +37,7 @@ import org.apache.commons.nabla.forward.
import org.apache.commons.nabla.forward.instructions.DLoadTransformer;
import org.apache.commons.nabla.forward.instructions.DReturnTransformer;
import org.apache.commons.nabla.forward.instructions.DStoreTransformer;
-import org.apache.commons.nabla.forward.instructions.DcmpTransformer1;
-import org.apache.commons.nabla.forward.instructions.DcmpTransformer12;
-import org.apache.commons.nabla.forward.instructions.DcmpTransformer2;
+import org.apache.commons.nabla.forward.instructions.DcmpTransformer;
import org.apache.commons.nabla.forward.instructions.Dup2Transformer;
import org.apache.commons.nabla.forward.instructions.Dup2X1Transformer;
import org.apache.commons.nabla.forward.instructions.Dup2X2Transformer;
@@ -58,7 +55,6 @@ import org.objectweb.asm.tree.FieldInsnN
import org.objectweb.asm.tree.IincInsnNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
-import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
@@ -95,9 +91,6 @@ public class MethodDifferentiator {
/** Instructions successors array. */
private final Map<AbstractInsnNode, Set<AbstractInsnNode>> successors;
- /** Cloned labels map. */
- private final Map<LabelNode, LabelNode> clonedLabels;
-
/** Build a differentiator for a method.
* @param mathClasses math implementation classes
* @param name name of the derived class
@@ -109,7 +102,6 @@ public class MethodDifferentiator {
this.converted = new HashSet<TrackingValue>();
this.frames = new IdentityHashMap<AbstractInsnNode, Frame<TrackingValue>>();
this.successors = new IdentityHashMap<AbstractInsnNode, Set<AbstractInsnNode>>();
- this.clonedLabels = new HashMap<LabelNode, LabelNode>();
}
/** Get the index of the input {@link DerivativeStructure derivative structure} variable.
@@ -443,13 +435,7 @@ public class MethodDifferentiator {
return new NarrowingTransformer().getReplacement(insn, this);
case Opcodes.DCMPL :
case Opcodes.DCMPG :
- if (stack1Converted) {
- if (stack0Converted) {
- return new DcmpTransformer12().getReplacement(insn, this);
- }
- return new DcmpTransformer1().getReplacement(insn, this);
- }
- return new DcmpTransformer2().getReplacement(insn, this);
+ return new DcmpTransformer(stack0Converted, stack1Converted).getReplacement(insn, this);
case Opcodes.DRETURN :
// TODO the constructor parameter forced to true seems strange...
return new DReturnTransformer(true).getReplacement(insn, this);
@@ -683,14 +669,6 @@ public class MethodDifferentiator {
return max;
}
- /** Clone an instruction.
- * @param insn instruction to clone
- * @return cloned instruction
- */
- public AbstractInsnNode clone(final AbstractInsnNode insn) {
- return insn.clone(clonedLabels);
- }
-
/** Analyzer preserving instructions successors information. */
private class FlowAnalyzer extends Analyzer<TrackingValue> {
Added: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java?rev=1391604&view=auto
==============================================================================
--- commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java (added)
+++ commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java Fri Sep 28 19:12:36 2012
@@ -0,0 +1,89 @@
+/*
+ * 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.instructions;
+
+import org.apache.commons.nabla.DifferentiationException;
+import org.apache.commons.nabla.forward.analysis.InstructionsTransformer;
+import org.apache.commons.nabla.forward.analysis.MethodDifferentiator;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+
+/** Differentiation transformer for DCMPx instructions.
+ */
+public class DcmpTransformer implements InstructionsTransformer {
+
+ /** Indicator for top stack element conversion. */
+ private final boolean stack0Converted;
+
+ /** Indicator for next to top stack element conversion. */
+ private final boolean stack1Converted;
+
+ /** Simple constructor.
+ * @param stack0Converted if true, the top level stack element has already been converted
+ * @param stack1Converted if true, the next to top level stack element has already been converted
+ */
+ public DcmpTransformer(final boolean stack0Converted, final boolean stack1Converted) {
+ this.stack0Converted = stack0Converted;
+ this.stack1Converted = stack1Converted;
+ }
+
+ /** {@inheritDoc} */
+ public InsnList getReplacement(final AbstractInsnNode insn,
+ final MethodDifferentiator methodDifferentiator)
+ throws DifferentiationException {
+ final InsnList list = new InsnList();
+
+ if (stack1Converted) {
+ if (stack0Converted) {
+ // operand stack initial state: ds_a, ds_b
+ list.add(new InsnNode(Opcodes.SWAP)); // => ds_b, ds_a
+ list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
+ "getValue",
+ Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => ds_b, a0
+ list.add(new InsnNode(Opcodes.DUP2_X2)); // => a0, ds_b, a0
+ list.add(new InsnNode(Opcodes.POP2)); // => a0, ds_b
+ list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
+ "getValue",
+ Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => a0, b0
+ } else {
+ // operand stack initial state: ds_a, b0
+ list.add(new InsnNode(Opcodes.DUP2_X2)); // => b0, ds_a, b0
+ list.add(new InsnNode(Opcodes.POP2)); // => b0, ds_a
+ list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
+ "getValue",
+ Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => b0, a0
+ list.add(new InsnNode(Opcodes.DUP2_X2)); // => a0, b0, a0
+ list.add(new InsnNode(Opcodes.POP2)); // => a0, b0
+ }
+ } else {
+ // operand stack initial state: a, ds_b
+ list.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, DS_TYPE.getInternalName(),
+ "getValue",
+ Type.getMethodDescriptor(Type.DOUBLE_TYPE))); // => a0, b0
+ }
+
+ list.add(new InsnNode(insn.getOpcode())); // => bool
+
+ return list;
+
+ }
+
+}
Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/sandbox/nabla/trunk/src/main/java/org/apache/commons/nabla/forward/instructions/DcmpTransformer.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"