[LLVMdev] Alignment of pointee
Frank Winter
fwinter at jlab.org
Tue Mar 25 06:53:35 PDT 2014
Hi all,
Is there a way to express in the IR that a pointer's value is a multiple
of, say, 32 bytes? I.e. the data the pointer points to has an alignment
of 32 bytes. I am not meaning the natural alignment determined by the
object's size. I am talking about a double* pointer and like to
explicitly overestimate the alignment.
I am trying to add this pointer as a function's argument, so that later
aligned (vector-) loads would get generated.
See the pseudo code of what I try to accomplish:
define void @foo( double* noalias %arg0 )
{
// switching to C style
for( int outer=0 ; outer < end ; ++outer ) {
for( int inner=0 ; inner < 4 ; ++inner ) {
arg0[ outer*4 + inner ] += arg0[ outer*4 + inner ];
}
}
The loop vectorizer does its job on the 'inner' loop and generates
vector loads/adds/stores for this code. However, the vector loads/stores
are not optimally aligned as they could be resulting a lot of
boilerplate code produced in codegen (lots of permutations).
After vectorization the code looks similar to
define void @foo( double* noalias %arg0 )
{
// switching to C style
for( int outer=0 ; outer < end ; ++outer ) {
vector.body: ; preds =
%vector.body, %L5
%index = phi i64 [ 0, %L5 ], [ %index.next, %vector.body ]
%42 = add i64 %7, %index
%43 = getelementptr double* %arg1, i64 %42
%44 = bitcast double* %43 to <4 x double>*
%wide.load = load <4 x double>* %44, align 8
%132 = fadd <4 x double> %wide.load, %wide.load54
%364 = getelementptr double* %arg0, i64 %93
%365 = bitcast double* %364 to <4 x double>*
store <4 x double> %329, <4 x double>* %365, align 8
}
}
One can see that if the initial alignment of the pointee of %arg0 was 32
bytes and since the vectorizer operates on a loop with a fixed trip
count of 4 and the size of double is 8 bytes, the vector loads and
stores could be ideally aligned with 32 bytes (which on my target
architecture would result in vector loads without additional permutations.
Is it somehow possible to achieve this? I am generating the IR with the
builder, i.e. I am not coming from C or clang.
Thank you,
Frank
More information about the llvm-dev
mailing list