Thanks for the alternatives!
I am trying the 'extracting sub-function' approach. However, it seems I
can't get the 'subfunction' to pass the verifier. This is my
subfunction:
define void @main_extern([8 x i8]* %arg_ptr) {
entrypoint:
%0 = getelementptr [8 x i8]* %arg_ptr, i32 0
%1 = bitcast [8 x i8]* %0 to i64*
%2 = load i64* %1
%3 = getelementptr [8 x i8]* %arg_ptr, i32 1
%4 = bitcast [8 x i8]* %3 to i64*
%5 = load i64* %4
%6 = getelementptr [8 x i8]* %arg_ptr, i32 2
%7 = bitcast [8 x i8]* %6 to float**
%8 = load float** %7
%9 = getelementptr [8 x i8]* %arg_ptr, i32 3
%10 = bitcast [8 x i8]* %9 to float**
%11 = load float** %10
%12 = getelementptr [8 x i8]* %arg_ptr, i32 4
%13 = bitcast [8 x i8]* %12 to float**
%14 = load float** %13
call void @main(i64 %2, i64 %5, float* %8, float* %11, float* %14)
ret void
}
Looks good to me. However the verify pass fails:
/svn/llvm/include/llvm/Support/Casting.h:97: static bool
llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To =
llvm::GlobalVariable; From = llvm::GlobalValue]: Assertion `Val &&
"isa<> used on a null pointer"' failed.
I have no idea what this tries to tell me. Any idea?
Frank
On 28/10/13 15:27, Hal Finkel wrote:> ----- Original Message -----
>> Bingo! That works (when coming from C source)
>>
>> Now, I have a serious problem. I am not coming from C but I build the
>> function with the builder. I am also forced to change the signature
>> and
>> load the pointers a,b,c afterwards:
>>
>> define void @bar([8 x i8]* nocapture readonly %arg_ptr) #0 {
>> entrypoint:
>> %0 = bitcast [8 x i8]* %arg_ptr to i32*
>> %1 = load i32* %0, align 4
>> %2 = getelementptr [8 x i8]* %arg_ptr, i64 1
>> %3 = bitcast [8 x i8]* %2 to i32*
>> %4 = load i32* %3, align 4
>> %5 = getelementptr [8 x i8]* %arg_ptr, i64 2
>> %6 = bitcast [8 x i8]* %5 to float**
>> %7 = load float** %6, align 8
>> %8 = getelementptr [8 x i8]* %arg_ptr, i64 3
>> %9 = bitcast [8 x i8]* %8 to float**
>> %10 = load float** %9, align 8
>> %11 = getelementptr [8 x i8]* %arg_ptr, i64 4
>> %12 = bitcast [8 x i8]* %11 to float**
>> %13 = load float** %12, align 8
>> %14 = sext i32 %1 to i64
>> br label %L0
>>
>> Now, these pointer (%7,%10,%13) are not qualified with
'restrict' and
>> the loop vectorizer gives me the same message:
>>
>> LV: We can't vectorize because we can't find the array bounds.
>> LV: Can't vectorize due to memory conflicts
>> LV: Not vectorizing.
>>
>> I asked this a few days ago; now it comes up again: Is there a way to
>> qualify a pointer/Value to be 'restrict'?
> Currently, no. There will be work in that direction soon. You'll need
to extract a sub-function so that you can put 'noalias' on the function
arguments.
>
>> Another possible solution would be telling the loop vectorizer that
>> it's
>> safe to treat all arrays as disjunct. Is this possible?
> Yes. Look for llvm.mem.parallel_loop_access in the language reference.
>
> -Hal
>
>> Frank
>>
>>
>>
>>
>> On 28/10/13 15:11, Hal Finkel wrote:
>>> ----- Original Message -----
>>>> I am trying to vectorize the function
>>>>
>>>> void bar(float *c, float *a, float *b)
>>>> {
>>>> const int width = 256;
>>>> for (int i = 0 ; i < 256 ; ++i ) {
>>>> c[ i ] = a[ i ] + b[ i ];
>>>> c[ width + i ] = a[ width + i ] + b[ width + i ];
>>>> }
>>>> }
>>>>
>>>> using the following commands
>>>>
>>>> clang -emit-llvm -S loop.c
>>>> opt loop.ll -O3 -debug-only=loop-vectorize -S -o -
>>>>
>>>> LV: Checking a loop in "bar"
>>>> LV: Found a loop: for.body
>>>> LV: Found an induction variable.
>>>> LV: Found an unidentified write ptr: float* %c
>>>> LV: Found an unidentified write ptr: float* %c
>>>> LV: Found an unidentified read ptr: float* %a
>>>> LV: Found an unidentified read ptr: float* %b
>>>> LV: Found an unidentified read ptr: float* %a
>>>> LV: Found an unidentified read ptr: float* %b
>>>> LV: Found a runtime check ptr: %arrayidx4 = getelementptr
>>>> inbounds
>>>> float* %c, i64 %indvars.iv
>>>> LV: Found a runtime check ptr: %arrayidx14 = getelementptr
>>>> inbounds
>>>> float* %c, i64 %2
>>>> LV: Found a runtime check ptr: %arrayidx = getelementptr
inbounds
>>>> float* %a, i64 %indvars.iv
>>>> LV: Found a runtime check ptr: %arrayidx2 = getelementptr
>>>> inbounds
>>>> float* %b, i64 %indvars.iv
>>>> LV: Found a runtime check ptr: %arrayidx7 = getelementptr
>>>> inbounds
>>>> float* %a, i64 %2
>>>> LV: Found a runtime check ptr: %arrayidx10 = getelementptr
>>>> inbounds
>>>> float* %b, i64 %2
>>>> LV: We need to do 10 pointer comparisons.
>>>> LV: We can't vectorize because we can't find the array
bounds.
>>>> LV: Can't vectorize due to memory conflicts
>>>> LV: Not vectorizing.
>>>>
>>>> Is there any chance to make this work?
>>> Try adding the restrict keyword to the function parameters:
>>>
>>> void bar(float * restrict c, float * restrict a, float * restrict
>>> b)
>>>
>>> -Hal
>>>
>>>> Frank
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>
>>
>>
----- Original Message -----> Thanks for the alternatives! > > I am trying the 'extracting sub-function' approach. However, it seems > I > can't get the 'subfunction' to pass the verifier. This is my > subfunction: > > define void @main_extern([8 x i8]* %arg_ptr) { > entrypoint: > %0 = getelementptr [8 x i8]* %arg_ptr, i32 0 > %1 = bitcast [8 x i8]* %0 to i64* > %2 = load i64* %1 > %3 = getelementptr [8 x i8]* %arg_ptr, i32 1 > %4 = bitcast [8 x i8]* %3 to i64* > %5 = load i64* %4 > %6 = getelementptr [8 x i8]* %arg_ptr, i32 2 > %7 = bitcast [8 x i8]* %6 to float** > %8 = load float** %7 > %9 = getelementptr [8 x i8]* %arg_ptr, i32 3 > %10 = bitcast [8 x i8]* %9 to float** > %11 = load float** %10 > %12 = getelementptr [8 x i8]* %arg_ptr, i32 4 > %13 = bitcast [8 x i8]* %12 to float** > %14 = load float** %13 > call void @main(i64 %2, i64 %5, float* %8, float* %11, float* %14) > ret void > } > > Looks good to me. However the verify pass fails: > > /svn/llvm/include/llvm/Support/Casting.h:97: static bool > llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To > llvm::GlobalVariable; From = llvm::GlobalValue]: Assertion `Val && > "isa<> used on a null pointer"' failed. > > I have no idea what this tries to tell me. Any idea?That's a bug (you're hitting an internal assertion failure). You could try removing one instruction at a time to try and narrow it down and/or file a bug report. -Hal> > Frank > > > > On 28/10/13 15:27, Hal Finkel wrote: > > ----- Original Message ----- > >> Bingo! That works (when coming from C source) > >> > >> Now, I have a serious problem. I am not coming from C but I build > >> the > >> function with the builder. I am also forced to change the > >> signature > >> and > >> load the pointers a,b,c afterwards: > >> > >> define void @bar([8 x i8]* nocapture readonly %arg_ptr) #0 { > >> entrypoint: > >> %0 = bitcast [8 x i8]* %arg_ptr to i32* > >> %1 = load i32* %0, align 4 > >> %2 = getelementptr [8 x i8]* %arg_ptr, i64 1 > >> %3 = bitcast [8 x i8]* %2 to i32* > >> %4 = load i32* %3, align 4 > >> %5 = getelementptr [8 x i8]* %arg_ptr, i64 2 > >> %6 = bitcast [8 x i8]* %5 to float** > >> %7 = load float** %6, align 8 > >> %8 = getelementptr [8 x i8]* %arg_ptr, i64 3 > >> %9 = bitcast [8 x i8]* %8 to float** > >> %10 = load float** %9, align 8 > >> %11 = getelementptr [8 x i8]* %arg_ptr, i64 4 > >> %12 = bitcast [8 x i8]* %11 to float** > >> %13 = load float** %12, align 8 > >> %14 = sext i32 %1 to i64 > >> br label %L0 > >> > >> Now, these pointer (%7,%10,%13) are not qualified with 'restrict' > >> and > >> the loop vectorizer gives me the same message: > >> > >> LV: We can't vectorize because we can't find the array bounds. > >> LV: Can't vectorize due to memory conflicts > >> LV: Not vectorizing. > >> > >> I asked this a few days ago; now it comes up again: Is there a way > >> to > >> qualify a pointer/Value to be 'restrict'? > > Currently, no. There will be work in that direction soon. You'll > > need to extract a sub-function so that you can put 'noalias' on > > the function arguments. > > > >> Another possible solution would be telling the loop vectorizer > >> that > >> it's > >> safe to treat all arrays as disjunct. Is this possible? > > Yes. Look for llvm.mem.parallel_loop_access in the language > > reference. > > > > -Hal > > > >> Frank > >> > >> > >> > >> > >> On 28/10/13 15:11, Hal Finkel wrote: > >>> ----- Original Message ----- > >>>> I am trying to vectorize the function > >>>> > >>>> void bar(float *c, float *a, float *b) > >>>> { > >>>> const int width = 256; > >>>> for (int i = 0 ; i < 256 ; ++i ) { > >>>> c[ i ] = a[ i ] + b[ i ]; > >>>> c[ width + i ] = a[ width + i ] + b[ width + i ]; > >>>> } > >>>> } > >>>> > >>>> using the following commands > >>>> > >>>> clang -emit-llvm -S loop.c > >>>> opt loop.ll -O3 -debug-only=loop-vectorize -S -o - > >>>> > >>>> LV: Checking a loop in "bar" > >>>> LV: Found a loop: for.body > >>>> LV: Found an induction variable. > >>>> LV: Found an unidentified write ptr: float* %c > >>>> LV: Found an unidentified write ptr: float* %c > >>>> LV: Found an unidentified read ptr: float* %a > >>>> LV: Found an unidentified read ptr: float* %b > >>>> LV: Found an unidentified read ptr: float* %a > >>>> LV: Found an unidentified read ptr: float* %b > >>>> LV: Found a runtime check ptr: %arrayidx4 = getelementptr > >>>> inbounds > >>>> float* %c, i64 %indvars.iv > >>>> LV: Found a runtime check ptr: %arrayidx14 = getelementptr > >>>> inbounds > >>>> float* %c, i64 %2 > >>>> LV: Found a runtime check ptr: %arrayidx = getelementptr > >>>> inbounds > >>>> float* %a, i64 %indvars.iv > >>>> LV: Found a runtime check ptr: %arrayidx2 = getelementptr > >>>> inbounds > >>>> float* %b, i64 %indvars.iv > >>>> LV: Found a runtime check ptr: %arrayidx7 = getelementptr > >>>> inbounds > >>>> float* %a, i64 %2 > >>>> LV: Found a runtime check ptr: %arrayidx10 = getelementptr > >>>> inbounds > >>>> float* %b, i64 %2 > >>>> LV: We need to do 10 pointer comparisons. > >>>> LV: We can't vectorize because we can't find the array bounds. > >>>> LV: Can't vectorize due to memory conflicts > >>>> LV: Not vectorizing. > >>>> > >>>> Is there any chance to make this work? > >>> Try adding the restrict keyword to the function parameters: > >>> > >>> void bar(float * restrict c, float * restrict a, float * restrict > >>> b) > >>> > >>> -Hal > >>> > >>>> Frank > >>>> > >>>> _______________________________________________ > >>>> LLVM Developers mailing list > >>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > >>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >>>> > >> > >> > > >-- Hal Finkel Assistant Computational Scientist Leadership Computing Facility Argonne National Laboratory
I am jumping around in memory here. Funny, this appeared after 'jumping
to my subfunction':
--------------------------------------------------------------------------
Sorry! You were supposed to get help about:
mpi-abort
from the file:
help-mpi-api.txt
But I couldn't find that topic in the file. Sorry!
--------------------------------------------------------------------------
Regards the subfunction/main function setup with JIT (original
interface): Is this order correct:?
build subfunction
void* fptr_sub = EE->getPointerToFunction( subfunction );
build main function
void* fptr_main = EE->getPointerToFunction( main function );
call fptr_sub(args); // Here the funny mpi-abort happens.
Not sure if this is correct. First because of the funny business and
second I don't make use of the function pointer to the main function. Is
it correct to JIT it? Do I have to bind it globally to the name
'main_function'?!?
Frank
On 28/10/13 21:23, Hal Finkel wrote:> ----- Original Message -----
>> Thanks for the alternatives!
>>
>> I am trying the 'extracting sub-function' approach. However, it
seems
>> I
>> can't get the 'subfunction' to pass the verifier. This is
my
>> subfunction:
>>
>> define void @main_extern([8 x i8]* %arg_ptr) {
>> entrypoint:
>> %0 = getelementptr [8 x i8]* %arg_ptr, i32 0
>> %1 = bitcast [8 x i8]* %0 to i64*
>> %2 = load i64* %1
>> %3 = getelementptr [8 x i8]* %arg_ptr, i32 1
>> %4 = bitcast [8 x i8]* %3 to i64*
>> %5 = load i64* %4
>> %6 = getelementptr [8 x i8]* %arg_ptr, i32 2
>> %7 = bitcast [8 x i8]* %6 to float**
>> %8 = load float** %7
>> %9 = getelementptr [8 x i8]* %arg_ptr, i32 3
>> %10 = bitcast [8 x i8]* %9 to float**
>> %11 = load float** %10
>> %12 = getelementptr [8 x i8]* %arg_ptr, i32 4
>> %13 = bitcast [8 x i8]* %12 to float**
>> %14 = load float** %13
>> call void @main(i64 %2, i64 %5, float* %8, float* %11, float* %14)
>> ret void
>> }
>>
>> Looks good to me. However the verify pass fails:
>>
>> /svn/llvm/include/llvm/Support/Casting.h:97: static bool
>> llvm::isa_impl_cl<To, const From*>::doit(const From*) [with To
>> llvm::GlobalVariable; From = llvm::GlobalValue]: Assertion `Val
&&
>> "isa<> used on a null pointer"' failed.
>>
>> I have no idea what this tries to tell me. Any idea?
> That's a bug (you're hitting an internal assertion failure). You
could try removing one instruction at a time to try and narrow it down and/or
file a bug report.
>
> -Hal
>
>> Frank
>>
>>
>>
>> On 28/10/13 15:27, Hal Finkel wrote:
>>> ----- Original Message -----
>>>> Bingo! That works (when coming from C source)
>>>>
>>>> Now, I have a serious problem. I am not coming from C but I
build
>>>> the
>>>> function with the builder. I am also forced to change the
>>>> signature
>>>> and
>>>> load the pointers a,b,c afterwards:
>>>>
>>>> define void @bar([8 x i8]* nocapture readonly %arg_ptr) #0 {
>>>> entrypoint:
>>>> %0 = bitcast [8 x i8]* %arg_ptr to i32*
>>>> %1 = load i32* %0, align 4
>>>> %2 = getelementptr [8 x i8]* %arg_ptr, i64 1
>>>> %3 = bitcast [8 x i8]* %2 to i32*
>>>> %4 = load i32* %3, align 4
>>>> %5 = getelementptr [8 x i8]* %arg_ptr, i64 2
>>>> %6 = bitcast [8 x i8]* %5 to float**
>>>> %7 = load float** %6, align 8
>>>> %8 = getelementptr [8 x i8]* %arg_ptr, i64 3
>>>> %9 = bitcast [8 x i8]* %8 to float**
>>>> %10 = load float** %9, align 8
>>>> %11 = getelementptr [8 x i8]* %arg_ptr, i64 4
>>>> %12 = bitcast [8 x i8]* %11 to float**
>>>> %13 = load float** %12, align 8
>>>> %14 = sext i32 %1 to i64
>>>> br label %L0
>>>>
>>>> Now, these pointer (%7,%10,%13) are not qualified with
'restrict'
>>>> and
>>>> the loop vectorizer gives me the same message:
>>>>
>>>> LV: We can't vectorize because we can't find the array
bounds.
>>>> LV: Can't vectorize due to memory conflicts
>>>> LV: Not vectorizing.
>>>>
>>>> I asked this a few days ago; now it comes up again: Is there a
way
>>>> to
>>>> qualify a pointer/Value to be 'restrict'?
>>> Currently, no. There will be work in that direction soon.
You'll
>>> need to extract a sub-function so that you can put
'noalias' on
>>> the function arguments.
>>>
>>>> Another possible solution would be telling the loop vectorizer
>>>> that
>>>> it's
>>>> safe to treat all arrays as disjunct. Is this possible?
>>> Yes. Look for llvm.mem.parallel_loop_access in the language
>>> reference.
>>>
>>> -Hal
>>>
>>>> Frank
>>>>
>>>>
>>>>
>>>>
>>>> On 28/10/13 15:11, Hal Finkel wrote:
>>>>> ----- Original Message -----
>>>>>> I am trying to vectorize the function
>>>>>>
>>>>>> void bar(float *c, float *a, float *b)
>>>>>> {
>>>>>> const int width = 256;
>>>>>> for (int i = 0 ; i < 256 ; ++i ) {
>>>>>> c[ i ] = a[ i ] + b[ i ];
>>>>>> c[ width + i ] = a[ width + i ] + b[ width + i
];
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> using the following commands
>>>>>>
>>>>>> clang -emit-llvm -S loop.c
>>>>>> opt loop.ll -O3 -debug-only=loop-vectorize -S -o -
>>>>>>
>>>>>> LV: Checking a loop in "bar"
>>>>>> LV: Found a loop: for.body
>>>>>> LV: Found an induction variable.
>>>>>> LV: Found an unidentified write ptr: float* %c
>>>>>> LV: Found an unidentified write ptr: float* %c
>>>>>> LV: Found an unidentified read ptr: float* %a
>>>>>> LV: Found an unidentified read ptr: float* %b
>>>>>> LV: Found an unidentified read ptr: float* %a
>>>>>> LV: Found an unidentified read ptr: float* %b
>>>>>> LV: Found a runtime check ptr: %arrayidx4 =
getelementptr
>>>>>> inbounds
>>>>>> float* %c, i64 %indvars.iv
>>>>>> LV: Found a runtime check ptr: %arrayidx14 =
getelementptr
>>>>>> inbounds
>>>>>> float* %c, i64 %2
>>>>>> LV: Found a runtime check ptr: %arrayidx =
getelementptr
>>>>>> inbounds
>>>>>> float* %a, i64 %indvars.iv
>>>>>> LV: Found a runtime check ptr: %arrayidx2 =
getelementptr
>>>>>> inbounds
>>>>>> float* %b, i64 %indvars.iv
>>>>>> LV: Found a runtime check ptr: %arrayidx7 =
getelementptr
>>>>>> inbounds
>>>>>> float* %a, i64 %2
>>>>>> LV: Found a runtime check ptr: %arrayidx10 =
getelementptr
>>>>>> inbounds
>>>>>> float* %b, i64 %2
>>>>>> LV: We need to do 10 pointer comparisons.
>>>>>> LV: We can't vectorize because we can't find
the array bounds.
>>>>>> LV: Can't vectorize due to memory conflicts
>>>>>> LV: Not vectorizing.
>>>>>>
>>>>>> Is there any chance to make this work?
>>>>> Try adding the restrict keyword to the function parameters:
>>>>>
>>>>> void bar(float * restrict c, float * restrict a, float *
restrict
>>>>> b)
>>>>>
>>>>> -Hal
>>>>>
>>>>>> Frank
>>>>>>
>>>>>> _______________________________________________
>>>>>> LLVM Developers mailing list
>>>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>
>>>>
>>
>>