[cfe-dev] Clang generates calls to llvm.memcpy with overlapping arguments, but LangRef requires the arguments to not overlap
Florian Hahn via cfe-dev
cfe-dev at lists.llvm.org
Tue Aug 25 10:53:25 PDT 2020
Hi,
It appears that Clang generates calls to `llvm.memcpy` with potentially overlapping arguments in some cases.
For the snippet below
struct S
{
char s[25];
};
struct S *p;
void test2() {
...
foo (&b, 1);
b = a;
b = *p;
...
}
Clang uses `llvm.memcpy` to copy the struct:
call void @foo(%struct.S* %2, i32 1)
%7 = bitcast %struct.S* %2 to i8*
%8 = bitcast %struct.S* %1 to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %7, i8* align 1 %8, i64 25, i1 false)
%9 = load %struct.S*, %struct.S** @p, align 8
%10 = bitcast %struct.S* %2 to i8*
%11 = bitcast %struct.S* %9 to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 1 %10, i8* align 1 %11, i64 25, i1 false)
In the C example, `foo` could set `p = &b` and then `b = *p` would just copy the contents from `b` into `b`. This means that the the arguments to the second llvm.memcpy call may overlap, which seems not allowed according to the current version of the LangRef (https://llvm.org/docs/LangRef.html#llvm-memcpy-intrinsic). This is problematic, because the fact is used in BasicAliasAnalysis for example (https://github.com/llvm/llvm-project/blob/master/llvm/lib/Analysis/BasicAliasAnalysis.cpp#L982).
The full, build-able example can be found here: https://godbolt.org/z/PY1vKq
I might be missing something, but it appears that Clang should not create call to `llvm.memcpy` unless it can guarantee the arguments cannot overlap. I am not sure what the best alternative to `llvm.memcpy` would be in case the arguments overlap.
Cheers,
Florian
More information about the cfe-dev
mailing list