[llvm-dev] One more Question about handling pointer with restrict keyword on Alias Analysis
jingu@codeplay.com via llvm-dev
llvm-dev at lists.llvm.org
Thu Jun 28 08:27:11 PDT 2018
Hi All,
I have a question about handling pointer on Alias Analysis. Let's look
at simple code snippet.
struct element {
char fieldA;
char fieldB;
};
char c;
void test(int idx, struct element *restrict *restrict buf1,
struct element *restrict *restrict buf2) {
struct element *a = buf1[idx];
struct element *b = buf2[idx];
a->fieldA = b->fieldB;
c++;
a->fieldA = b->fieldB | 1;
}
The IR snippet is as following:
%struct.element = type { i8, i8 }
@c = common local_unnamed_addr global i8 0, align 1
define void @test(i32, %struct.element** noalias nocapture readonly,
%struct.element** noalias nocapture readonly) local_unnamed_addr #0 {
%4 = sext i32 %0 to i64
%5 = getelementptr inbounds %struct.element*, %struct.element** %1,
i64 %4
%6 = load %struct.element*, %struct.element** %5, align 8, !tbaa !2
%7 = getelementptr inbounds %struct.element*, %struct.element** %2,
i64 %4
%8 = load %struct.element*, %struct.element** %7, align 8, !tbaa !2
%9 = getelementptr inbounds %struct.element, %struct.element* %8, i64
0, i32 1
%10 = load i8, i8* %9, align 1, !tbaa !6
%11 = getelementptr inbounds %struct.element, %struct.element* %6,
i64 0, i32 0
store i8 %10, i8* %11, align 1, !tbaa !8
%12 = load i8, i8* @c, align 1, !tbaa !9
%13 = add i8 %12, 1
store i8 %13, i8* @c, align 1, !tbaa !9
%14 = or i8 %10, 1
store i8 %14, i8* %11, align 1, !tbaa !8
ret void
}
The result of AliasSet is as below.
Alias sets for function 'test':
Alias Set Tracker: 4 alias sets for 5 pointer values.
AliasSet[0x64ac600, 1] must alias, Ref Pointers:
(%struct.element** %5, 8)
AliasSet[0x64aa990, 1] must alias, Ref Pointers:
(%struct.element** %7, 8)
AliasSet[0x64ab320, 1] must alias, Ref Pointers: (i8* %9, 1)
AliasSet[0x64ac800, 2] may alias, Mod/Ref Pointers: (i8* %11, 1),
(i8* @c, 1)
As you can see, there is 'May-Alias' between %11 and @c. I think we
could say 'No-Alias' between them because of the restrict keyword. It
seems the basicAA does not go through 'load' instruction with its
recursive way and GetUnderlyingObject. I am not sure why it does not
always go though it. Is there something illegal to do it? Could someone
let me know it please? If I missed something, please let me know.
Thanks,
JinGu Kang
More information about the llvm-dev
mailing list