Index: llvm/lib/Transforms/IPO/GlobalOpt.cpp =================================================================== --- llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -630,6 +630,23 @@ } GEP->replaceAllUsesWith(NewPtr); + // We changed the pointer of any memory access user. Recalculate alignments. + for (User *U : NewPtr->users()) { + if (auto *Load = dyn_cast(U)) { + Align PrefAlign = DL.getPrefTypeAlign(Load->getType()); + Align NewAlign = getOrEnforceKnownAlignment(Load->getPointerOperand(), + PrefAlign, DL, Load); + Load->setAlignment(NewAlign); + } + if (auto *Store = dyn_cast(U)) { + Align PrefAlign = + DL.getPrefTypeAlign(Store->getValueOperand()->getType()); + Align NewAlign = getOrEnforceKnownAlignment(Store->getPointerOperand(), + PrefAlign, DL, Store); + Store->setAlignment(NewAlign); + } + } + if (GetElementPtrInst *GEPI = dyn_cast(GEP)) GEPI->eraseFromParent(); else Index: llvm/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll =================================================================== --- llvm/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll +++ llvm/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll @@ -17,7 +17,9 @@ @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }] @llvm.used = appending global [2 x i8*] [i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0), i8* bitcast (i8** @"\01L_OBJC_SELECTOR_REFERENCES_41" to i8*)] -; CHECK: @[[_ZL14BUTTONINITDATA_0_0:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i8* null, align 4 +; Choose the preferred alignment. + +; CHECK: @[[_ZL14BUTTONINITDATA_0_0:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i8* null, align 16 ;. define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" { %1 = load i8*, i8** @"\01L_OBJC_SELECTOR_REFERENCES_41", !invariant.load !2009 @@ -32,9 +34,11 @@ declare void @test(i8*) +; The preferred alignment is available. + define void @print() { ; CHECK-LABEL: @print( -; CHECK-NEXT: [[TMP1:%.*]] = load i8*, i8** @_ZL14buttonInitData.0.0, align 4 +; CHECK-NEXT: [[TMP1:%.*]] = load i8*, i8** @_ZL14buttonInitData.0.0, align 16 ; CHECK-NEXT: call void @test(i8* [[TMP1]]) ; CHECK-NEXT: ret void ; Index: llvm/test/Transforms/GlobalOpt/globalsra-align.ll =================================================================== --- llvm/test/Transforms/GlobalOpt/globalsra-align.ll +++ llvm/test/Transforms/GlobalOpt/globalsra-align.ll @@ -5,7 +5,6 @@ @a = internal global [2 x [7 x i32*]] zeroinitializer, align 16 -; FIXME: ; PR50253 ; The store alignments are correct initially, but they should be updated ; after transforming the global. The global pointer retains its original @@ -17,7 +16,7 @@ ;. define i32* @reduce_align_0() { ; CHECK-LABEL: @reduce_align_0( -; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 0), align 4 +; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 0), align 16 ; CHECK-NEXT: ret i32* null ; %x = load i32*, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 0, i64 0), align 1 @@ -27,7 +26,7 @@ define i32* @reduce_align_1() { ; CHECK-LABEL: @reduce_align_1( -; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 1), align 16 +; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 1), align 4 ; CHECK-NEXT: ret i32* null ; %x = load i32*, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 0, i64 0), align 1 @@ -37,7 +36,7 @@ define i32* @reduce_align_2() { ; CHECK-LABEL: @reduce_align_2( -; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 2), align 4 +; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 2), align 8 ; CHECK-NEXT: ret i32* null ; %x = load i32*, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 0, i64 0), align 1 @@ -47,7 +46,7 @@ define i32* @reduce_align_3() { ; CHECK-LABEL: @reduce_align_3( -; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 3), align 8 +; CHECK-NEXT: store i32* null, i32** getelementptr inbounds ([7 x i32*], [7 x i32*]* @a.1, i32 0, i64 3), align 4 ; CHECK-NEXT: ret i32* null ; %x = load i32*, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 0, i64 0), align 1