src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java Fri Jul 7 09:29:24 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java Fri Jul 7 09:29:24 2017
*** 24,37 ****
--- 24,43 ----
package org.graalvm.compiler.core.amd64;
import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
import org.graalvm.compiler.core.common.LIRKind;
import org.graalvm.compiler.graph.NodeClass;
+ import org.graalvm.compiler.graph.spi.Simplifiable;
+ import org.graalvm.compiler.graph.spi.SimplifierTool;
import org.graalvm.compiler.lir.amd64.AMD64AddressValue;
import org.graalvm.compiler.lir.gen.LIRGeneratorTool;
import org.graalvm.compiler.nodeinfo.NodeInfo;
+ import org.graalvm.compiler.nodes.ConstantNode;
+ import org.graalvm.compiler.nodes.LoopBeginNode;
+ import org.graalvm.compiler.nodes.PhiNode;
import org.graalvm.compiler.nodes.ValueNode;
+ import org.graalvm.compiler.nodes.calc.AddNode;
import org.graalvm.compiler.nodes.memory.address.AddressNode;
import org.graalvm.compiler.nodes.spi.LIRLowerable;
import org.graalvm.compiler.nodes.spi.NodeLIRBuilderTool;
import jdk.vm.ci.meta.AllocatableValue;
*** 40,50 ****
--- 46,56 ----
/**
* Represents an address of the form [base + index*scale + displacement]. Both base and index are
* optional.
*/
@NodeInfo
! public class AMD64AddressNode extends AddressNode implements Simplifiable, LIRLowerable {
public static final NodeClass<AMD64AddressNode> TYPE = NodeClass.create(AMD64AddressNode.class);
@OptionalInput private ValueNode base;
*** 62,71 ****
--- 68,99 ----
this.base = base;
this.index = index;
this.scale = Scale.Times1;
}
+ public void canonicalizeIndex(SimplifierTool tool) {
+ if (index instanceof AddNode) {
+ AddNode add = (AddNode) index;
+ ValueNode valX = add.getX();
+ if (valX instanceof PhiNode) {
+ PhiNode phi = (PhiNode) valX;
+ if (phi.merge() instanceof LoopBeginNode) {
+ LoopBeginNode loopNode = (LoopBeginNode) phi.merge();
+ if (!loopNode.isSimpleLoop()) {
+ ValueNode valY = add.getY();
+ if (valY instanceof ConstantNode) {
+ int addBy = valY.asJavaConstant().asInt();
+ displacement = displacement + scale.value * addBy;
+ replaceFirstInput(index, phi);
+ tool.addToWorkList(index);
+ }
+ }
+ }
+ }
+ }
+ }
+
@Override
public void generate(NodeLIRBuilderTool gen) {
LIRGeneratorTool tool = gen.getLIRGeneratorTool();
AllocatableValue baseValue = base == null ? Value.ILLEGAL : tool.asAllocatable(gen.operand(base));
*** 133,138 ****
--- 161,171 ----
@Override
public long getMaxConstantDisplacement() {
return displacement;
}
+
+ @Override
+ public void simplify(SimplifierTool tool) {
+ canonicalizeIndex(tool);
+ }
}
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File