I reverted this in r311898 as it caused Chromium builds to fail with an assertion; see PR34348.
On Sun, Aug 27, 2017 at 1:24 PM, Mehdi Amini via cfe-commits <cfe-commits@lists.llvm.org> wrote: > Author: mehdi_amini > Date: Sun Aug 27 13:24:09 2017 > New Revision: 311857 > > URL: http://llvm.org/viewvc/llvm-project?rev=311857&view=rev > Log: > 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 > > Added: > cfe/trunk/test/CodeGenCXX/cxx11-extern-constexpr.cpp > Modified: > cfe/trunk/lib/CodeGen/CodeGenModule.cpp > > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=311857&r1=311856&r2=311857&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original) > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sun Aug 27 13:24:09 2017 > @@ -2437,6 +2437,28 @@ CodeGenModule::GetOrCreateLLVMGlobal(Str > 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 = > > Added: cfe/trunk/test/CodeGenCXX/cxx11-extern-constexpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/cxx11-extern-constexpr.cpp?rev=311857&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/cxx11-extern-constexpr.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/cxx11-extern-constexpr.cpp Sun Aug 27 13:24:09 > 2017 > @@ -0,0 +1,55 @@ > +// 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); > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits