aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp3
-rw-r--r--clang/test/CodeGenCXX/ctor-this-noalias.cpp14
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];
+}