diff options
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 3 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/ctor-this-noalias.cpp | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index b2fe917..a661a5d 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -1560,6 +1560,9 @@ void CodeGenFunction::GenerateCode(GlobalDecl GD, llvm::Function *Fn, // Emit the standard function prologue. StartFunction(GD, ResTy, Fn, FnInfo, Args, Loc, BodyRange.getBegin()); + if (isa<CXXConstructorDecl>(FD)) + Fn->addParamAttr(0, llvm::Attribute::NoAlias); + // Save parameters for coroutine function. if (Body && isa_and_nonnull<CoroutineBodyStmt>(Body)) llvm::append_range(FnArgs, FD->parameters()); diff --git a/clang/test/CodeGenCXX/ctor-this-noalias.cpp b/clang/test/CodeGenCXX/ctor-this-noalias.cpp new file mode 100644 index 0000000..cc85d7b --- /dev/null +++ b/clang/test/CodeGenCXX/ctor-this-noalias.cpp @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s + +struct A { + float elements[4]; + A(float const *src); +}; + +// CHECK: define {{.*}} @_ZN1AC1EPKf(ptr {{.*}}noalias{{.*}} %this, {{.*}}) +A::A(float const *src) { + elements[0] = src[0]; + elements[1] = src[1]; + elements[2] = src[2]; + elements[3] = src[3]; +} |