diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java index 3eacbc3f2fd3de7313d834e896d12dc48e8348a7..696112bcf6a7e4f48a7b76c40d5ab097bab7ae0b 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IsMethodsDispatchOn.java @@ -22,10 +22,11 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.r.nodes.builtin.*; -import com.oracle.truffle.r.runtime.*; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RBuiltinKind; +import com.oracle.truffle.r.runtime.RRuntime; @RBuiltin(name = ".isMethodsDispatchOn", kind = RBuiltinKind.PRIMITIVE, parameterNames = {}) public abstract class IsMethodsDispatchOn extends RBuiltinNode { @@ -33,7 +34,6 @@ public abstract class IsMethodsDispatchOn extends RBuiltinNode { private static boolean on; @Specialization - @TruffleBoundary protected byte doIsMethodsDispatchOn() { controlVisibility(); return RRuntime.asLogical(on); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Setwd.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Setwd.java index 1c964cf1ca80455189144a66737e119e3392eeb0..7bd1b49680cf1f46fea3bc5963fdefcd11b71cb8 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Setwd.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Setwd.java @@ -22,34 +22,32 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.api.utilities.*; +import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; + +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.builtin.RInvisibleBuiltinNode; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.model.*; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.Utils; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.ffi.RFFIFactory; -import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; - @RBuiltin(name = "setwd", kind = INTERNAL, parameterNames = "path") public abstract class Setwd extends RInvisibleBuiltinNode { - private final BranchProfile errorProfile = BranchProfile.create(); - @Specialization @TruffleBoundary protected Object setwd(RAbstractStringVector path) { controlVisibility(); if (path.getLength() == 0) { - errorProfile.enter(); throw RError.error(this, RError.Message.CHAR_ARGUMENT); } String owd = RFFIFactory.getRFFI().getBaseRFFI().getwd(); String nwd = Utils.tildeExpand(path.getDataAt(0)); int rc = RFFIFactory.getRFFI().getBaseRFFI().setwd(nwd); if (rc != 0) { - errorProfile.enter(); throw RError.error(this, RError.Message.CANNOT_CHANGE_DIRECTORY); } else { String nwdAbs = RFFIFactory.getRFFI().getBaseRFFI().getwd(); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sprintf.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sprintf.java index 047fb8b7963c9a3ae42c6c24769f9189c1db3ec7..eba2fea85eb2f7bfc8777584648b9e59668ab358 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sprintf.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Sprintf.java @@ -44,7 +44,6 @@ public abstract class Sprintf extends RBuiltinNode { @Child private Sprintf sprintfRecursive; @Specialization - @TruffleBoundary protected String sprintf(String fmt, @SuppressWarnings("unused") RMissing x) { controlVisibility(); return fmt; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substr.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substr.java index ff7debd90ed2733669e3c0357e88c900f38f529a..12201a59c6fd4f5f59885dabb1648e9e3e9af304 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substr.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Substr.java @@ -22,17 +22,23 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import static com.oracle.truffle.r.runtime.RBuiltinKind.*; +import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.api.frame.*; -import com.oracle.truffle.api.utilities.*; -import com.oracle.truffle.r.nodes.builtin.*; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; -import com.oracle.truffle.r.runtime.data.model.*; -import com.oracle.truffle.r.runtime.ops.na.*; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.frame.VirtualFrame; +import com.oracle.truffle.api.utilities.BranchProfile; +import com.oracle.truffle.api.utilities.ConditionProfile; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RNull; +import com.oracle.truffle.r.runtime.data.RStringVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; +import com.oracle.truffle.r.runtime.ops.na.NACheck; @RBuiltin(name = "substr", kind = INTERNAL, parameterNames = {"x", "start", "stop"}) public abstract class Substr extends RBuiltinNode { @@ -49,7 +55,6 @@ public abstract class Substr extends RBuiltinNode { @SuppressWarnings("unused") @Specialization(guards = {"!emptyArg(arg)", "wrongParams(start, stop)"}) - @TruffleBoundary protected RNull substrWrongParams(RAbstractStringVector arg, RAbstractIntVector start, RAbstractIntVector stop) { RInternalError.shouldNotReachHere(); return RNull.instance; // dummy diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java index 1fa1a74c43a04372b78bbd7c77b53df6c8a04b9d..3c07784737448864ee764abe7599707361b2d7ba 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Tabulate.java @@ -10,29 +10,42 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.r.nodes.builtin.*; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; -import com.oracle.truffle.r.runtime.data.model.*; - -import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Fallback; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.utilities.BranchProfile; +import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; +import com.oracle.truffle.r.nodes.profile.CountedLoopConditionProfile; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RBuiltinKind; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RRuntime; +import com.oracle.truffle.r.runtime.data.RDataFactory; +import com.oracle.truffle.r.runtime.data.RFactor; +import com.oracle.truffle.r.runtime.data.RIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; @RBuiltin(name = "tabulate", kind = RBuiltinKind.INTERNAL, parameterNames = {"bin", "nbins"}) public abstract class Tabulate extends RBuiltinNode { + private final BranchProfile errorProfile = BranchProfile.create(); + private final CountedLoopConditionProfile loopProfile = CountedLoopConditionProfile.create(); + @Override protected void createCasts(CastBuilder casts) { casts.toInteger(1); } - @Specialization(guards = {"isValidNBin(nBins)"}) - @TruffleBoundary + @Specialization public RIntVector tabulate(RAbstractIntVector bin, int nBins) { controlVisibility(); + if (RRuntime.isNA(nBins) || nBins < 0) { + errorProfile.enter(); + throw RError.error(this, RError.Message.INVALID_ARGUMENT, "nbin"); + } int[] ans = new int[nBins]; - for (int i = 0; i < bin.getLength(); i++) { + loopProfile.profileLength(bin.getLength()); + for (int i = 0; loopProfile.inject(i < bin.getLength()); i++) { int currentEl = bin.getDataAt(i); if (!RRuntime.isNA(currentEl) && currentEl > 0 && currentEl <= nBins) { ans[currentEl - 1]++; @@ -41,23 +54,15 @@ public abstract class Tabulate extends RBuiltinNode { return RDataFactory.createIntVector(ans, RDataFactory.COMPLETE_VECTOR); } - @Specialization(guards = {"isValidNBin(nBins)"}) - @TruffleBoundary + @Specialization public RIntVector tabulate(RFactor bin, int nBins) { return tabulate(bin.getVector(), nBins); } @SuppressWarnings("unused") - @Specialization + @Fallback + @TruffleBoundary public RIntVector tabulate(Object bin, int nBins) { - CompilerDirectives.transferToInterpreter(); throw RError.error(this, RError.Message.INVALID_INPUT); } - - protected boolean isValidNBin(int nBins) { - if (RRuntime.isNA(nBins) || nBins < 0) { - throw RError.error(this, RError.Message.INVALID_ARGUMENT, "nbin"); - } - return true; - } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TempDir.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TempDir.java index 449598ed3f910137c2a7624aaa557e07970bbe42..075497373dbd75e0ce83200209f81c5f06338826 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TempDir.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/TempDir.java @@ -22,22 +22,19 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; + import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RBuiltin; import com.oracle.truffle.r.runtime.TempPathName; -import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import static com.oracle.truffle.r.runtime.RBuiltinKind.INTERNAL; - @RBuiltin(name = "tempdir", kind = INTERNAL, parameterNames = {}) public abstract class TempDir extends RBuiltinNode { @Specialization - @TruffleBoundary protected Object tempdir() { controlVisibility(); return TempPathName.tempDirPath(); } - } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLower.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLower.java index d10f2a3a99a165b6c9b64a4daea929a992978348..609207e62a8debeda40aa5a5cbf1252bafe08dc7 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLower.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToLower.java @@ -27,6 +27,7 @@ import static com.oracle.truffle.r.runtime.RBuiltinKind.*; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.r.nodes.builtin.*; +import com.oracle.truffle.r.nodes.profile.CountedLoopConditionProfile; import com.oracle.truffle.r.runtime.*; import com.oracle.truffle.r.runtime.data.*; import com.oracle.truffle.r.runtime.data.model.*; @@ -42,20 +43,19 @@ public abstract class ToLower extends RBuiltinNode { } @Specialization - @TruffleBoundary - protected RStringVector toLower(RAbstractStringVector vector) { + protected RStringVector toLower(RAbstractStringVector vector, // + @Cached("create()") CountedLoopConditionProfile loopProfile) { controlVisibility(); String[] stringVector = new String[vector.getLength()]; - for (int i = 0; i < vector.getLength(); i++) { + loopProfile.profileLength(vector.getLength()); + for (int i = 0; loopProfile.inject(i < vector.getLength()); i++) { stringVector[i] = toLower(vector.getDataAt(i)); } return RDataFactory.createStringVector(stringVector, vector.isComplete()); } - @SuppressWarnings("unused") @Specialization - @TruffleBoundary - protected RStringVector tolower(RNull empty) { + protected RStringVector tolower(@SuppressWarnings("unused") RNull empty) { controlVisibility(); return RDataFactory.createStringVector(0); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToUpper.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToUpper.java index 88ad73094ecb3a937e104dc6d08edcc43c683dd6..b9df54b012f1a9402e8501f8d2e277622d5fdffa 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToUpper.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/ToUpper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import static com.oracle.truffle.r.runtime.RBuiltinKind.*; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.r.nodes.builtin.*; +import com.oracle.truffle.r.nodes.profile.CountedLoopConditionProfile; import com.oracle.truffle.r.runtime.*; import com.oracle.truffle.r.runtime.data.*; @@ -41,11 +42,12 @@ public abstract class ToUpper extends RBuiltinNode { } @Specialization - @TruffleBoundary - protected RStringVector toUpper(RStringVector vector) { + protected RStringVector toUpper(RStringVector vector, // + @Cached("create()") CountedLoopConditionProfile loopProfile) { controlVisibility(); String[] stringVector = new String[vector.getLength()]; - for (int i = 0; i < vector.getLength(); i++) { + loopProfile.profileLength(vector.getLength()); + for (int i = 0; loopProfile.inject(i < vector.getLength()); i++) { stringVector[i] = toUpper(vector.getDataAt(i)); } RStringVector res = RDataFactory.createStringVector(stringVector, vector.isComplete()); @@ -53,10 +55,8 @@ public abstract class ToUpper extends RBuiltinNode { return res; } - @SuppressWarnings("unused") @Specialization - @TruffleBoundary - protected RStringVector toupper(RNull empty) { + protected RStringVector toupper(@SuppressWarnings("unused") RNull empty) { controlVisibility(); return RDataFactory.createStringVector(0); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java index ef679f6ec0acae32b5fbbe137c4d56ab0cab0325..0eb9e9639f5560b7dd16d578a24185680a9ed567 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Transpose.java @@ -33,28 +33,24 @@ public abstract class Transpose extends RBuiltinNode { public abstract Object execute(Object o); @Specialization - @TruffleBoundary protected RNull transpose(RNull value) { controlVisibility(); return value; } @Specialization - @TruffleBoundary protected int transpose(int value) { controlVisibility(); return value; } @Specialization - @TruffleBoundary protected double transpose(double value) { controlVisibility(); return value; } @Specialization - @TruffleBoundary protected byte transpose(byte value) { controlVisibility(); return value; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java index ae39a1702f4bcf95d6a15f40bd97bcaead80b967..53d0398c5343def1840503b85434cef42449b65f 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Unlist.java @@ -115,7 +115,6 @@ public abstract class Unlist extends RBuiltinNode { @SuppressWarnings("unused") @Specialization - @TruffleBoundary protected RNull unlist(RNull vector, byte recursive, byte useNames) { controlVisibility(); return RNull.instance; @@ -123,7 +122,6 @@ public abstract class Unlist extends RBuiltinNode { @SuppressWarnings("unused") @Specialization(guards = "!isVectorList(vector)") - @TruffleBoundary protected RAbstractVector unlistVector(RAbstractVector vector, byte recursive, byte useNames) { controlVisibility(); return vector; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDiag.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDiag.java index 6e32b519754767707ece17f9213d787dfe56c7df..c364609bacdd7d9d531e84d9efa667bc27145462 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDiag.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpdateDiag.java @@ -22,17 +22,22 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import static com.oracle.truffle.r.runtime.RBuiltinKind.*; +import static com.oracle.truffle.r.runtime.RBuiltinKind.SUBSTITUTE; -import com.oracle.truffle.api.*; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import com.oracle.truffle.api.dsl.*; -import com.oracle.truffle.r.nodes.builtin.*; -import com.oracle.truffle.r.nodes.unary.*; -import com.oracle.truffle.r.runtime.*; -import com.oracle.truffle.r.runtime.data.*; -import com.oracle.truffle.r.runtime.data.model.*; -import com.oracle.truffle.r.runtime.ops.na.*; +import com.oracle.truffle.api.CompilerDirectives; +import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.r.nodes.builtin.RInvisibleBuiltinNode; +import com.oracle.truffle.r.nodes.unary.CastDoubleNode; +import com.oracle.truffle.r.nodes.unary.CastDoubleNodeGen; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.data.RAttributeProfiles; +import com.oracle.truffle.r.runtime.data.RDoubleVector; +import com.oracle.truffle.r.runtime.data.RIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractDoubleVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; +import com.oracle.truffle.r.runtime.data.model.RAbstractVector; +import com.oracle.truffle.r.runtime.ops.na.NACheck; @RBuiltin(name = "diag<-", kind = SUBSTITUTE, parameterNames = {"x", ""}) // 2nd parameter is "value", but should not be matched against, so "") @@ -70,8 +75,7 @@ public abstract class UpdateDiag extends RInvisibleBuiltinNode { } @Specialization(guards = {"isMatrix(vector)", "correctReplacementLength(vector, valueVector)"}) - @TruffleBoundary - protected RAbstractIntVector updateDiag(RIntVector vector, RAbstractIntVector valueVector) { + protected RAbstractIntVector updateDiag(RAbstractIntVector vector, RAbstractIntVector valueVector) { controlVisibility(); RIntVector resultVector = (RIntVector) vector.materializeNonShared(); int nrow = resultVector.getDimensions()[0]; @@ -86,8 +90,7 @@ public abstract class UpdateDiag extends RInvisibleBuiltinNode { } @Specialization(guards = {"isMatrix(vector)", "correctReplacementLength(vector, valueVector)"}) - @TruffleBoundary - protected RAbstractDoubleVector updateDiag(RDoubleVector vector, RAbstractDoubleVector valueVector) { + protected RAbstractDoubleVector updateDiag(RAbstractDoubleVector vector, RAbstractDoubleVector valueVector) { controlVisibility(); RDoubleVector resultVector = (RDoubleVector) vector.materializeNonShared(); int size = Math.min(resultVector.getDimensions()[0], resultVector.getDimensions()[1]); @@ -102,7 +105,7 @@ public abstract class UpdateDiag extends RInvisibleBuiltinNode { } @Specialization(guards = {"isMatrix(vector)", "correctReplacementLength(vector, valueVector)"}) - protected RAbstractDoubleVector updateDiag(RIntVector vector, RAbstractDoubleVector valueVector) { + protected RAbstractDoubleVector updateDiag(RAbstractIntVector vector, RAbstractDoubleVector valueVector) { controlVisibility(); initCastDoubleNode(); RDoubleVector resultVector = (RDoubleVector) castDouble.executeDouble(vector); diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java index 9846654e59b1c34beeebf816c934d52e034946fb..2b9b5f97ea4fdeac8a490703e1239a3cb7b94132 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/UpperTri.java @@ -22,17 +22,19 @@ */ package com.oracle.truffle.r.nodes.builtin.base; +import static com.oracle.truffle.r.runtime.RBuiltinKind.SUBSTITUTE; + +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; +import com.oracle.truffle.api.utilities.ConditionProfile; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; -import com.oracle.truffle.r.runtime.*; +import com.oracle.truffle.r.runtime.RBuiltin; +import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RLogicalVector; import com.oracle.truffle.r.runtime.data.RMissing; import com.oracle.truffle.r.runtime.data.model.RAbstractVector; -import static com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; -import static com.oracle.truffle.r.runtime.RBuiltinKind.SUBSTITUTE; - @RBuiltin(name = "upper.tri", kind = SUBSTITUTE, parameterNames = {"x", "diag"}) // TODO Implement in R public abstract class UpperTri extends RBuiltinNode { @@ -42,36 +44,36 @@ public abstract class UpperTri extends RBuiltinNode { return new Object[]{RMissing.instance, RRuntime.LOGICAL_FALSE}; } + @Override + protected void createCasts(CastBuilder casts) { + casts.firstBoolean(1); + } + @Specialization - @TruffleBoundary - protected RLogicalVector upperTri(RAbstractVector vector, byte diag) { + protected RLogicalVector upperTri(RAbstractVector vector, boolean diag, // + @Cached("createBinaryProfile()") ConditionProfile nullDimensionsProfile, // + @Cached("createBinaryProfile()") ConditionProfile nonSquareProfile) { controlVisibility(); - int[] dim = preprocessDim(vector); + int[] dim = vector.getDimensions(); + if (nullDimensionsProfile.profile(dim == null)) { + dim = new int[]{vector.getLength(), 1}; + } int size = Math.min(dim[0], dim[1]); int nrow = dim[0]; int length = vector.getLength(); byte[] result = new byte[length]; for (int i = 0; i < size; i++) { - int cmp = diag == RRuntime.LOGICAL_TRUE ? i + 1 : i; + int cmp = diag ? i + 1 : i; for (int j = 0; j < cmp; j++) { int index = i * nrow + j; result[index] = RRuntime.LOGICAL_TRUE; } } - if (dim[0] < dim[1]) { + if (nonSquareProfile.profile(dim[0] < dim[1])) { for (int i = size * size; i < length; i++) { result[i] = RRuntime.LOGICAL_TRUE; } } return RDataFactory.createLogicalVector(result, true, dim); } - - @TruffleBoundary - private static int[] preprocessDim(RAbstractVector vector) { - int[] dim = vector.getDimensions(); - if (dim == null) { - return new int[]{vector.getLength(), 1}; - } - return dim; - } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java index 854dde38e7b4947faaaab7f31350cfbe8c751437..9e4c6d981acaddb52e6f5db4ac03279e4530268c 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/WhichFunctions.java @@ -101,7 +101,6 @@ public class WhichFunctions { } @Specialization - @TruffleBoundary protected int which(RAbstractDoubleVector x) { controlVisibility(); double max = x.getDataAt(0); @@ -126,7 +125,6 @@ public class WhichFunctions { } @Specialization - @TruffleBoundary protected int which(RAbstractDoubleVector x) { controlVisibility(); double minimum = x.getDataAt(0); @@ -139,6 +137,5 @@ public class WhichFunctions { } return minIndex + 1; } - } }