From 64c37d61e11cb4a94643d74508a1762189d40c06 Mon Sep 17 00:00:00 2001 From: Lukas Stadler <lukas.stadler@oracle.com> Date: Wed, 4 Jan 2017 10:46:29 +0100 Subject: [PATCH] additional profiles in vector extract nodes --- .../r/nodes/access/vector/CachedExtractVectorNode.java | 2 +- .../r/nodes/access/vector/PositionCheckNode.java | 10 ++++++++++ .../access/vector/PositionCheckSubscriptNode.java | 4 +--- .../r/nodes/access/vector/PositionsCheckNode.java | 4 ++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java index 589acd316b..eb2f361dad 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedExtractVectorNode.java @@ -330,7 +330,7 @@ final class CachedExtractVectorNode extends CachedVectorNode { Object result; if (dataAt == RNull.instance) { result = RNull.instance; - } else if (positions[i] instanceof RAbstractContainer && ((RAbstractContainer) positions[i]).getLength() == 0) { + } else if (positionsCheckNode.isEmptyPosition(i, positions[i])) { result = RNull.instance; } else { result = extract(i, (RAbstractStringVector) dataAt, positions[i], positionProfile[i]); diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java index 9dffa7e511..952e52fa77 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckNode.java @@ -37,6 +37,7 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.REmpty; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.RTypedValue; import com.oracle.truffle.r.runtime.data.model.RAbstractContainer; @@ -52,6 +53,7 @@ abstract class PositionCheckNode extends Node { protected final int numDimensions; private final VectorLengthProfile positionLengthProfile = VectorLengthProfile.create(); private final ConditionProfile nullDimensionsProfile = ConditionProfile.createBinaryProfile(); + private final ValueProfile positionClassProfile = ValueProfile.createClassProfile(); protected final BranchProfile error = BranchProfile.create(); protected final boolean replace; protected final RType containerType; @@ -277,4 +279,12 @@ abstract class PositionCheckNode extends Node { } + public boolean isEmptyPosition(Object position) { + if (positionClass == REmpty.class) { + return false; + } + Object castPosition = positionClassProfile.profile(position); + return castPosition instanceof RAbstractContainer && ((RAbstractContainer) castPosition).getLength() == 0; + } + } diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java index bc43a33bc3..f59b3838d7 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionCheckSubscriptNode.java @@ -100,9 +100,7 @@ abstract class PositionCheckSubscriptNode extends PositionCheckNode { } assert positionLength == 1; positionNACheck.enable(position); - RAbstractVector result = doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode); - return result; - + return doIntegerImpl(profile, dimSize, position.getDataAt(0), position, getNamesNode); } private RAbstractVector doIntegerImpl(PositionProfile profile, int dimSize, int value, RAbstractVector originalVector, GetNamesAttributeNode getNamesNode) { diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java index 3ab96e71be..38d0127dda 100644 --- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java +++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/PositionsCheckNode.java @@ -194,4 +194,8 @@ final class PositionsCheckNode extends Node { boolean containsNA; } + + public boolean isEmptyPosition(int i, Object position) { + return positionsCheck[i].isEmptyPosition(position); + } } -- GitLab