blob: 2384ad832cacc84b8dd9883957db919c57607277 [file] [log] [blame]
/*
* Copyright (c) 2012, 2012, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package org.graalvm.compiler.loop;
import org.graalvm.compiler.core.common.type.Stamp;
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.ValueNode;
/**
* This class describes a value node that is an induction variable in a counted loop.
*/
public abstract class InductionVariable {
public enum Direction {
Up,
Down;
public Direction opposite() {
switch (this) {
case Up:
return Down;
case Down:
return Up;
default:
throw GraalError.shouldNotReachHere();
}
}
}
public abstract StructuredGraph graph();
protected final LoopEx loop;
public InductionVariable(LoopEx loop) {
this.loop = loop;
}
public LoopEx getLoop() {
return loop;
}
public abstract Direction direction();
/**
* Returns the value node that is described by this induction variable.
*/
public abstract ValueNode valueNode();
/**
* Returns the node that gives the initial value of this induction variable.
*/
public abstract ValueNode initNode();
/**
* Returns the stride of the induction variable. The stride is the value that is added to the
* induction variable at each iteration.
*/
public abstract ValueNode strideNode();
public abstract boolean isConstantInit();
public abstract boolean isConstantStride();
public abstract long constantInit();
public abstract long constantStride();
/**
* Returns the extremum value of the induction variable. The extremum value is the value of the
* induction variable in the loop body of the last iteration, only taking into account the main
* loop limit test. It's possible for the loop to exit before this value if
* {@link CountedLoopInfo#isExactTripCount()} returns false for the containing loop.
*/
public ValueNode extremumNode() {
return extremumNode(false, valueNode().stamp());
}
public abstract ValueNode extremumNode(boolean assumePositiveTripCount, Stamp stamp);
public abstract boolean isConstantExtremum();
public abstract long constantExtremum();
/**
* Returns the exit value of the induction variable. The exit value is the value of the
* induction variable at the loop exit.
*/
public abstract ValueNode exitValueNode();
/**
* Deletes any nodes created within the scope of this object that have no usages.
*/
public abstract void deleteUnusedNodes();
}