We have organized our 131 features into nine categories.
Out of the 131 features, 99 have been observed in our benchmarks.
We describe each category, and their elements, in this page.
Each category concerns different aspects of a store instruction such as
L: p[i] = v.
This syntax describes an instruction at program point L, which
deposits a value v onto memory location p[i].
This category of features concerns the type of the value v that
will be stored in memory.
In total, we have defined 17 different features in this category, but only four
of them have been observed during profiling.
| Feature | Description |
|---|---|
Vfp
|
Floating point type with 32 bits |
Vdb
|
Floating point type with 64 bits |
Vin
|
Integer type (with any bitwidth) |
Vpt
|
Pointer type |
This category refers to the size of the value v, in bits, that
shall be stored in memory.
This size is only well-defined for fixed-size types like integers, floats and
pointers.
Integers can have different bitwidths, but, for instance, a type integer of 8
bits has always 8 bits of width.
| Feature | Description |
|---|---|
sz0
|
The size is not well-defined |
sz1
|
One bit |
sz8
|
Eight bits |
s16
|
Primitive type of 16 bits |
s32
|
Primitive type of 32 bits |
szN
|
Primitive type of more than 32 bits |
This category concerns the program slice that contributes to form the value
v that shall be deposited in memory.
The program slice of v is every statement that needs to be
executed so that we can have v's value.
| Feature | Description | Feature | Description |
|---|---|---|---|
ZER
|
Const ZERO |
INT
|
Const INT |
FTP
|
Const Floating-Point |
NUL
|
Const NULL |
GLB
|
Global constant |
FUN
|
The address of a function |
CN?
|
Unknown constant |
ARG
|
A function argument |
LD
|
A load instruction |
CAL
|
A function call operation |
CMP
|
A comparison operation |
PHI
|
A phi-function |
SEL
|
A selector, e.g., a = b ? c : d
|
ADD
|
An addition |
SUB
|
A subtraction |
MUL
|
A multiplication |
DIV
|
A division |
REM
|
Remainder |
SHF
|
Bitwise shift |
BIT
|
Bitwise logical operation (and, or, neg) |
GEP
|
An LLVM get element pointer |
CAS
|
A bit cast |
EXT
|
A floating point extension |
F2I
|
Float to integer conversion |
I2F
|
Int to float conversion |
I2P
|
Int to pointer conversion |
P2I
|
Pointer to integer conversion |
TRN
|
Truncation |
SEX
|
Sign extension |
ZEX
|
Zero extension |
ALL
|
Stack allocation |
IN?
|
Any other instruction |
These features concern the last instruction that is used to produce the value
v.
| Feature | Description | Feature | Description |
|---|---|---|---|
Ozr
|
The value zero |
Oin
|
Integer constant |
Ofp
|
Floating point constant |
Ogb
|
Global variable |
Oay
|
Any other constant |
Oag
|
Function argument |
Old
|
Load instruction |
Ocl
|
Result of function call |
Omx
|
Multiplexer (selector or phi) |
Oad
|
Additive operation (add or sub) |
Oic
|
Increment |
Ong
|
Negation |
Ont
|
Boolean negation |
Omd
|
Multiply-add |
Omu
|
Multiplication |
Obn
|
Some other binary operation |
Ocs
|
Cast operation |
Oal
|
Stack allocation |
Oun
|
Another unary instruction |
Oiy
|
Any other instruction |
This category of features concerns the quantity of different values that
v can assume.
To compute this value, we reuse an old implementation of range analysys.
| Feature | Description |
|---|---|
rg1
|
The range of values contain only one element |
rg2
|
The range of values contains two elements |
rg8
|
The range of values contains up to eight elements |
rgN
|
Undefined range |
This category of features concerns the type of the pointer p that
is used as the target of the store operation.
| Feature | Description |
|---|---|
Pfp
|
Pointer to 32-bit float |
Pdb
|
Pointer to 64-bit double |
Pin
|
Pointer to integer |
Pst
|
Pointer to struct |
Pay
|
Pointer to array |
Ppt
|
Pointer to pointer |
Pvc
|
Pointer to SIMD vector |
This category of features concern the location of the region pointed by
p.
The typical locations are the heap, the stack, and the static memory area.
However, sometimes we cannot determine this location, and thus we fall back
to tracking from which instruction the location came from.
Perhaps, the best would be to split this category into two new groups:
memory location, and origin of the pointer.
| Feature | Description | Feature | Description |
|---|---|---|---|
Msc
|
Static memory |
Msk
|
Stack memory |
Mhp
|
Heap memory |
Mar
|
Unknown from function argument |
Mld
|
Unknown from load |
Mfn
|
Unknown from function return |
Mph
|
Unknown from a phi-function |
Mpt
|
Unknown from another pointer |
Mun
|
Undefined value (LLVM's undef) |
Mbt
|
Unknown bit operation |
This category concerns the location of the store instruction in the program.
In other words, it is all about the location L of the store
operation.
It deals, for instance, with dominance
and post-dominance relations, and with the
number of successors and predecessors of the basic blocks that contain the
store instruction.
| Feature | Description |
|---|---|
Smn
|
The store exists in the main function. |
Sl0
|
The store is not within a loop. |
Sl1
|
The store is within a outermost loop. |
Sl2
|
The store is within a doubly nested loop. |
Sl3
|
The store is within a triply nested loop. |
Sln
|
The store is within a more than triply nested loop. |
Scm
|
The store is compulsory (post-dominates the function). |
Scl
|
The store exists in a loop that is compulsory |
Spl
|
The store post-dominates the loop entry point |
Slx
|
The store exists in a loop that has only one exit |
Smp
|
The store exists in a block with multiple predecessors |
Sms
|
The store exists within a block with multiple successors |
Ssl
|
The store exists within a block with a single latch. |
Sdl
|
The store dominates the single latch. |
Svi
|
The store uses a loop invariant value. |
Spi
|
The store uses a loop invariant pointer. |
This category concerns the stride of the variable i used to index
the memory location where the store happens.
The stride is the increment on the variable, whenever it can be determined
statically.
| Feature | Description |
|---|---|
Erc
|
the pointer is created by a recurrence relation |
Eaf
|
the pointer is formed by an affine expression. |
Eqd
|
the pointer is formed by a quadratic affine expression. |
Es1
|
the pointer has a constant step of 1. |
Es4
|
the pointer has a constant step of 4. |
Es8
|
the pointer has a constant step of 8. |
EsN
|
the pointer has a constant step greater than 8. |
Esp
|
the step of the pointer equals the size of the pointer. |
Etp
|
the pointer exists in a loop with known trip count. |