diff --git a/llvm/test/Transforms/GlobalOpt/globalsra-align.ll b/llvm/test/Transforms/GlobalOpt/globalsra-align.ll new file mode 100644 index 0000000000000..47e197128389b --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/globalsra-align.ll @@ -0,0 +1,56 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals +; RUN: opt < %s -globalopt -S | FileCheck %s + +target datalayout = "p:16:32:64" ; 16-bit pointers with 32-bit ABI alignment and 64-bit preferred alignmentt + +@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 +; "align 16", so access to element N into the new array should be offset +; by the ABI alignment of N pointers. + +;. +; CHECK: @[[A_1:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global [7 x i32*] zeroinitializer, align 16 +;. +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: 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 + store i32* null, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 1, i64 0), align 4 + ret i32* %x +} + +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: 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 + store i32* null, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 1, i64 1), align 16 + ret i32* %x +} + +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: 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 + store i32* null, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 1, i64 2), align 4 + ret i32* %x +} + +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: 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 + store i32* null, i32** getelementptr inbounds ([2 x [7 x i32*]], [2 x [7 x i32*]]* @a, i64 0, i64 1, i64 3), align 8 + ret i32* %x +}