[llvm-dev] Question on Aliasing and invariant load hoisting
Doerfert, Johannes via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 8 12:31:50 PDT 2019
The whole object "escapes" into bar as it can be defined similar to the code below:
void bar(int *x) {
struct st *ST = ((char*)x) - offsetof(struct st, b));
ptr = &ST->a;
*ptr = 999; // Initial upper bound, overwritten by ptr[0] = 0;
}
---------------------------------------
Johannes Doerfert
Researcher
Argonne National Laboratory
Lemont, IL 60439, USA
jdoerfert at anl.gov
________________________________________
From: llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Venkataramanan Kumar via llvm-dev <llvm-dev at lists.llvm.org>
Sent: Monday, July 8, 2019 13:31
To: llvm-dev
Subject: [llvm-dev] Question on Aliasing and invariant load hoisting
Hi,
I have the below test case.
--snip--
struct st {
int a;
int b;
};
int * ptr;
int x,y;
void bar(int *x);
void foo() {
struct st obj;
bar(&obj.b);
if(x)
obj.a =x;
else
obj.a =y;
for (int i=0; i<obj.a;i++)
ptr[i]=i;
}
--snip--
LLVM IR produced at -O3 is shown below.
ref: https://godbolt.org/z/WPlmfr
--Snip--
%8 = getelementptr inbounds %struct.st<http://struct.st>, %struct.st<http://struct.st>* %1, i64 0, i32 0, !dbg !39
store i32 %7, i32* %8, align 4, !dbg !40
call void @llvm.dbg.value(metadata i32 0, metadata !26, metadata !DIExpression()), !dbg !41
%9 = icmp sgt i32 %7, 0, !dbg !42
br i1 %9, label %10, label %12, !dbg !44
%11 = load i32*, i32** @ptr, align 8, !tbaa !45
br label %13, !dbg !44
call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull %2) #4, !dbg !47
ret void, !dbg !47
%14 = phi i64 [ 0, %10 ], [ %17, %13 ]
call void @llvm.dbg.value(metadata i64 %14, metadata !26, metadata !DIExpression()), !dbg !41
%15 = getelementptr inbounds i32, i32* %11, i64 %14, !dbg !48
%16 = trunc i64 %14 to i32, !dbg !49
store i32 %16, i32* %15, align 4, !dbg !49, !tbaa !33
%17 = add nuw nsw i64 %14, 1, !dbg !50
call void @llvm.dbg.value(metadata i32 undef, metadata !26, metadata !DIExpression(DW_OP_plus_uconst, 1, DW_OP_stack_value)), !dbg !41
%18 = load i32, i32* %8, align 4, !dbg !51, !tbaa !52
%19 = sext i32 %18 to i64, !dbg !42
%20 = icmp slt i64 %17, %19, !dbg !42
br i1 %20, label %13, label %12, !dbg !44, !llvm.loop !54
}
--Snip---
Question is why the load IR and sext IR (obj.a) is not getting hoisted out of the loop?
--Snip--
%18 = load i32, i32* %8, align 4, !dbg !51, !tbaa !52
%19 = sext i32 %18 to i64, !dbg !42
--Snip
is it because the "obj.a" can alias with "ptr" ?
We are passing only "&obj.b" to bar. But still variable "ptr" is considered to be aliasing with "obj.a" ?
regards,
Venkat.
More information about the llvm-dev
mailing list