diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java index 39146e8235b4014f1139a75ad00cb489a2347732..a399f0e625e00c5f72ed174125f29e7570f79e92 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/APerm.java @@ -109,6 +109,7 @@ public abstract class APerm extends RBuiltinNode.Arg3 { @Specialization protected RAbstractVector aPerm(RAbstractVector vector, RAbstractIntVector permVector, byte resize, + @Cached("createBinaryProfile()") ConditionProfile isIdentityProfile, @Cached("create()") GetDimAttributeNode getDimsNode, @Cached("create()") SetDimAttributeNode setDimsNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode) { @@ -116,6 +117,9 @@ public abstract class APerm extends RBuiltinNode.Arg3 { int[] dim = getDimsNode.getDimensions(vector); checkErrorConditions(dim); int[] perm = getPermute(dim, permVector); + if (isIdentityProfile.profile(isIdentityPermutation(dim.length, perm))) { + return vector; + } int[] posV = new int[dim.length]; int[] pDim = applyPermute(dim, perm, false); @@ -153,8 +157,18 @@ public abstract class APerm extends RBuiltinNode.Arg3 { return result; } + private static boolean isIdentityPermutation(int dimLength, int[] perm) { + for (int i = 0; i < dimLength; i++) { + if (i != perm[i]) { + return false; + } + } + return true; + } + @Specialization protected RAbstractVector aPerm(RAbstractVector vector, RAbstractStringVector permVector, byte resize, + @Cached("createBinaryProfile()") ConditionProfile isIdentityProfile, @Cached("create()") GetDimAttributeNode getDimsNode, @Cached("create()") SetDimAttributeNode setDimsNode, @Cached("create()") GetDimNamesAttributeNode getDimNamesNode) { @@ -176,7 +190,7 @@ public abstract class APerm extends RBuiltinNode.Arg3 { } // Note: if this turns out to be slow, we can cache the permutation - return aPerm(vector, RDataFactory.createIntVector(perm, true), resize, getDimsNode, setDimsNode, getDimNamesNode); + return aPerm(vector, RDataFactory.createIntVector(perm, true), resize, isIdentityProfile, getDimsNode, setDimsNode, getDimNamesNode); } private static int[] getReverse(int[] dim) {