This repository has been archived by the owner on Apr 23, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Internalize: internalize comdat members as a group, and drop comdat o…
…n such members. Internalizing an individual comdat group member without also internalizing the other members of the comdat can break comdat semantics. For example, if a module contains a reference to an internalized comdat member, and the linker chooses a comdat group from a different object file, this will break the reference to the internalized member. This change causes the internalizer to only internalize comdat members if all other members of the comdat are not externally visible. Once a comdat group has been fully internalized, there is no need to apply comdat rules to its members; later optimization passes (e.g. globaldce) can legally drop individual members of the comdat. So we drop the comdat attribute from all comdat members. Differential Revision: http://reviews.llvm.org/D10679 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242423 91177308-0d34-0410-b5e6-96231b3b80d8
- Loading branch information
Showing
2 changed files
with
123 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
; RUN: opt < %s -internalize -internalize-public-api-list c1 -internalize-public-api-list c2 -internalize-public-api-list c3 -internalize-public-api-list c4 -S | FileCheck %s | ||
|
||
$c1 = comdat any | ||
$c2 = comdat any | ||
$c3 = comdat any | ||
$c4 = comdat any | ||
|
||
; CHECK: @c1_c = global i32 0, comdat($c1) | ||
@c1_c = global i32 0, comdat($c1) | ||
|
||
; CHECK: @c2_b = internal global i32 0{{$}} | ||
@c2_b = global i32 0, comdat($c2) | ||
|
||
; CHECK: @c3 = global i32 0, comdat{{$}} | ||
@c3 = global i32 0, comdat | ||
|
||
; CHECK: @c4_a = internal global i32 0, comdat($c4) | ||
@c4_a = internal global i32 0, comdat($c4) | ||
|
||
; CHECK: @c1_d = alias i32* @c1_c | ||
@c1_d = alias i32* @c1_c | ||
|
||
; CHECK: @c2_c = internal alias i32* @c2_b | ||
@c2_c = alias i32* @c2_b | ||
|
||
; CHECK: @c4 = alias i32* @c4_a | ||
@c4 = alias i32* @c4_a | ||
|
||
; CHECK: define void @c1() comdat { | ||
define void @c1() comdat { | ||
ret void | ||
} | ||
|
||
; CHECK: define void @c1_a() comdat($c1) { | ||
define void @c1_a() comdat($c1) { | ||
ret void | ||
} | ||
|
||
; CHECK: define internal void @c2() { | ||
define internal void @c2() comdat { | ||
ret void | ||
} | ||
|
||
; CHECK: define internal void @c2_a() { | ||
define void @c2_a() comdat($c2) { | ||
ret void | ||
} | ||
|
||
; CHECK: define void @c3_a() comdat($c3) { | ||
define void @c3_a() comdat($c3) { | ||
ret void | ||
} |