This bases the CleanupConstantGlobalUsers() implementation around the ConstantFoldLoadFromConst() API. The general approach is that we discover all users while looking through casts, and then constant fold loads and drop stores and memintrinsics. This avoids special cases and limitations in the previous implementation, which is also incompatible with opaque pointers. The result is a bit more powerful than before, because we now use more general load folding logic which can for example look through pointer bitcasts between different sizes. This is where the test changes come from, as we now fold more loads and can thus remove more globals. Differential Revision: https://reviews.llvm.org/D114889
35 lines
687 B
LLVM
35 lines
687 B
LLVM
; RUN: opt -passes=globalopt < %s -S -o - | FileCheck %s
|
|
|
|
@GV1 = internal global i64 1, align 8
|
|
@GV2 = internal global i32 0, align 4
|
|
|
|
; CHECK-NOT: @GV1 =
|
|
; CHECK: @GV2 = internal unnamed_addr global i32 0, align 4
|
|
|
|
define void @test1() {
|
|
entry:
|
|
%0 = load atomic i8, i8* bitcast (i64* @GV1 to i8*) acquire, align 8
|
|
ret void
|
|
}
|
|
|
|
; PR17163
|
|
define void @test2a() {
|
|
entry:
|
|
store atomic i32 10, i32* @GV2 seq_cst, align 4
|
|
ret void
|
|
}
|
|
define i32 @test2b() {
|
|
entry:
|
|
%atomic-load = load atomic i32, i32* @GV2 seq_cst, align 4
|
|
ret i32 %atomic-load
|
|
}
|
|
|
|
|
|
define i64 @test3() {
|
|
; CHECK-LABEL: @test3
|
|
; CHECK: ret i64 1
|
|
|
|
%val = load atomic i64, i64* @GV1 acquire, align 8
|
|
ret i64 %val
|
|
}
|