From 2bd70a58eed01f5fe88e01bc2bec83d96ea1b746 Mon Sep 17 00:00:00 2001
From: Florian Angerer <florian.angerer@oracle.com>
Date: Wed, 23 Aug 2017 18:04:57 +0200
Subject: [PATCH] Added tests for in-place transposition of non-square
 matrices.

---
 .../vector/CachedReplaceVectorNode.java       |  2 +-
 .../truffle/r/nodes/binary/CastTypeNode.java  | 13 +++--
 .../r/nodes/unary/CastIntegerNode.java        |  6 +--
 .../truffle/r/test/ExpectedTestOutput.test    | 48 +++++++++++++++++++
 .../r/test/builtins/TestBuiltin_t.java        | 11 +++++
 5 files changed, 72 insertions(+), 8 deletions(-)

diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
index a81e194adf..71a7e7c718 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/access/vector/CachedReplaceVectorNode.java
@@ -352,7 +352,7 @@ final class CachedReplaceVectorNode extends CachedVectorNode {
         if (castType == RType.List) {
             return CastListNodeGen.create(true, false, true);
         } else {
-            return CastTypeNode.createCast(castType, true, true, true);
+            return CastTypeNode.createCast(castType, true, true, true, false);
         }
     }
 
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
index 65e0a251a6..144f971527 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/binary/CastTypeNode.java
@@ -63,7 +63,12 @@ public abstract class CastTypeNode extends RBaseNode {
 
     @TruffleBoundary
     public static CastNode createCast(RType type) {
-        return createCast(type, false, false, false);
+        return createCast(type, false, false, false, false);
+    }
+
+    @TruffleBoundary
+    public static CastNode createCast(RType type, boolean reuseNonShared) {
+        return createCast(type, false, false, false, reuseNonShared);
     }
 
     public static CastTypeNode create() {
@@ -71,16 +76,16 @@ public abstract class CastTypeNode extends RBaseNode {
     }
 
     @TruffleBoundary
-    public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes) {
+    public static CastNode createCast(RType type, boolean preserveNames, boolean preserveDimensions, boolean preserveAttributes, boolean reuseNonShared) {
         switch (type) {
             case Character:
                 return CastStringNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Complex:
                 return CastComplexNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Double:
-                return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
+                return CastDoubleNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared);
             case Integer:
-                return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
+                return CastIntegerNodeGen.create(preserveNames, preserveDimensions, preserveAttributes, false, reuseNonShared);
             case Logical:
                 return CastLogicalNodeGen.create(preserveNames, preserveDimensions, preserveAttributes);
             case Raw:
diff --git a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
index 997193d66f..f455f26773 100644
--- a/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
+++ b/com.oracle.truffle.r.nodes/src/com/oracle/truffle/r/nodes/unary/CastIntegerNode.java
@@ -175,17 +175,17 @@ public abstract class CastIntegerNode extends CastIntegerBaseNode {
         return (RAbstractIntVector) castWithReuse(RType.Integer, operand, naProfile.getConditionProfile());
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     public RIntVector doLogicalVector(RAbstractLogicalVector operand) {
         return createResultVector(operand, index -> naCheck.convertLogicalToInt(operand.getDataAt(index)));
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     protected RIntVector doDoubleVector(RAbstractDoubleVector operand) {
         return createResultVector(operand, index -> naCheck.convertDoubleToInt(operand.getDataAt(index)));
     }
 
-    @Specialization
+    @Specialization(guards = "!isReusable(operand)")
     protected RIntVector doRawVector(RAbstractRawVector operand) {
         return createResultVector(operand, index -> RRuntime.raw2int(operand.getDataAt(index)));
     }
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
index 933cf6864b..7378e3a895 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test
@@ -69567,6 +69567,54 @@ Error in t.default(new.env()) : argument is not a matrix
 b 1
 c 2
 
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(1:8, 2, 4) ; t(m) }
+     [,1] [,2]
+[1,]    1    2
+[2,]    3    4
+[3,]    5    6
+[4,]    7    8
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }
+     [,1] [,2]
+[1,]   01   02
+[2,]   03   04
+[3,]   05   06
+[4,]   07   08
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }
+     [,1] [,2]
+[1,] "1"  "2"
+[2,] "3"  "4"
+[3,] "5"  "6"
+[4,] "7"  "8"
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }
+      [,1]  [,2]
+[1,]  TRUE FALSE
+[2,] FALSE FALSE
+[3,]  TRUE FALSE
+[4,] FALSE  TRUE
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }
+     [,1] [,2]
+[1,] 1    2
+[2,] 3    4
+[3,] 5    6
+[4,] 7    8
+
+##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeNotSquare#
+#{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }
+     [,1] [,2]
+[1,]  0.1  0.2
+[2,]  0.3  0.4
+[3,]  0.5  0.6
+[4,]  0.7  0.8
+
 ##com.oracle.truffle.r.test.builtins.TestBuiltin_t.testTransposeSquare#
 #{ m <- matrix(1:64, 8, 8) ; sum(m * t(m)) }
 [1] 72976
diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
index d1708c7290..2ab45b0034 100644
--- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
+++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_t.java
@@ -59,4 +59,15 @@ public class TestBuiltin_t extends TestBase {
         assertEval("{ m <- matrix(as.raw(c(1,2,3,4)), 2, 2); t(m) }");
         assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4), 2, 2); t(m) }");
     }
+
+    @Test
+    public void testTransposeNotSquare() {
+        // test square matrices
+        assertEval("{ m <- matrix(1:8, 2, 4) ; t(m) }");
+        assertEval("{ m <- matrix(seq(0.1,0.8,0.1), 2, 4) ; t(m) }");
+        assertEval("{ m <- matrix(c(T, F, F, F, T, F, F, T), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(c('1', '2', '3', '4', '5', '6', '7', '8'), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(as.raw(c(1:8)), 2, 4); t(m) }");
+        assertEval("{ m <- matrix(list(a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8), 2, 4); t(m) }");
+    }
 }
-- 
GitLab