diff options
| author | Hans Wennborg <hans@hanshq.net> | 2017-08-28 17:53:00 +0000 |
|---|---|---|
| committer | Hans Wennborg <hans@hanshq.net> | 2017-08-28 17:53:00 +0000 |
| commit | edd66ab9dc2345e989b59578c8f4d41fe36d8272 (patch) | |
| tree | 3681be8abedb4ed8c354c041edddf24cf4781489 | |
| parent | dad7cf62de5e8b0b03f8fdd6b6e2da887bfb4892 (diff) | |
| download | bcm5719-llvm-edd66ab9dc2345e989b59578c8f4d41fe36d8272.tar.gz bcm5719-llvm-edd66ab9dc2345e989b59578c8f4d41fe36d8272.zip | |
Revert r311857 "Emit static constexpr member as available_externally definition"
It caused PR759744.
> Emit static constexpr member as available_externally definition
>
> By exposing the constant initializer, the optimizer can fold many
> of these constructs.
>
> Differential Revision: https://reviews.llvm.org/D34992
llvm-svn: 311898
| -rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 22 | ||||
| -rw-r--r-- | clang/test/CodeGenCXX/cxx11-extern-constexpr.cpp | 55 |
2 files changed, 0 insertions, 77 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 5feb6b4d768..c726d90f2e3 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2437,28 +2437,6 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName, D->getType().isConstant(Context) && isExternallyVisible(D->getLinkageAndVisibility().getLinkage())) GV->setSection(".cp.rodata"); - - // Check if we a have a const declaration with an initializer, we may be - // able to emit it as available_externally to expose it's value to the - // optimizer. - if (Context.getLangOpts().CPlusPlus && GV->hasExternalLinkage() && - D->getType().isConstQualified() && !GV->hasInitializer() && - !D->hasDefinition() && D->hasInit() && !D->hasAttr<DLLImportAttr>()) { - const auto *Record = - Context.getBaseElementType(D->getType())->getAsCXXRecordDecl(); - bool HasMutableFields = Record && Record->hasMutableFields(); - if (!HasMutableFields) { - const VarDecl *InitDecl; - const Expr *InitExpr = D->getAnyInitializer(InitDecl); - if (InitExpr) { - GV->setConstant(true); - GV->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage); - ConstantEmitter emitter(*this); - GV->setInitializer(emitter.tryEmitForInitializer(*InitDecl)); - emitter.finalize(GV); - } - } - } } auto ExpectedAS = diff --git a/clang/test/CodeGenCXX/cxx11-extern-constexpr.cpp b/clang/test/CodeGenCXX/cxx11-extern-constexpr.cpp deleted file mode 100644 index 2aae99f6d9c..00000000000 --- a/clang/test/CodeGenCXX/cxx11-extern-constexpr.cpp +++ /dev/null @@ -1,55 +0,0 @@ -// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK --check-prefix=CXX11 -// RUN: %clang_cc1 -std=c++1z %s -emit-llvm -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK --check-prefix=CXX17 - -struct A { - static const int Foo = 123; -}; -// CHECK: @_ZN1A3FooE = constant i32 123, align 4 -const int *p = &A::Foo; // emit available_externally -const int A::Foo; // convert to full definition - -struct Bar { - int b; -}; - -struct MutableBar { - mutable int b; -}; - -struct Foo { - // CXX11: @_ZN3Foo21ConstexprStaticMemberE = available_externally constant i32 42, - // CXX17: @_ZN3Foo21ConstexprStaticMemberE = linkonce_odr constant i32 42, - static constexpr int ConstexprStaticMember = 42; - // CHECK: @_ZN3Foo17ConstStaticMemberE = available_externally constant i32 43, - static const int ConstStaticMember = 43; - - // CXX11: @_ZN3Foo23ConstStaticStructMemberE = available_externally constant %struct.Bar { i32 44 }, - // CXX17: @_ZN3Foo23ConstStaticStructMemberE = linkonce_odr constant %struct.Bar { i32 44 }, - static constexpr Bar ConstStaticStructMember = {44}; - - // CXX11: @_ZN3Foo34ConstexprStaticMutableStructMemberE = external global %struct.MutableBar, - // CXX17: @_ZN3Foo34ConstexprStaticMutableStructMemberE = linkonce_odr global %struct.MutableBar { i32 45 }, - static constexpr MutableBar ConstexprStaticMutableStructMember = {45}; -}; -// CHECK: @_ZL15ConstStaticexpr = internal constant i32 46, -static constexpr int ConstStaticexpr = 46; -// CHECK: @_ZL9ConstExpr = internal constant i32 46, align 4 -static const int ConstExpr = 46; - -// CHECK: @_ZL21ConstexprStaticStruct = internal constant %struct.Bar { i32 47 }, -static constexpr Bar ConstexprStaticStruct = {47}; - -// CHECK: @_ZL28ConstexprStaticMutableStruct = internal global %struct.MutableBar { i32 48 }, -static constexpr MutableBar ConstexprStaticMutableStruct = {48}; - -void use(const int &); -void foo() { - use(Foo::ConstexprStaticMember); - use(Foo::ConstStaticMember); - use(Foo::ConstStaticStructMember.b); - use(Foo::ConstexprStaticMutableStructMember.b); - use(ConstStaticexpr); - use(ConstExpr); - use(ConstexprStaticStruct.b); - use(ConstexprStaticMutableStruct.b); -} |

