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 hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.amd64/src/org/graalvm/compiler/core/amd64/AMD64AddressNode.java

Print this page

        

*** 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 **** /** * Represents an address of the form [base + index*scale + displacement]. Both base and index are * optional. */ @NodeInfo ! public class AMD64AddressNode extends AddressNode implements LIRLowerable { public static final NodeClass<AMD64AddressNode> TYPE = NodeClass.create(AMD64AddressNode.class); @OptionalInput private ValueNode base; --- 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