diff options
author | Guy David <guyda96@gmail.com> | 2025-04-23 02:24:41 +0300 |
---|---|---|
committer | Guy David <guyda96@gmail.com> | 2025-08-31 14:54:01 +0300 |
commit | fe2994d3638751b15acca112505a23f3e7ab7e98 (patch) | |
tree | 8c430e053016d76839bab5d032763c0557819283 | |
parent | b369237c98906891f9e56fd4be4109a25b79e3e9 (diff) | |
download | llvm-users/guy-david/clang-cpp-ctor-noalias-this-v2.zip llvm-users/guy-david/clang-cpp-ctor-noalias-this-v2.tar.gz llvm-users/guy-david/clang-cpp-ctor-noalias-this-v2.tar.bz2 |
[Clang] Add `noalias` to `this` pointer in C++ constructorsusers/guy-david/clang-cpp-ctor-noalias-this-v2
-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]; +} |