Skip to content

Commit 2d1cd65

Browse files
committed
[GlobalOpt] Fix global SRA incorrect use of original alignment on some elements
The logic had a flaw where the alignment from the original aggregate is unintentionally retained when the calculated known alignment is not higher than the ABI type alignment. Fixes #115282
1 parent 3d0b283 commit 2d1cd65

File tree

4 files changed

+10
-9
lines changed

4 files changed

+10
-9
lines changed

llvm/lib/Transforms/IPO/GlobalOpt.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -575,15 +575,16 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {
575575
*GV->getParent(), Ty, false, GlobalVariable::InternalLinkage,
576576
Initializer, GV->getName() + "." + Twine(NameSuffix++), GV,
577577
GV->getThreadLocalMode(), GV->getAddressSpace());
578+
// Start out by copying attributes from the original, including alignment.
578579
NGV->copyAttributesFrom(GV);
579580
NewGlobals.insert({OffsetForTy, NGV});
580581

581582
// Calculate the known alignment of the field. If the original aggregate
582-
// had 256 byte alignment for example, something might depend on that:
583+
// had 256 byte alignment for example, then the element at a given offset
584+
// may also have a known alignment, and something might depend on that:
583585
// propagate info to each field.
584586
Align NewAlign = commonAlignment(StartAlignment, OffsetForTy);
585-
if (NewAlign > DL.getABITypeAlign(Ty))
586-
NGV->setAlignment(NewAlign);
587+
NGV->setAlignment(std::max(NewAlign, DL.getABITypeAlign(Ty)));
587588

588589
// Copy over the debug info for the variable.
589590
transferSRADebugInfo(GV, NGV, OffsetForTy * 8,

llvm/test/DebugInfo/X86/global-sra-struct-fit-segment.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
%struct.BSS1 = type <{ [12 x i8] }>
2121

2222
;CHECK: @.BSS1.0 = internal unnamed_addr global i32 0, align 32, !dbg ![[GVE1:.*]]
23-
;CHECK: @.BSS1.1 = internal unnamed_addr global i32 0, align 32, !dbg ![[GVE2:.*]], !dbg ![[GVE4:.*]]
23+
;CHECK: @.BSS1.1 = internal unnamed_addr global i32 0, align 4, !dbg ![[GVE2:.*]], !dbg ![[GVE4:.*]]
2424
;CHECK: @.BSS1.2 = internal unnamed_addr global i32 0, align 8, !dbg ![[GVE3:.*]]
2525

2626
@.BSS1 = internal global %struct.BSS1 zeroinitializer, align 32, !dbg !0, !dbg !7, !dbg !10, !dbg !27, !dbg !29

llvm/test/DebugInfo/X86/global-sra-struct-part-overlap-segment.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
@.BSS3 = internal unnamed_addr global %struct.BSS3 zeroinitializer, align 32, !dbg !0, !dbg !7, !dbg !29
2828
;CHECK: @.BSS3.0 = internal unnamed_addr global double 0.000000e+00, align 32, !dbg ![[GVE1:.*]], !dbg ![[GVE2:.*]]
29-
;CHECK: @.BSS3.1 = internal unnamed_addr global double 0.000000e+00, align 32, !dbg ![[GVE3:.*]], !dbg ![[GVE4:.*]], !dbg ![[GVE6:.*]]
29+
;CHECK: @.BSS3.1 = internal unnamed_addr global double 0.000000e+00, align 8, !dbg ![[GVE3:.*]], !dbg ![[GVE4:.*]], !dbg ![[GVE6:.*]]
3030
;CHECK: @.BSS3.2 = internal unnamed_addr global double 0.000000e+00, align 16, !dbg ![[GVE5:.*]]
3131

3232
@.C363_mymod_bar_ = internal constant [2 x i8] c"IF"

llvm/test/Transforms/GlobalOpt/globalsra-align.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ target datalayout = "p:16:32:64" ; 16-bit pointers with 32-bit ABI alignment and
1515

1616
;.
1717
; CHECK: @[[A_4:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 8
18-
; CHECK: @[[A_5:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
18+
; CHECK: @[[A_5:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 8
1919
; CHECK: @[[A_6:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
20-
; CHECK: @[[A_7:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
20+
; CHECK: @[[A_7:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 8
2121
;.
2222
define ptr @reduce_align_0() {
2323
; CHECK-LABEL: @reduce_align_0(
@@ -31,7 +31,7 @@ define ptr @reduce_align_0() {
3131

3232
define ptr @reduce_align_1() {
3333
; CHECK-LABEL: @reduce_align_1(
34-
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.5, align 16
34+
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.5, align 8
3535
; CHECK-NEXT: ret ptr [[X]]
3636
;
3737
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 1), align 4
@@ -51,7 +51,7 @@ define ptr @reduce_align_2() {
5151

5252
define ptr @reduce_align_3() {
5353
; CHECK-LABEL: @reduce_align_3(
54-
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.7, align 16
54+
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.7, align 8
5555
; CHECK-NEXT: ret ptr [[X]]
5656
;
5757
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 3), align 4

0 commit comments

Comments
 (0)