mizvekov updated this revision to Diff 356409. mizvekov marked an inline comment as done. mizvekov added a comment.
format. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D105380/new/ https://reviews.llvm.org/D105380 Files: clang/include/clang/Sema/Sema.h clang/lib/Sema/SemaDecl.cpp clang/lib/Sema/SemaStmt.cpp clang/test/CodeGen/nrvo-tracking.cpp
Index: clang/test/CodeGen/nrvo-tracking.cpp =================================================================== --- clang/test/CodeGen/nrvo-tracking.cpp +++ clang/test/CodeGen/nrvo-tracking.cpp @@ -1,9 +1,9 @@ // RUN: %clang_cc1 -std=c++20 -fblocks -Wno-return-stack-address -triple x86_64-unknown-unknown-gnu -emit-llvm -O1 -fexperimental-new-pass-manager -o - %s | FileCheck %s -struct X { - X(); - X(const X&); - X(X&&); +struct alignas(4) X { + X(); + X(const X &); + X(X &&); }; #define L(A, B, C) void l##A() { \ @@ -210,3 +210,75 @@ }; }()(); } + +namespace test_alignas { + +template <int A> X t1() { + X a [[gnu::aligned(A)]]; + return a; +} + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi1EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: ret void +template X t1<1>(); + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi4EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: ret void +template X t1<4>(); + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t1ILi8EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_ +// CHECK-NEXT: call void @llvm.lifetime.end +template X t1<8>(); + +template <int A> X t2() { + X a [[gnu::aligned(1)]] [[gnu::aligned(A)]] [[gnu::aligned(2)]]; + return a; +} + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi1EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: ret void +template X t2<1>(); + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi4EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: ret void +template X t2<4>(); + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t2ILi8EEE1Xv +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_ +// CHECK-NEXT: call void @llvm.lifetime.end +template X t2<8>(); + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t3Ev +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: ret void +X t3() { + X a [[gnu::aligned(1)]]; + return a; +} + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t4Ev +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_ +// CHECK-NEXT: call void @llvm.lifetime.end +X t4() { + X a [[gnu::aligned(8)]]; + return a; +} + +// CHECK-LABEL: define{{.*}} void @_ZN12test_alignas2t5Ev +// CHECK: call {{.*}} @_ZN1XC1Ev +// CHECK-NEXT: call {{.*}} @_ZN1XC1EOS_ +// CHECK-NEXT: call void @llvm.lifetime.end +X t5() { + X a [[gnu::aligned(1)]] [[gnu::aligned(8)]]; + return a; +} + +} // namespace test_alignas Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -3395,7 +3395,7 @@ // Variables with higher required alignment than their type's ABI // alignment cannot use NRVO. - if (!VDType->isDependentType() && VD->hasAttr<AlignedAttr>() && + if (!hasDependentAlignment(VD) && Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType)) Info.S = NamedReturnInfo::MoveEligible; Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -13310,14 +13310,12 @@ CheckCompleteDecompositionDeclaration(DD); } -/// Determines if a variable's alignment is dependent. -static bool hasDependentAlignment(VarDecl *VD) { - if (VD->getType()->isDependentType()) - return true; - for (auto *I : VD->specific_attrs<AlignedAttr>()) - if (I->isAlignmentDependent()) - return true; - return false; +bool Sema::hasDependentAlignment(const VarDecl *VD) { + const auto &range = VD->specific_attrs<AlignedAttr>(); + return VD->getType()->isDependentType() || + std::any_of(range.begin(), range.end(), [](const AlignedAttr *AA) { + return AA->isAlignmentDependent(); + }); } /// Check if VD needs to be dllexport/dllimport due to being in a Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -2666,6 +2666,9 @@ /// it looks like the user is trying to modify the shadowing declaration. llvm::DenseMap<const NamedDecl *, const NamedDecl *> ShadowingDecls; + /// Determines if a variable's alignment is dependent. + static bool hasDependentAlignment(const VarDecl *VD); + public: void CheckCastAlign(Expr *Op, QualType T, SourceRange TRange); void handleTagNumbering(const TagDecl *Tag, Scope *TagScope);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits