Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Q
QueryR
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Julien Lopez
QueryR
Commits
0494c211
Commit
0494c211
authored
7 years ago
by
stepan
Browse files
Options
Downloads
Patches
Plain Diff
VectorIterator: reduce instance-of checks, make sure interface calls are inlined
parent
0512825a
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorIterator.java
+59
-35
59 additions, 35 deletions
...m/oracle/truffle/r/runtime/data/nodes/VectorIterator.java
with
59 additions
and
35 deletions
com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/nodes/VectorIterator.java
+
59
−
35
View file @
0494c211
...
...
@@ -22,6 +22,7 @@
*/
package
com.oracle.truffle.r.runtime.data.nodes
;
import
com.oracle.truffle.api.CompilerDirectives
;
import
com.oracle.truffle.api.CompilerDirectives.ValueType
;
import
com.oracle.truffle.api.dsl.Cached
;
import
com.oracle.truffle.api.dsl.Fallback
;
...
...
@@ -45,15 +46,16 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractLogicalVector;
import
com.oracle.truffle.r.runtime.data.model.RAbstractRawVector
;
import
com.oracle.truffle.r.runtime.data.model.RAbstractStringVector
;
import
com.oracle.truffle.r.runtime.data.model.RAbstractVector
;
import
com.oracle.truffle.r.runtime.data.nodes.GetNextNodeGen.GetNextGenericNodeGen
;
import
com.oracle.truffle.r.runtime.data.nodes.VectorIterator.IteratorData
;
abstract
class
VectorIteratorNodeAdapter
extends
Node
{
public
static
boolean
hasNoNativeMemoryData
(
RAbstractVector
vector
)
{
return
!(
v
ector
instanceof
RVector
<?>
)
||
!((
RVector
<?>)
vector
).
hasNativeMemoryData
();
public
static
boolean
hasNoNativeMemoryData
(
RAbstractVector
vector
,
Class
<?
extends
RAbstractVector
>
vecClass
)
{
return
!(
RV
ector
.
class
.
isAssignableFrom
(
vecClass
)
)
||
!((
RVector
<?>)
vecClass
.
cast
(
vector
)
)
.
hasNativeMemoryData
();
}
public
static
boolean
isRVector
(
RAbstractVector
vec
tor
)
{
return
v
ector
instanceof
RVector
<?>
;
public
static
boolean
isRVector
(
Class
<?
extends
RAbstractVector
>
vec
Class
)
{
return
RV
ector
.
class
.
isAssignableFrom
(
vecClass
)
;
}
}
...
...
@@ -65,11 +67,11 @@ abstract class GetIteratorNode extends VectorIteratorNodeAdapter {
return
new
IteratorData
<>(
vector
.
getNativeMirror
(),
vector
.
getLength
());
}
@Specialization
(
guards
=
{
"hasNoNativeMemoryData(vector
)"
,
"
vectorClass
== vector.getClass()"
}
)
@Specialization
(
guards
=
{
"vectorClass == vector.getClass()"
,
"hasNoNativeMemoryData(vector, vectorClass
)"
},
limit
=
"10"
)
protected
IteratorData
<?>
generic
(
RAbstractVector
vector
,
@Cached
(
"vector.getClass()"
)
Class
<?
extends
RAbstractVector
>
vectorClass
)
{
RAbstractVector
profiledVec
=
vectorClass
.
cast
(
vector
);
return
new
IteratorData
<>(
profiledVec
.
getInternalStore
(),
vector
.
getLength
());
return
new
IteratorData
<>(
profiledVec
.
getInternalStore
(),
profiledVec
.
getLength
());
}
@Fallback
...
...
@@ -106,7 +108,7 @@ abstract class HasNextNode extends VectorIteratorNodeAdapter {
return
iter
.
index
<
((
String
[])
iter
.
store
).
length
;
}
@Specialization
(
guards
=
{
"
!isRVector(vector)"
,
"vectorClass ==
vector
.get
Class
(
)"
})
@Specialization
(
guards
=
{
"
vectorClass == vector.getClass()"
,
"!isRVector(
vectorClass)"
}
,
limit
=
"10"
)
protected
boolean
generic
(
RAbstractVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"vector.getClass()"
)
Class
<?
extends
RAbstractVector
>
vectorClass
)
{
RAbstractVector
profiledVec
=
vectorClass
.
cast
(
vector
);
...
...
@@ -183,40 +185,62 @@ abstract class GetNextNode extends VectorIteratorNodeAdapter {
throw
RInternalError
.
unimplemented
(
"string vectors backed by native memory"
);
}
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
int
intVectorGeneric
(
RAbstractIntVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Int
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Child
private
GetNextGenericNode
getNextGenericNode
;
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
double
doubleVectorGeneric
(
RAbstractDoubleVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Double
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
@Fallback
protected
Object
doGeneric
(
RAbstractVector
vector
,
IteratorData
<?>
iter
)
{
// we use fallback and extra node so that we do not have to explicitly check that the vector is not
// RVector, DSL generates fallback guard that compares the class with the all RVector subclasses
// used in the specializations above, "vector instanceof RVector" would not be a leaf-check.
if
(
getNextGenericNode
==
null
)
{
CompilerDirectives
.
transferToInterpreterAndInvalidate
();
getNextGenericNode
=
insert
(
GetNextGenericNode
.
create
());
}
return
getNextGenericNode
.
execute
(
vector
,
iter
);
}
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
String
stringVectorGeneric
(
RAbstractStringVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
String
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
static
abstract
class
GetNextGenericNode
extends
Node
{
public
abstract
Object
execute
(
RAbstractVector
vector
,
IteratorData
<?>
iter
);
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
byte
rawVectorGeneric
(
RAbstractRawVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Raw
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
public
static
GetNextGenericNode
create
()
{
return
GetNextGenericNodeGen
.
create
();
}
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
byte
logical
VectorGeneric
(
RAbstract
Logical
Vector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Logical
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
protected
int
int
VectorGeneric
(
RAbstract
Int
Vector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Int
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
(
guards
=
"!isRVector(vector)"
)
protected
RComplex
complexVectorGeneric
(
RAbstractComplexVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Complex
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
@Specialization
protected
double
doubleVectorGeneric
(
RAbstractDoubleVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Double
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
protected
String
stringVectorGeneric
(
RAbstractStringVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
String
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
protected
byte
rawVectorGeneric
(
RAbstractRawVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Raw
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
protected
byte
logicalVectorGeneric
(
RAbstractLogicalVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Logical
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
@Specialization
protected
RComplex
complexVectorGeneric
(
RAbstractComplexVector
vector
,
IteratorData
<?>
iter
,
@Cached
(
"create()"
)
GetDataAt
.
Complex
getDataAtNode
)
{
return
getDataAtNode
.
get
(
vector
,
iter
.
store
,
iter
.
index
);
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment