use of org.graalvm.compiler.nodes.calc.IntegerEqualsNode in project graal by oracle.
the class LoopEx method detectCounted.
public boolean detectCounted() {
LoopBeginNode loopBegin = loopBegin();
FixedNode next = loopBegin.next();
while (next instanceof FixedGuardNode || next instanceof ValueAnchorNode || next instanceof FullInfopointNode) {
next = ((FixedWithNextNode) next).next();
}
if (next instanceof IfNode) {
IfNode ifNode = (IfNode) next;
boolean negated = false;
if (!loopBegin.isLoopExit(ifNode.falseSuccessor())) {
if (!loopBegin.isLoopExit(ifNode.trueSuccessor())) {
return false;
}
negated = true;
}
LogicNode ifTest = ifNode.condition();
if (!(ifTest instanceof IntegerLessThanNode) && !(ifTest instanceof IntegerEqualsNode)) {
if (ifTest instanceof IntegerBelowNode) {
ifTest.getDebug().log("Ignored potential Counted loop at %s with |<|", loopBegin);
}
return false;
}
CompareNode lessThan = (CompareNode) ifTest;
Condition condition = null;
InductionVariable iv = null;
ValueNode limit = null;
if (isOutsideLoop(lessThan.getX())) {
iv = getInductionVariables().get(lessThan.getY());
if (iv != null) {
condition = lessThan.condition().asCondition().mirror();
limit = lessThan.getX();
}
} else if (isOutsideLoop(lessThan.getY())) {
iv = getInductionVariables().get(lessThan.getX());
if (iv != null) {
condition = lessThan.condition().asCondition();
limit = lessThan.getY();
}
}
if (condition == null) {
return false;
}
if (negated) {
condition = condition.negate();
}
boolean oneOff = false;
switch(condition) {
case EQ:
return false;
case NE:
{
if (!iv.isConstantStride() || Math.abs(iv.constantStride()) != 1) {
return false;
}
IntegerStamp initStamp = (IntegerStamp) iv.initNode().stamp(NodeView.DEFAULT);
IntegerStamp limitStamp = (IntegerStamp) limit.stamp(NodeView.DEFAULT);
if (iv.direction() == Direction.Up) {
if (initStamp.upperBound() > limitStamp.lowerBound()) {
return false;
}
} else if (iv.direction() == Direction.Down) {
if (initStamp.lowerBound() < limitStamp.upperBound()) {
return false;
}
} else {
return false;
}
break;
}
case LE:
oneOff = true;
if (iv.direction() != Direction.Up) {
return false;
}
break;
case LT:
if (iv.direction() != Direction.Up) {
return false;
}
break;
case GE:
oneOff = true;
if (iv.direction() != Direction.Down) {
return false;
}
break;
case GT:
if (iv.direction() != Direction.Down) {
return false;
}
break;
default:
throw GraalError.shouldNotReachHere();
}
counted = new CountedLoopInfo(this, iv, ifNode, limit, oneOff, negated ? ifNode.falseSuccessor() : ifNode.trueSuccessor());
return true;
}
return false;
}
use of org.graalvm.compiler.nodes.calc.IntegerEqualsNode in project graal by oracle.
the class DefaultJavaLoweringProvider method performBooleanCoercionIfNecessary.
private static ValueNode performBooleanCoercionIfNecessary(ValueNode readValue, JavaKind readKind) {
if (readKind == JavaKind.Boolean) {
StructuredGraph graph = readValue.graph();
IntegerEqualsNode eq = graph.addOrUnique(new IntegerEqualsNode(readValue, ConstantNode.forInt(0, graph)));
return graph.addOrUnique(new ConditionalNode(eq, ConstantNode.forBoolean(false, graph), ConstantNode.forBoolean(true, graph)));
}
return readValue;
}
use of org.graalvm.compiler.nodes.calc.IntegerEqualsNode in project graal by oracle.
the class VirtualFrameGetNode method virtualize.
@Override
public void virtualize(VirtualizerTool tool) {
ValueNode tagAlias = tool.getAlias(frame.virtualFrameTagArray);
ValueNode dataAlias = tool.getAlias(TruffleCompilerRuntime.getRuntime().getJavaKindForFrameSlotKind(accessTag) == JavaKind.Object ? frame.virtualFrameObjectArray : frame.virtualFramePrimitiveArray);
if (tagAlias instanceof VirtualObjectNode && dataAlias instanceof VirtualObjectNode) {
VirtualObjectNode tagVirtual = (VirtualObjectNode) tagAlias;
VirtualObjectNode dataVirtual = (VirtualObjectNode) dataAlias;
if (frameSlotIndex < tagVirtual.entryCount() && frameSlotIndex < dataVirtual.entryCount()) {
ValueNode actualTag = tool.getEntry(tagVirtual, frameSlotIndex);
if (!actualTag.isConstant() || actualTag.asJavaConstant().asInt() != accessTag) {
/*
* We cannot constant fold the tag-check immediately, so we need to create a
* guard comparing the actualTag with the accessTag.
*/
LogicNode comparison = new IntegerEqualsNode(actualTag, getConstant(accessTag));
tool.addNode(comparison);
tool.addNode(new FixedGuardNode(comparison, DeoptimizationReason.RuntimeConstraint, DeoptimizationAction.InvalidateRecompile));
}
ValueNode dataEntry = tool.getEntry(dataVirtual, frameSlotIndex);
if (dataEntry.getStackKind() == getStackKind()) {
tool.replaceWith(dataEntry);
return;
}
}
}
/*
* We could "virtualize" to a UnsafeLoadNode here that remains a memory access. However,
* that could prevent further escape analysis for parts of the method that actually matter.
* So we just deoptimize.
*/
insertDeoptimization(tool);
}
use of org.graalvm.compiler.nodes.calc.IntegerEqualsNode in project graal by oracle.
the class VirtualFrameIsNode method virtualize.
@Override
public void virtualize(VirtualizerTool tool) {
ValueNode tagAlias = tool.getAlias(frame.virtualFrameTagArray);
if (tagAlias instanceof VirtualObjectNode) {
VirtualObjectNode tagVirtual = (VirtualObjectNode) tagAlias;
if (frameSlotIndex < tagVirtual.entryCount()) {
ValueNode actualTag = tool.getEntry(tagVirtual, frameSlotIndex);
if (actualTag.isConstant()) {
tool.replaceWith(getConstant(actualTag.asJavaConstant().asInt() == accessTag ? 1 : 0));
} else {
LogicNode comparison = new IntegerEqualsNode(actualTag, getConstant(accessTag));
tool.addNode(comparison);
ConditionalNode result = new ConditionalNode(comparison, getConstant(1), getConstant(0));
tool.addNode(result);
tool.replaceWith(result);
}
return;
}
}
/*
* We could "virtualize" to a UnsafeLoadNode here that remains a memory access. But it is
* simpler, and consistent with the get and set intrinsification, to deoptimize.
*/
insertDeoptimization(tool);
}
use of org.graalvm.compiler.nodes.calc.IntegerEqualsNode in project graal by oracle.
the class BytecodeParser method extractInjectedProbability.
private static double extractInjectedProbability(IntegerEqualsNode condition) {
// Propagate injected branch probability if any.
IntegerEqualsNode equalsNode = condition;
BranchProbabilityNode probabilityNode = null;
ValueNode other = null;
if (equalsNode.getX() instanceof BranchProbabilityNode) {
probabilityNode = (BranchProbabilityNode) equalsNode.getX();
other = equalsNode.getY();
} else if (equalsNode.getY() instanceof BranchProbabilityNode) {
probabilityNode = (BranchProbabilityNode) equalsNode.getY();
other = equalsNode.getX();
}
if (probabilityNode != null && probabilityNode.getProbability().isConstant() && other != null && other.isConstant()) {
double probabilityValue = probabilityNode.getProbability().asJavaConstant().asDouble();
return other.asJavaConstant().asInt() == 0 ? 1.0 - probabilityValue : probabilityValue;
}
return -1;
}
Aggregations