Files
clang-p2996/llvm/test/Transforms/GlobalOpt/externally-initialized-aggregate.ll
Bjorn Pettersson 8ebb3eac02 [test] Use -passes syntax when specifying pipeline in some more tests
The legacy PM is deprecated, so update a bunch of lit tests running
opt to use the new PM syntax when specifying the pipeline.
In this patch focus has been put on test cases for ConstantMerge,
ConstraintElimination, CorrelatedValuePropagation, GlobalDCE,
GlobalOpt, SCCP, TailCallElim and PredicateInfo.

Differential Revision: https://reviews.llvm.org/D114516
2021-11-27 09:52:55 +01:00

51 lines
2.1 KiB
LLVM

; RUN: opt < %s -S -passes=globalopt | FileCheck %s
; This global is externally_initialized, so if we split it into scalars we
; should keep that flag set on all of the new globals. This will prevent the
; store to @a[0] from being constant propagated to the load in @foo, but will not
; prevent @a[1] from being removed since it is dead.
; CHECK: @a.0 = internal unnamed_addr externally_initialized global i32 undef
; CHECK-NOT: @a.1
@a = internal externally_initialized global [2 x i32] undef, align 4
; This is the same, but a struct rather than an array.
; CHECK: @b.0 = internal unnamed_addr externally_initialized global i32 undef
; CHECK-NOT: @b.1
@b = internal externally_initialized global {i32, i32} undef, align 4
define i32 @foo() {
; CHECK-LABEL: define i32 @foo
entry:
; This load uses the split global, but cannot be constant-propagated away.
; CHECK: %0 = load i32, i32* @a.0
%0 = load i32, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @a, i32 0, i32 0), align 4
ret i32 %0
}
define i32 @bar() {
; CHECK-LABEL: define i32 @bar
entry:
; This load uses the split global, but cannot be constant-propagated away.
; CHECK: %0 = load i32, i32* @b.0
%0 = load i32, i32* getelementptr inbounds ({i32, i32}, {i32, i32}* @b, i32 0, i32 0), align 4
ret i32 %0
}
define void @init() {
; CHECK-LABEL: define void @init
entry:
; This store uses the split global, but cannot be constant-propagated away.
; CHECK: store i32 1, i32* @a.0
store i32 1, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @a, i32 0, i32 0), align 4
; This store can be removed, because the second element of @a is never read.
; CHECK-NOT: store i32 2, i32* @a.1
store i32 2, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @a, i32 0, i32 1), align 4
; This store uses the split global, but cannot be constant-propagated away.
; CHECK: store i32 3, i32* @b.0
store i32 3, i32* getelementptr inbounds ({i32, i32}, {i32, i32}* @b, i32 0, i32 0), align 4
; This store can be removed, because the second element of @b is never read.
; CHECK-NOT: store i32 4, i32* @b.1
store i32 4, i32* getelementptr inbounds ({i32, i32}, {i32, i32}* @b, i32 0, i32 1), align 4
ret void
}