From 814e241cb0a28a859aea9ff95706c6c662d8160b Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Mon, 21 Aug 2017 15:26:11 +0200
Subject: [PATCH] Removed unnecessary allocations in builtin 'aperm'.

---
 .../truffle/r/nodes/builtin/base/APerm.java   | 20 +++++++------------
 1 file changed, 7 insertions(+), 13 deletions(-)

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 0b7bea50bf..0938a7bde6 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
@@ -18,7 +18,6 @@ import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue;
 import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
 import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL;
 
-import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
 import com.oracle.truffle.api.dsl.Cached;
 import com.oracle.truffle.api.dsl.Specialization;
 import com.oracle.truffle.api.profiles.BranchProfile;
@@ -129,7 +128,7 @@ public abstract class APerm extends RBuiltinNode.Arg3 {
         for (int i = 0; i < result.getLength(); i++) {
             int pos = toPos(applyPermute(posV, perm, true), dim);
             result.transferElementSameType(i, vector, pos);
-            posV = incArray(posV, pDim);
+            incArray(posV, pDim);
         }
 
         RList dimNames = getDimNamesNode.getDimNames(vector);
@@ -219,7 +218,6 @@ public abstract class APerm extends RBuiltinNode.Arg3 {
     /**
      * Apply permute to an equal sized array.
      */
-    @TruffleBoundary
     private static int[] applyPermute(int[] a, int[] perm, boolean reverse) {
         int[] newA = a.clone();
         if (reverse) {
@@ -235,25 +233,21 @@ public abstract class APerm extends RBuiltinNode.Arg3 {
     }
 
     /**
-     * Increment a stride array.
+     * Increment a stride array. Note: First input array may be modified.
      */
-    @TruffleBoundary
-    private static int[] incArray(int[] a, int[] dim) {
-        int[] newA = a.clone();
-        for (int i = 0; i < newA.length; i++) {
-            newA[i]++;
-            if (newA[i] < dim[i]) {
+    private static void incArray(int[] a, int[] dim) {
+        for (int i = 0; i < a.length; i++) {
+            a[i]++;
+            if (a[i] < dim[i]) {
                 break;
             }
-            newA[i] = 0;
+            a[i] = 0;
         }
-        return newA;
     }
 
     /**
      * Stride array to a linear position.
      */
-    @TruffleBoundary
     private static int toPos(int[] a, int[] dim) {
         int pos = a[0];
         for (int i = 1; i < a.length; i++) {
-- 
GitLab