Skip to content

Commit 83d4df2

Browse files
committed
[GR-21974] More new model preformance fixes: seq, fast-path for vectors of length one in arithmetic/boolean specials.
PullRequest: fastr/2417
2 parents ca551e6 + b3203e2 commit 83d4df2

File tree

20 files changed

+160
-109
lines changed

20 files changed

+160
-109
lines changed

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/SeqFunctions.java

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -570,22 +570,24 @@ protected RIntVector seqFromOneArgObj(Object from, RMissing to, RMissing by, RMi
570570
* third specialization handles other types and invalid arguments.
571571
*/
572572

573-
@Specialization(guards = "validDoubleParams(fromVec, toVec)")
573+
@Specialization(guards = "validDoubleParams(fromDataLib, fromVec, toDataLib, toVec)", limit = "getTypedVectorDataLibraryCacheSize()")
574574
protected RAbstractVector seqLengthByMissingDouble(RDoubleVector fromVec, RDoubleVector toVec, RMissing by, RMissing lengthOut, RMissing alongWith, Object dotdotdot,
575+
@CachedLibrary("fromVec.getData()") VectorDataLibrary fromDataLib,
576+
@CachedLibrary("toVec.getData()") VectorDataLibrary toDataLib,
575577
@Cached("createBinaryProfile()") ConditionProfile directionProfile) {
576-
double from = fromVec.getDataAt(0);
577-
double to = toVec.getDataAt(0);
578-
RAbstractVector result = createRSequence(from, to, directionProfile);
579-
return result;
578+
double from = fromDataLib.getDoubleAt(fromVec.getData(), 0);
579+
double to = toDataLib.getDoubleAt(toVec.getData(), 0);
580+
return createRSequence(from, to, directionProfile);
580581
}
581582

582-
@Specialization(guards = "validIntParams(fromVec, toVec)")
583+
@Specialization(guards = "validIntParams(fromDataLib, fromVec, toDataLib, toVec)", limit = "getTypedVectorDataLibraryCacheSize()")
583584
protected RAbstractVector seqLengthByMissingInt(RIntVector fromVec, RIntVector toVec, RMissing by, RMissing lengthOut, RMissing alongWith, Object dotdotdot,
585+
@CachedLibrary("fromVec.getData()") VectorDataLibrary fromDataLib,
586+
@CachedLibrary("toVec.getData()") VectorDataLibrary toDataLib,
584587
@Cached("createBinaryProfile()") ConditionProfile directionProfile) {
585-
int from = fromVec.getDataAt(0);
586-
int to = toVec.getDataAt(0);
587-
RIntVector result = createRIntSequence(from, to, directionProfile);
588-
return result;
588+
int from = fromDataLib.getIntAt(fromVec.getData(), 0);
589+
int to = toDataLib.getIntAt(toVec.getData(), 0);
590+
return createRIntSequence(from, to, directionProfile);
589591
}
590592

591593
/**
@@ -620,20 +622,26 @@ protected RAbstractVector seqLengthByMissing(Object fromObj, Object toObj, RMiss
620622
* handled in the "One" specializations.
621623
*/
622624

623-
@Specialization(guards = {"validDoubleParams(fromVec, toVec)", "!isMissing(byObj)"})
625+
@Specialization(guards = {"validDoubleParams(fromDataLib, fromVec, toDataLib, toVec)", "!isMissing(byObj)"}, limit = "getTypedVectorDataLibraryCacheSize()")
624626
protected Object seqLengthMissing(RDoubleVector fromVec, RDoubleVector toVec, Object byObj, RMissing lengthOut, RMissing alongWith, Object dotdotdot,
627+
@CachedLibrary("fromVec.getData()") VectorDataLibrary fromDataLib,
628+
@CachedLibrary("toVec.getData()") VectorDataLibrary toDataLib,
625629
@Cached("create()") AsRealNode asRealby) {
626630
validateLength(byObj, "by");
627631
double by = asRealby.execute(byObj);
628-
return doSeqLengthMissing(fromVec.getDataAt(0), toVec.getDataAt(0), by, false);
632+
return doSeqLengthMissing(fromDataLib.getDoubleAt(fromVec.getData(), 0), toDataLib.getDoubleAt(toVec.getData(), 0), by, false);
629633
}
630634

631-
@Specialization(guards = {"validIntParams(fromVec, toVec)", "validIntParam(byVec)", "byVec.getDataAt(0) != 0"})
635+
@Specialization(guards = {"validIntParams(fromDataLib, fromVec, toDataLib, toVec)", "validIntParam(byDataLib, byVec)",
636+
"byDataLib.getIntAt(byVec.getData(), 0) != 0"}, limit = "getTypedVectorDataLibraryCacheSize()")
632637
protected RAbstractVector seqLengthMissing(RIntVector fromVec, RIntVector toVec, RIntVector byVec, RMissing lengthOut, RMissing alongWith, Object dotdotdot,
638+
@CachedLibrary("fromVec.getData()") VectorDataLibrary fromDataLib,
639+
@CachedLibrary("toVec.getData()") VectorDataLibrary toDataLib,
640+
@CachedLibrary("byVec.getData()") VectorDataLibrary byDataLib,
633641
@Cached("createBinaryProfile()") ConditionProfile directionProfile) {
634-
int by = byVec.getDataAt(0);
635-
int from = fromVec.getDataAt(0);
636-
int to = toVec.getDataAt(0);
642+
int by = byDataLib.getIntAt(byVec.getData(), 0);
643+
int from = fromDataLib.getIntAt(fromVec.getData(), 0);
644+
int to = toDataLib.getIntAt(toVec.getData(), 0);
637645
RIntVector result;
638646
if (directionProfile.profile(from < to)) {
639647
if (by < 0) {
@@ -975,16 +983,19 @@ protected RAbstractVector seqFallback(Object fromObj, Object toObj, Object byObj
975983

976984
// Guard methods
977985

978-
public static boolean validDoubleParams(RDoubleVector from, RDoubleVector to) {
979-
return from.getLength() == 1 && to.getLength() == 1 && isFinite(from.getDataAt(0)) && isFinite(to.getDataAt(0));
986+
public static boolean validDoubleParams(VectorDataLibrary fromDataLib, RDoubleVector from, VectorDataLibrary toDataLib, RDoubleVector to) {
987+
Object fromData = from.getData();
988+
Object toData = to.getData();
989+
return fromDataLib.getLength(fromData) == 1 && toDataLib.getLength(toData) == 1 && isFinite(fromDataLib.getDoubleAt(fromData, 0)) && isFinite(toDataLib.getDoubleAt(toData, 0));
980990
}
981991

982-
public static boolean validIntParams(RIntVector from, RIntVector to) {
983-
return validIntParam(from) && validIntParam(to);
992+
public static boolean validIntParams(VectorDataLibrary fromDataLib, RIntVector from, VectorDataLibrary toDataLib, RIntVector to) {
993+
return validIntParam(fromDataLib, from) && validIntParam(toDataLib, to);
984994
}
985995

986-
public static boolean validIntParam(RIntVector vec) {
987-
return vec.getLength() == 1 && vec.getDataAt(0) != RRuntime.INT_NA;
996+
public static boolean validIntParam(VectorDataLibrary dataLib, RIntVector vec) {
997+
Object data = vec.getData();
998+
return dataLib.getLength(data) == 1 && dataLib.getIntAt(data, 0) != RRuntime.INT_NA;
988999
}
9891000

9901001
public final int getLength(Object obj) {

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subscript.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
2222
*/
2323
package com.oracle.truffle.r.nodes.builtin.base.infix;
2424

25-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertIndex;
25+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.convertIndex;
2626
import static com.oracle.truffle.r.runtime.RDispatch.INTERNAL_GENERIC;
2727
import static com.oracle.truffle.r.runtime.builtins.ArgumentMatchingMode.MATCH_BY_NAME_EXACT_SKIP_FIRST;
2828
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE_SUBSCRIPT;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/Subset.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -22,7 +22,7 @@
2222
*/
2323
package com.oracle.truffle.r.nodes.builtin.base.infix;
2424

25-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertIndex;
25+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.convertIndex;
2626
import static com.oracle.truffle.r.runtime.RDispatch.INTERNAL_GENERIC;
2727
import static com.oracle.truffle.r.runtime.builtins.ArgumentMatchingMode.MATCH_BY_NAME_EXACT_SKIP_FIRST;
2828
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE_SUBSET;
@@ -35,7 +35,7 @@
3535
import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
3636
import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
3737
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
38-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertIndex;
38+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertIndex;
3939
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SubsetSpecial;
4040
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SubsetSpecial2;
4141
import com.oracle.truffle.r.runtime.ArgumentsSignature;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/UpdateField.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -33,7 +33,7 @@
3333
import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
3434
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
3535
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
36-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils;
36+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils;
3737
import com.oracle.truffle.r.nodes.builtin.base.infix.special.UpdateFieldSpecialNodeGen;
3838
import com.oracle.truffle.r.nodes.unary.CastListNode;
3939
import com.oracle.truffle.r.nodes.unary.CastListNodeGen;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/UpdateSubscript.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -22,8 +22,8 @@
2222
*/
2323
package com.oracle.truffle.r.nodes.builtin.base.infix;
2424

25-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertIndex;
26-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertValue;
25+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.convertIndex;
26+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.unboxValue;
2727
import static com.oracle.truffle.r.runtime.RDispatch.INTERNAL_GENERIC;
2828
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
2929
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
@@ -35,8 +35,8 @@
3535
import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
3636
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
3737
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
38-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils;
39-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertIndex;
38+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils;
39+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertIndex;
4040
import com.oracle.truffle.r.nodes.builtin.base.infix.special.UpdateSubscriptSpecial;
4141
import com.oracle.truffle.r.nodes.builtin.base.infix.special.UpdateSubscriptSpecial2;
4242
import com.oracle.truffle.r.runtime.ArgumentsSignature;
@@ -61,9 +61,9 @@ public static RNode special(ArgumentsSignature signature, RNode[] args, boolean
6161
if (SpecialsUtils.isCorrectUpdateSignature(signature) && (args.length == 3 || args.length == 4)) {
6262
ConvertIndex index = convertIndex(args[1]);
6363
if (args.length == 3) {
64-
return UpdateSubscriptSpecial.create(inReplacement, args[0], index, convertValue(args[2]));
64+
return UpdateSubscriptSpecial.create(inReplacement, args[0], index, unboxValue(args[2]));
6565
} else {
66-
return UpdateSubscriptSpecial2.create(inReplacement, args[0], index, convertIndex(args[2]), convertValue(args[3]));
66+
return UpdateSubscriptSpecial2.create(inReplacement, args[0], index, convertIndex(args[2]), unboxValue(args[3]));
6767
}
6868
}
6969
return null;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/UpdateSubset.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -22,8 +22,8 @@
2222
*/
2323
package com.oracle.truffle.r.nodes.builtin.base.infix;
2424

25-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertIndex;
26-
import static com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.convertValue;
25+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.convertIndex;
26+
import static com.oracle.truffle.r.nodes.helpers.SpecialsUtils.unboxValue;
2727
import static com.oracle.truffle.r.runtime.RDispatch.INTERNAL_GENERIC;
2828
import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE;
2929
import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE;
@@ -35,8 +35,8 @@
3535
import com.oracle.truffle.r.nodes.access.vector.ElementAccessMode;
3636
import com.oracle.truffle.r.nodes.access.vector.ReplaceVectorNode;
3737
import com.oracle.truffle.r.nodes.builtin.RBuiltinNode;
38-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils;
39-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertIndex;
38+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils;
39+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertIndex;
4040
import com.oracle.truffle.r.nodes.builtin.base.infix.special.UpdateSubscriptSpecial;
4141
import com.oracle.truffle.r.nodes.builtin.base.infix.special.UpdateSubscriptSpecial2;
4242
import com.oracle.truffle.r.runtime.ArgumentsSignature;
@@ -60,9 +60,9 @@ public static RNode special(ArgumentsSignature signature, RNode[] args, boolean
6060
if (SpecialsUtils.isCorrectUpdateSignature(signature) && (args.length == 3 || args.length == 4)) {
6161
ConvertIndex index = SpecialsUtils.convertIndex(args[1]);
6262
if (args.length == 3) {
63-
return UpdateSubscriptSpecial.create(inReplacement, args[0], index, convertValue(args[2]));
63+
return UpdateSubscriptSpecial.create(inReplacement, args[0], index, unboxValue(args[2]));
6464
} else {
65-
return UpdateSubscriptSpecial2.create(inReplacement, args[0], index, convertIndex(args[2]), convertValue(args[3]));
65+
return UpdateSubscriptSpecial2.create(inReplacement, args[0], index, convertIndex(args[2]), unboxValue(args[3]));
6666
}
6767
}
6868
return null;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/special/AccessSpecial.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.oracle.truffle.api.dsl.ImportStatic;
2727
import com.oracle.truffle.api.dsl.Specialization;
2828
import com.oracle.truffle.api.library.CachedLibrary;
29-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.SubInterface;
29+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.SubInterface;
3030
import com.oracle.truffle.r.runtime.DSLConfig;
3131
import com.oracle.truffle.r.runtime.builtins.RSpecialFactory;
3232
import com.oracle.truffle.r.runtime.data.RDoubleVector;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/special/AccessSpecial2.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.oracle.truffle.api.dsl.Fallback;
2727
import com.oracle.truffle.api.dsl.Specialization;
2828
import com.oracle.truffle.api.library.CachedLibrary;
29-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.Sub2Interface;
29+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.Sub2Interface;
3030
import com.oracle.truffle.r.runtime.builtins.RSpecialFactory;
3131
import com.oracle.truffle.r.runtime.data.RDoubleVector;
3232
import com.oracle.truffle.r.runtime.data.VectorDataLibrary;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/special/ProfiledSpecialsUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2017, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -28,8 +28,8 @@
2828
import com.oracle.truffle.api.dsl.NodeChild;
2929
import com.oracle.truffle.api.dsl.Specialization;
3030
import com.oracle.truffle.api.frame.VirtualFrame;
31-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertIndex;
32-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertValue;
31+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertIndex;
32+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertValue;
3333
import com.oracle.truffle.r.runtime.DSLConfig;
3434
import com.oracle.truffle.r.runtime.RInternalError;
3535
import com.oracle.truffle.r.runtime.data.model.RAbstractVector;

com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/infix/special/SubscriptSpecial.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import com.oracle.truffle.r.runtime.data.nodes.ExtractListElement;
2929
import com.oracle.truffle.r.nodes.access.vector.ExtractVectorNode;
3030
import com.oracle.truffle.r.nodes.builtin.base.infix.special.ProfiledSpecialsUtilsFactory.ProfiledSubscriptSpecialNodeGen;
31-
import com.oracle.truffle.r.nodes.builtin.base.infix.special.SpecialsUtils.ConvertIndex;
31+
import com.oracle.truffle.r.nodes.helpers.SpecialsUtils.ConvertIndex;
3232
import com.oracle.truffle.r.runtime.RRuntime;
3333
import com.oracle.truffle.r.runtime.data.RList;
3434
import com.oracle.truffle.r.runtime.data.RLogical;

0 commit comments

Comments
 (0)