Index: lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- lib/Transforms/IPO/GlobalOpt.cpp +++ lib/Transforms/IPO/GlobalOpt.cpp @@ -78,6 +78,7 @@ STATISTIC(NumMarked , "Number of globals marked constant"); STATISTIC(NumUnnamed , "Number of globals marked unnamed_addr"); +STATISTIC(NumHidden , "Number of globals marked hidden visibility"); STATISTIC(NumSRA , "Number of aggregate globals broken into scalars"); STATISTIC(NumHeapSRA , "Number of heap objects SRA'd"); STATISTIC(NumSubstitute,"Number of globals with initializers stored into them"); @@ -2066,6 +2067,15 @@ } } + // For the linkonce_odr that marked with global unnamed addr, they are safe + // to be hidden. + if (GV.hasGlobalUnnamedAddr() && GV.hasLinkOnceODRLinkage() && + !GV.hasHiddenVisibility()) { + GV.setVisibility(GlobalValue::HiddenVisibility); + NumHidden++; + Changed = true; + } + // Do more involved optimizations if the global is internal. if (!GV.hasLocalLinkage()) return Changed; Index: test/Transforms/GlobalOpt/unnamed-addr.ll =================================================================== --- test/Transforms/GlobalOpt/unnamed-addr.ll +++ test/Transforms/GlobalOpt/unnamed-addr.ll @@ -5,12 +5,14 @@ @c = internal global i32 0, align 4 @d = internal constant [4 x i8] c"foo\00", align 1 @e = linkonce_odr global i32 0 +@f = linkonce_odr unnamed_addr global i32 0 ; CHECK: @a = internal global i32 0, align 4 ; CHECK: @b = internal global i32 0, align 4 ; CHECK: @c = internal unnamed_addr global i32 0, align 4 ; CHECK: @d = internal unnamed_addr constant [4 x i8] c"foo\00", align 1 ; CHECK: @e = linkonce_odr local_unnamed_addr global i32 0 +; CHECK: @f = linkonce_odr hidden unnamed_addr global i32 0 ; CHECK: define internal fastcc void @used_internal() unnamed_addr { define internal void @used_internal() { @@ -43,6 +45,7 @@ store i32 %x, i32* @a, align 4 store i32 %x, i32* @b, align 4 store i32 %x, i32* @c, align 4 + store i32 %x, i32* @f, align 4 ret void }