xref: /llvm-project/llvm/test/Transforms/GlobalOpt/globalsra-opaque-ptr.ll (revision d10b76552f919ddb84347ab03908a55804ea6b8a)
14796b4aeSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
2edb2fc6dSNikita Popov; RUN: opt -S -passes=globalopt < %s | FileCheck %s
34796b4aeSNikita Popov
44796b4aeSNikita Popov; Global SRA should not be performed here (or at least not naively), as
54796b4aeSNikita Popov; offset 4 is accessed as both i32 and i64.
64796b4aeSNikita Popov
74796b4aeSNikita Popov%T = type { i32, i32, i32, i32 }
84796b4aeSNikita Popov@g = internal global %T zeroinitializer
94796b4aeSNikita Popov
104796b4aeSNikita Popov;.
11*d10b7655SNikita Popov; CHECK: @g = internal unnamed_addr global %T zeroinitializer
124796b4aeSNikita Popov;.
134796b4aeSNikita Popovdefine void @test1() {
144796b4aeSNikita Popov; CHECK-LABEL: @test1(
15*d10b7655SNikita Popov; CHECK-NEXT:    store i32 1, ptr getelementptr ([[T:%.*]], ptr @g, i64 0, i32 1), align 4
16*d10b7655SNikita Popov; CHECK-NEXT:    store i32 2, ptr getelementptr ([[T]], ptr @g, i64 0, i32 2), align 4
174796b4aeSNikita Popov; CHECK-NEXT:    ret void
184796b4aeSNikita Popov;
194796b4aeSNikita Popov  store i32 1, ptr getelementptr (%T, ptr @g, i64 0, i32 1)
204796b4aeSNikita Popov  store i32 2, ptr getelementptr (%T, ptr @g, i64 0, i32 2)
214796b4aeSNikita Popov  ret void
224796b4aeSNikita Popov}
234796b4aeSNikita Popov
244796b4aeSNikita Popovdefine i32 @load1() {
254796b4aeSNikita Popov; CHECK-LABEL: @load1(
26*d10b7655SNikita Popov; CHECK-NEXT:    [[V:%.*]] = load i32, ptr getelementptr ([[T:%.*]], ptr @g, i64 0, i32 1), align 4
274796b4aeSNikita Popov; CHECK-NEXT:    ret i32 [[V]]
284796b4aeSNikita Popov;
294796b4aeSNikita Popov  %v = load i32, ptr getelementptr (%T, ptr @g, i64 0, i32 1)
304796b4aeSNikita Popov  ret i32 %v
314796b4aeSNikita Popov}
324796b4aeSNikita Popov
334796b4aeSNikita Popovdefine i64 @load2() {
344796b4aeSNikita Popov; CHECK-LABEL: @load2(
35*d10b7655SNikita Popov; CHECK-NEXT:    [[V:%.*]] = load i64, ptr getelementptr ([[T:%.*]], ptr @g, i64 0, i32 2), align 4
364796b4aeSNikita Popov; CHECK-NEXT:    ret i64 [[V]]
374796b4aeSNikita Popov;
384796b4aeSNikita Popov  %v = load i64, ptr getelementptr (%T, ptr @g, i64 0, i32 2)
394796b4aeSNikita Popov  ret i64 %v
404796b4aeSNikita Popov}
41