[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