72 changes: 33 additions & 39 deletions llvm/test/Transforms/GlobalOpt/evaluate-call-errors.ll
Original file line number Diff line number Diff line change
Expand Up @@ -15,76 +15,70 @@ target triple = "x86_64-apple-macosx10.12.0"

@_s = global %struct.S zeroinitializer, align 4
@_q = global %struct.Q zeroinitializer, align 4
@llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_main2.cpp, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_main3.cpp, i8* null }]
@llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_main2.cpp, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_main3.cpp, ptr null }]

define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {
call void @_ZN1SC1Ev(%struct.S* @_s)
call void @_ZN1SC1Ev(ptr @_s)
ret void
}

define linkonce_odr void @_ZN1SC1Ev(%struct.S*) unnamed_addr align 2 {
%2 = alloca %struct.S*, align 8
store %struct.S* %0, %struct.S** %2, align 8
%3 = load %struct.S*, %struct.S** %2, align 8
call void @_ZN1SC2Ev(%struct.S* %3)
define linkonce_odr void @_ZN1SC1Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
call void @_ZN1SC2Ev(ptr %3)
ret void
}

define internal void @__cxx_global_var_init.1() #0 section "__TEXT,__StaticInit,regular,pure_instructions" {
call void @_ZN1QC1Ev(%struct.Q* @_q)
call void @_ZN1QC1Ev(ptr @_q)
ret void
}

define linkonce_odr void @_ZN1QC1Ev(%struct.Q*) unnamed_addr align 2 {
%2 = alloca %struct.Q*, align 8
store %struct.Q* %0, %struct.Q** %2, align 8
%3 = load %struct.Q*, %struct.Q** %2, align 8
call void @_ZN1QC2Ev(%struct.Q* %3)
define linkonce_odr void @_ZN1QC1Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
call void @_ZN1QC2Ev(ptr %3)
ret void
}

define i32 @main() {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 0, ptr %1, align 4
ret i32 0
}

define linkonce_odr void @_ZN1SC2Ev(%struct.S*) unnamed_addr align 2 {
%2 = alloca %struct.S*, align 8
define linkonce_odr void @_ZN1SC2Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
%3 = alloca %struct.Foo, align 4
store %struct.S* %0, %struct.S** %2, align 8
%4 = load %struct.S*, %struct.S** %2, align 8
%5 = getelementptr inbounds %struct.S, %struct.S* %4, i32 0, i32 0
%6 = call i32 bitcast (%struct.Foo* ()* @_ZL3foov to i32 ()*)()
%7 = getelementptr inbounds %struct.Foo, %struct.Foo* %3, i32 0, i32 0
store i32 %6, i32* %7, align 4
%8 = getelementptr inbounds %struct.Foo, %struct.Foo* %3, i32 0, i32 0
%9 = load i32, i32* %8, align 4
store i32 %9, i32* %5, align 4
store ptr %0, ptr %2, align 8
%4 = load ptr, ptr %2, align 8
%5 = call i32 @_ZL3foov()
store i32 %5, ptr %3, align 4
%6 = load i32, ptr %3, align 4
store i32 %6, ptr %4, align 4
ret void
}

define internal %struct.Foo* @_ZL3foov() {
ret %struct.Foo* getelementptr (%struct.Foo, %struct.Foo *null, i32 1)
define internal ptr @_ZL3foov() {
ret ptr getelementptr (%struct.Foo, ptr null, i32 1)
}

define linkonce_odr void @_ZN1QC2Ev(%struct.Q*) unnamed_addr align 2 {
%2 = alloca %struct.Q*, align 8
store %struct.Q* %0, %struct.Q** %2, align 8
%3 = load %struct.Q*, %struct.Q** %2, align 8
%4 = getelementptr inbounds %struct.Q, %struct.Q* %3, i32 0, i32 0
%5 = call i32 bitcast (i32 (i32)* @_ZL3baz3Foo to i32 (%struct.Foo*)*)(%struct.Foo* getelementptr (%struct.Foo, %struct.Foo *null, i32 1))
store i32 %5, i32* %4, align 4
define linkonce_odr void @_ZN1QC2Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
%4 = call i32 @_ZL3baz3Foo(ptr getelementptr (%struct.Foo, ptr null, i32 1))
store i32 %4, ptr %3, align 4
ret void
}

define internal i32 @_ZL3baz3Foo(i32) {
%2 = alloca %struct.Foo, align 4
%3 = getelementptr inbounds %struct.Foo, %struct.Foo* %2, i32 0, i32 0
store i32 %0, i32* %3, align 4
%4 = getelementptr inbounds %struct.Foo, %struct.Foo* %2, i32 0, i32 0
%5 = load i32, i32* %4, align 4
ret i32 %5
store i32 %0, ptr %2, align 4
%3 = load i32, ptr %2, align 4
ret i32 %3
}

; Function Attrs: noinline ssp uwtable
Expand Down
68 changes: 32 additions & 36 deletions llvm/test/Transforms/GlobalOpt/evaluate-call.ll
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
; Checks if bitcasted call expression can be evaluated
; Given call expresion:
; %struct.Bar* bitcast (%struct.Foo* (%struct.Foo*)* @_ZL3fooP3Foo to %struct.Bar* (%struct.Bar*)*)(%struct.Bar* @gBar)
; ptr @_ZL3fooP3Foo(ptr @gBar)
; We evaluate call to function @_ZL3fooP3Foo casting both parameter and return value
; Given call expression:
; void bitcast (void (%struct.Foo*)* @_ZL3bazP3Foo to void (%struct.Bar*)*)(%struct.Bar* @gBar)
; void @_ZL3bazP3Foo(ptr @gBar)
; We evaluate call to function _ZL3bazP3Foo casting its parameter and check that evaluated value (nullptr)
; is handled correctly

; RUN: opt -passes=globalopt,instcombine -S %s -o - | FileCheck %s

; CHECK: @gBar = local_unnamed_addr global %struct.Bar { i32 2 }
; CHECK-NEXT: @_s = local_unnamed_addr global %struct.S { i32 1 }, align 4
; CHECK-NEXT: @llvm.global_ctors = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
; CHECK-NEXT: @llvm.global_ctors = appending global [0 x { i32, ptr, ptr }] zeroinitializer

; CHECK: define i32 @main()
; CHECK-NEXT: ret i32 0
Expand All @@ -25,58 +25,54 @@ target triple = "x86_64-apple-macosx10.12.0"

@gBar = global %struct.Bar zeroinitializer, align 4
@_s = global %struct.S zeroinitializer, align 4
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_main.cpp, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_main.cpp, ptr null }]

define internal void @__cxx_global_var_init() section "__TEXT,__StaticInit,regular,pure_instructions" {
call void @_ZN1SC1Ev_alias(%struct.S* @_s)
call void @_ZN1SC1Ev_alias(ptr @_s)
ret void
}

@_ZN1SC1Ev_alias = linkonce_odr unnamed_addr alias void (%struct.S*), void (%struct.S*)* @_ZN1SC1Ev
@_ZN1SC1Ev_alias = linkonce_odr unnamed_addr alias void (ptr), ptr @_ZN1SC1Ev

define linkonce_odr void @_ZN1SC1Ev(%struct.S*) unnamed_addr align 2 {
%2 = alloca %struct.S*, align 8
store %struct.S* %0, %struct.S** %2, align 8
%3 = load %struct.S*, %struct.S** %2, align 8
call void @_ZN1SC2Ev(%struct.S* %3)
define linkonce_odr void @_ZN1SC1Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
call void @_ZN1SC2Ev(ptr %3)
ret void
}

define i32 @main() {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 0, ptr %1, align 4
ret i32 0
}

define linkonce_odr void @_ZN1SC2Ev(%struct.S*) unnamed_addr align 2 {
%2 = alloca %struct.S*, align 8
store %struct.S* %0, %struct.S** %2, align 8
%3 = load %struct.S*, %struct.S** %2, align 8
%4 = getelementptr inbounds %struct.S, %struct.S* %3, i32 0, i32 0
%5 = call %struct.Bar* bitcast (%struct.Foo* (%struct.Foo*)* @_ZL3fooP3Foo to %struct.Bar* (%struct.Bar*)*)(%struct.Bar* @gBar)
%6 = getelementptr inbounds %struct.Bar, %struct.Bar* %5, i32 0, i32 0
%7 = load i32, i32* %6, align 4
store i32 %7, i32* %4, align 4
call void bitcast (void (%struct.Foo*)* @_ZL3bazP3Foo to void (%struct.Bar*)*)(%struct.Bar* @gBar)
define linkonce_odr void @_ZN1SC2Ev(ptr) unnamed_addr align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
%4 = call ptr @_ZL3fooP3Foo(ptr @gBar)
%5 = load i32, ptr %4, align 4
store i32 %5, ptr %3, align 4
call void @_ZL3bazP3Foo(ptr @gBar)
ret void
}

define internal %struct.Foo* @_ZL3fooP3Foo(%struct.Foo*) {
%2 = alloca %struct.Foo*, align 8
store %struct.Foo* %0, %struct.Foo** %2, align 8
%3 = load %struct.Foo*, %struct.Foo** %2, align 8
%4 = getelementptr inbounds %struct.Foo, %struct.Foo* %3, i32 0, i32 0
store i32 1, i32* %4, align 4
%5 = load %struct.Foo*, %struct.Foo** %2, align 8
ret %struct.Foo* %5
define internal ptr @_ZL3fooP3Foo(ptr) {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
store i32 1, ptr %3, align 4
%4 = load ptr, ptr %2, align 8
ret ptr %4
}

define internal void @_ZL3bazP3Foo(%struct.Foo*) {
%2 = alloca %struct.Foo*, align 8
store %struct.Foo* %0, %struct.Foo** %2, align 8
%3 = load %struct.Foo*, %struct.Foo** %2, align 8
%4 = getelementptr inbounds %struct.Foo, %struct.Foo* %3, i32 0, i32 0
store i32 2, i32* %4, align 4
define internal void @_ZL3bazP3Foo(ptr) {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
store i32 2, ptr %3, align 4
ret void
}

Expand Down
31 changes: 15 additions & 16 deletions llvm/test/Transforms/GlobalOpt/evaluate-constfold-call.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

; CHECK: @_q = dso_local local_unnamed_addr global %struct.Q { i32 1066527622 }
; CHECK: define dso_local i32 @main
; CHECK-NEXT: %[[V:.+]] = load i32, i32* getelementptr inbounds (%struct.Q, %struct.Q* @_q, i64 0, i32 0)
; CHECK-NEXT: %[[V:.+]] = load i32, ptr @_q
; CHECK-NEXT: ret i32 %[[V]]

source_filename = "main.cpp"
Expand All @@ -17,31 +17,30 @@ target triple = "x86_64-none-linux-gnu"
$_ZN1QC2Ev = comdat any

@_q = dso_local global %struct.Q zeroinitializer, align 4
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__sub_I_main.cpp, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_main.cpp, ptr null }]

define internal void @__cxx_global_var_init() section ".text.startup" {
call void @_ZN1QC2Ev(%struct.Q* @_q)
call void @_ZN1QC2Ev(ptr @_q)
ret void
}

define linkonce_odr dso_local void @_ZN1QC2Ev(%struct.Q*) unnamed_addr #1 comdat align 2 {
%2 = alloca %struct.Q*, align 8
store %struct.Q* %0, %struct.Q** %2, align 8
%3 = load %struct.Q*, %struct.Q** %2, align 8
%4 = getelementptr inbounds %struct.Q, %struct.Q* %3, i32 0, i32 0
%5 = call i32 bitcast (float (float, float)* @fmodf to i32 (float, float)*)(float 0x40091EB860000000, float 2.000000e+00)
store i32 %5, i32* %4, align 4
define linkonce_odr dso_local void @_ZN1QC2Ev(ptr) unnamed_addr #1 comdat align 2 {
%2 = alloca ptr, align 8
store ptr %0, ptr %2, align 8
%3 = load ptr, ptr %2, align 8
%4 = call i32 @fmodf(float 0x40091EB860000000, float 2.000000e+00)
store i32 %4, ptr %3, align 4
ret void
}

define dso_local i32 @main(i32, i8**) {
define dso_local i32 @main(i32, ptr) {
%3 = alloca i32, align 4
%4 = alloca i32, align 4
%5 = alloca i8**, align 8
store i32 0, i32* %3, align 4
store i32 %0, i32* %4, align 4
store i8** %1, i8*** %5, align 8
%6 = load i32, i32* getelementptr inbounds (%struct.Q, %struct.Q* @_q, i32 0, i32 0), align 4
%5 = alloca ptr, align 8
store i32 0, ptr %3, align 4
store i32 %0, ptr %4, align 4
store ptr %1, ptr %5, align 8
%6 = load i32, ptr @_q, align 4
ret i32 %6
}

Expand Down
16 changes: 8 additions & 8 deletions llvm/test/Transforms/GlobalOpt/evaluate-load-uniform.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@

; Make sure that the load from uniform value @g1 succeeds during evaluation.

@g1 = global [2 x i64*] zeroinitializer
@g2 = global i64* inttoptr(i64 1 to i64*)
@g1 = global [2 x ptr] zeroinitializer
@g2 = global ptr inttoptr(i64 1 to ptr)

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }]

;.
; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [2 x i64*] zeroinitializer
; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global i64* null
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [2 x ptr] zeroinitializer
; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global ptr null
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, ptr, ptr }] zeroinitializer
;.
define internal void @ctor() {
%v = load i64*, i64** getelementptr ([2 x i64*], [2 x i64*]* @g1, i64 0, i64 1)
store i64* %v, i64** @g2
%v = load ptr, ptr getelementptr ([2 x ptr], ptr @g1, i64 0, i64 1)
store ptr %v, ptr @g2
ret void
}
24 changes: 12 additions & 12 deletions llvm/test/Transforms/GlobalOpt/externally-initialized-aggregate.ll
Original file line number Diff line number Diff line change
Expand Up @@ -16,35 +16,35 @@ 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
; CHECK: %0 = load i32, ptr @a.0
%0 = load i32, ptr @a, 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
; CHECK: %0 = load i32, ptr @b.0
%0 = load i32, ptr getelementptr inbounds ({i32, i32}, ptr @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
; CHECK: store i32 1, ptr @a.0
store i32 1, ptr @a, 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
; CHECK-NOT: store i32 2, ptr @a.1
store i32 2, ptr getelementptr inbounds ([2 x i32], ptr @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
; CHECK: store i32 3, ptr @b.0
store i32 3, ptr getelementptr inbounds ({i32, i32}, ptr @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
; CHECK-NOT: store i32 4, ptr @b.1
store i32 4, ptr getelementptr inbounds ({i32, i32}, ptr @b, i32 0, i32 1), align 4
ret void
}
24 changes: 12 additions & 12 deletions llvm/test/Transforms/GlobalOpt/externally-initialized-global-ctr.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,23 @@

target datalayout = "p:16:32:128"

%struct.ButtonInitData = type { i8* }
%struct.ButtonInitData = type { ptr }

@_ZL14buttonInitData = internal global [1 x %struct.ButtonInitData] zeroinitializer, align 4

@"\01L_OBJC_METH_VAR_NAME_40" = internal global [7 x i8] c"print:\00", section "__TEXT,__objc_methname,cstring_literals", align 1
@"\01L_OBJC_SELECTOR_REFERENCES_41" = internal externally_initialized global i8* getelementptr inbounds ([7 x i8], [7 x i8]* @"\01L_OBJC_METH_VAR_NAME_40", i32 0, i32 0), section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"
@"\01L_OBJC_SELECTOR_REFERENCES_41" = internal externally_initialized global ptr @"\01L_OBJC_METH_VAR_NAME_40", section "__DATA, __objc_selrefs, literal_pointers, no_dead_strip"

@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*)]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_a, ptr null }]
@llvm.used = appending global [2 x ptr] [ptr @"\01L_OBJC_METH_VAR_NAME_40", ptr @"\01L_OBJC_SELECTOR_REFERENCES_41"]

; Choose the preferred alignment.

; CHECK: @[[_ZL14BUTTONINITDATA_0_0:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i8* null, align 16
; CHECK: @[[_ZL14BUTTONINITDATA_0_0:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global ptr 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
store i8* %1, i8** getelementptr inbounds ([1 x %struct.ButtonInitData], [1 x %struct.ButtonInitData]* @_ZL14buttonInitData, i32 0, i32 0, i32 0), align 4
%1 = load ptr, ptr @"\01L_OBJC_SELECTOR_REFERENCES_41", !invariant.load !2009
store ptr %1, ptr @_ZL14buttonInitData, align 4
ret void
}

Expand All @@ -32,18 +32,18 @@ define internal void @_GLOBAL__I_a() section "__TEXT,__StaticInit,regular,pure_i
ret void
}

declare void @test(i8*)
declare void @test(ptr)

; The preferred alignment is available.

define void @print() {
; CHECK-LABEL: @print(
; CHECK-NEXT: [[TMP1:%.*]] = load i8*, i8** @_ZL14buttonInitData.0, align 16
; CHECK-NEXT: call void @test(i8* [[TMP1]])
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr @_ZL14buttonInitData.0, align 16
; CHECK-NEXT: call void @test(ptr [[TMP1]])
; CHECK-NEXT: ret void
;
%1 = load i8*, i8** getelementptr inbounds ([1 x %struct.ButtonInitData], [1 x %struct.ButtonInitData]* @_ZL14buttonInitData, i32 0, i32 0, i32 0), align 4
call void @test(i8* %1)
%1 = load ptr, ptr @_ZL14buttonInitData, align 4
call void @test(ptr %1)
ret void
}

Expand Down
12 changes: 6 additions & 6 deletions llvm/test/Transforms/GlobalOpt/externally-initialized.ll
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,22 @@
define void @foo() {
; CHECK-LABEL: foo
entry:
; CHECK: store i32 42, i32* @a
store i32 42, i32* @a
; CHECK: store i32 42, ptr @a
store i32 42, ptr @a
ret void
}
define i32 @bar() {
; CHECK-LABEL: bar
entry:
; CHECK: %val = load i32, i32* @a
%val = load i32, i32* @a
; CHECK: %val = load i32, ptr @a
%val = load i32, ptr @a
ret i32 %val
}

define i32 @baz() {
; CHECK-LABEL: baz
entry:
; CHECK: %val = load i32, i32* @b
%val = load i32, i32* @b
; CHECK: %val = load i32, ptr @b
%val = load i32, ptr @b
ret i32 %val
}
23 changes: 10 additions & 13 deletions llvm/test/Transforms/GlobalOpt/global-demotion.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
; CHECK-LABEL: @test1
define internal i32 @test1() norecurse {
; CHECK-NOT: @G1
store i32 4, i32* @G1
%a = load i32, i32* @G1
store i32 4, ptr @G1
%a = load i32, ptr @G1
; CHECK: ret
ret i32 %a
}
Expand All @@ -19,8 +19,8 @@ define internal i32 @test1() norecurse {
; CHECK-LABEL: @test2
define internal i32 @test2() norecurse {
; CHECK-NOT: %G2
%a = load i32, i32* @G2
store i32 4, i32* @G2
%a = load i32, ptr @G2
store i32 4, ptr @G2
; CHECK: ret
ret i32 %a
}
Expand All @@ -31,9 +31,8 @@ define internal i32 @test2() norecurse {
; CHECK-LABEL: @test3
define internal i32 @test3() norecurse {
; CHECK-NOT: %G3
%x = getelementptr i32,i32* @G3, i32 0
%a = load i32, i32* %x
store i32 4, i32* @G3
%a = load i32, ptr @G3
store i32 4, ptr @G3
; CHECK: ret
ret i32 %a
}
Expand All @@ -44,9 +43,8 @@ define internal i32 @test3() norecurse {
; CHECK-LABEL: @test4
define internal i32 @test4() norecurse {
; CHECK-NOT: %G4
store i32 4, i32* @G4
%x = bitcast i32* @G4 to i64*
%a = load i64, i64* %x
store i32 4, ptr @G4
%a = load i64, ptr @G4
%b = trunc i64 %a to i32
; CHECK: ret
ret i32 %b
Expand All @@ -57,9 +55,8 @@ define internal i32 @test4() norecurse {
; CHECK-LABEL: @test5
define internal i32 @test5() norecurse {
; CHECK-NOT: @G5
store i32 4, i32* @G5
%x = bitcast i32* @G5 to i16*
%a = load i16, i16* %x
store i32 4, ptr @G5
%a = load i16, ptr @G5
%b = zext i16 %a to i32
; CHECK: ret
ret i32 %b
Expand Down
58 changes: 29 additions & 29 deletions llvm/test/Transforms/GlobalOpt/globalsra-align.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

target datalayout = "p:16:32:64" ; 16-bit pointers with 32-bit ABI alignment and 64-bit preferred alignmentt

@a = internal externally_initialized global [3 x [7 x i32*]] zeroinitializer, align 16
@a = internal externally_initialized global [3 x [7 x ptr]] zeroinitializer, align 16

; PR50253
; The alignments are correct initially, but they should be updated
Expand All @@ -14,47 +14,47 @@ target datalayout = "p:16:32:64" ; 16-bit pointers with 32-bit ABI alignment and
; preferred alignment from the datalayout.

;.
; CHECK: @[[A_4:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global i32* null, align 8
; CHECK: @[[A_5:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global i32* null, align 16
; CHECK: @[[A_6:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global i32* null, align 16
; CHECK: @[[A_7:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global i32* null, align 16
; CHECK: @[[A_4:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 8
; CHECK: @[[A_5:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
; CHECK: @[[A_6:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
; CHECK: @[[A_7:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr externally_initialized global ptr null, align 16
;.
define i32* @reduce_align_0() {
define ptr @reduce_align_0() {
; CHECK-LABEL: @reduce_align_0(
; CHECK-NEXT: [[X:%.*]] = load i32*, i32** @a.4, align 8
; CHECK-NEXT: ret i32* [[X]]
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.4, align 8
; CHECK-NEXT: ret ptr [[X]]
;
%x = load i32*, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 2, i64 0), align 8
store i32* null, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 1, i64 0), align 4
ret i32* %x
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 0), align 8
store ptr null, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 1, i64 0), align 4
ret ptr %x
}

define i32* @reduce_align_1() {
define ptr @reduce_align_1() {
; CHECK-LABEL: @reduce_align_1(
; CHECK-NEXT: [[X:%.*]] = load i32*, i32** @a.5, align 16
; CHECK-NEXT: ret i32* [[X]]
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.5, align 16
; CHECK-NEXT: ret ptr [[X]]
;
%x = load i32*, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 2, i64 1), align 4
store i32* null, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 1, i64 1), align 16
ret i32* %x
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 1), align 4
store ptr null, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 1, i64 1), align 16
ret ptr %x
}

define i32* @reduce_align_2() {
define ptr @reduce_align_2() {
; CHECK-LABEL: @reduce_align_2(
; CHECK-NEXT: [[X:%.*]] = load i32*, i32** @a.6, align 16
; CHECK-NEXT: ret i32* [[X]]
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.6, align 16
; CHECK-NEXT: ret ptr [[X]]
;
%x = load i32*, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 2, i64 2), align 16
store i32* null, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 1, i64 2), align 4
ret i32* %x
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 2), align 16
store ptr null, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 1, i64 2), align 4
ret ptr %x
}

define i32* @reduce_align_3() {
define ptr @reduce_align_3() {
; CHECK-LABEL: @reduce_align_3(
; CHECK-NEXT: [[X:%.*]] = load i32*, i32** @a.7, align 16
; CHECK-NEXT: ret i32* [[X]]
; CHECK-NEXT: [[X:%.*]] = load ptr, ptr @a.7, align 16
; CHECK-NEXT: ret ptr [[X]]
;
%x = load i32*, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 2, i64 3), align 4
store i32* null, i32** getelementptr inbounds ([3 x [7 x i32*]], [3 x [7 x i32*]]* @a, i64 0, i64 1, i64 3), align 8
ret i32* %x
%x = load ptr, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 2, i64 3), align 4
store ptr null, ptr getelementptr inbounds ([3 x [7 x ptr]], ptr @a, i64 0, i64 1, i64 3), align 8
ret ptr %x
}
8 changes: 4 additions & 4 deletions llvm/test/Transforms/GlobalOpt/globalsra-generic-type.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,23 @@ define void @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: ret void
;
store i32 1, i32* bitcast ([8 x i8]* @g to i32*)
store i32 2, i32* getelementptr (i32, i32* bitcast ([8 x i8]* @g to i32*), i64 1)
store i32 1, ptr @g
store i32 2, ptr getelementptr (i32, ptr @g, i64 1)
ret void
}

define i32 @load1() {
; CHECK-LABEL: @load1(
; CHECK-NEXT: ret i32 1
;
%v = load i32, i32* bitcast ([8 x i8]* @g to i32*)
%v = load i32, ptr @g
ret i32 %v
}

define i32 @load2() {
; CHECK-LABEL: @load2(
; CHECK-NEXT: ret i32 2
;
%v = load i32, i32* getelementptr (i32, i32* bitcast ([8 x i8]* @g to i32*), i64 1)
%v = load i32, ptr getelementptr (i32, ptr @g, i64 1)
ret i32 %v
}
6 changes: 3 additions & 3 deletions llvm/test/Transforms/GlobalOpt/globalsra-multigep.ll
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ target triple = "x86_64-unknown-linux-gnu"

define i16 @test(i64 %a1) {
entry:
%g1 = getelementptr inbounds <{ [8 x i16], [8 x i16] }>, <{ [8 x i16], [8 x i16] }>* @g_data, i64 0, i32 0
%arrayidx.i = getelementptr inbounds [8 x i16], [8 x i16]* %g1, i64 0, i64 %a1
%r = load i16, i16* %arrayidx.i, align 2
%g1 = getelementptr inbounds <{ [8 x i16], [8 x i16] }>, ptr @g_data, i64 0, i32 0
%arrayidx.i = getelementptr inbounds [8 x i16], ptr %g1, i64 0, i64 %a1
%r = load i16, ptr %arrayidx.i, align 2
ret i16 %r
}
12 changes: 6 additions & 6 deletions llvm/test/Transforms/GlobalOpt/globalsra-partial.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,23 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global { i32, [4 x float] } zeroinitializer ; <{ i32, [4 x float] }*> [#uses=3]
@G = internal global { i32, [4 x float] } zeroinitializer ; <ptr> [#uses=3]

; CHECK: @G = internal unnamed_addr global { i32, [4 x float] }
; CHECK: 12345
define void @onlystore() {
store i32 12345, i32* getelementptr ({ i32, [4 x float] }, { i32, [4 x float] }* @G, i32 0, i32 0)
store i32 12345, ptr getelementptr ({ i32, [4 x float] }, ptr @G, i32 0, i32 0)
ret void
}

define void @storeinit(i32 %i) {
%Ptr = getelementptr { i32, [4 x float] }, { i32, [4 x float] }* @G, i32 0, i32 1, i32 %i ; <float*> [#uses=1]
store float 1.000000e+00, float* %Ptr
%Ptr = getelementptr { i32, [4 x float] }, ptr @G, i32 0, i32 1, i32 %i ; <ptr> [#uses=1]
store float 1.000000e+00, ptr %Ptr
ret void
}

define float @readval(i32 %i) {
%Ptr = getelementptr { i32, [4 x float] }, { i32, [4 x float] }* @G, i32 0, i32 1, i32 %i ; <float*> [#uses=1]
%V = load float, float* %Ptr ; <float> [#uses=1]
%Ptr = getelementptr { i32, [4 x float] }, ptr @G, i32 0, i32 1, i32 %i ; <ptr> [#uses=1]
%V = load float, ptr %Ptr ; <float> [#uses=1]
ret float %V
}
12 changes: 6 additions & 6 deletions llvm/test/Transforms/GlobalOpt/globalsra-recursive.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@

define void @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: store { i32, i32 } zeroinitializer, { i32, i32 }* @g, align 4
; CHECK-NEXT: store { i32, i32 } { i32 0, i32 1 }, { i32, i32 }* @g, align 4
; CHECK-NEXT: store { i32, i32 } zeroinitializer, ptr @g, align 4
; CHECK-NEXT: store { i32, i32 } { i32 0, i32 1 }, ptr @g, align 4
; CHECK-NEXT: ret void
;
store { i32, i32 } zeroinitializer, { i32, i32 }* @g
store { i32, i32 } { i32 0, i32 1 }, { i32, i32 }* @g
store { i32, i32 } zeroinitializer, ptr @g
store { i32, i32 } { i32 0, i32 1 }, ptr @g
ret void
}

define { i32, i32 } @load() {
; CHECK-LABEL: @load(
; CHECK-NEXT: [[V:%.*]] = load { i32, i32 }, { i32, i32 }* @g, align 4
; CHECK-NEXT: [[V:%.*]] = load { i32, i32 }, ptr @g, align 4
; CHECK-NEXT: ret { i32, i32 } [[V]]
;
%v = load { i32, i32 }, { i32, i32 }* @g
%v = load { i32, i32 }, ptr @g
ret { i32, i32 } %v
}
25 changes: 12 additions & 13 deletions llvm/test/Transforms/GlobalOpt/globalsra-unknown-index.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
@addr = external global i8

define void @frob() {
store i32 1, i32* getelementptr inbounds ([3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 ptrtoint (i8* @addr to i64)), align 4
store i32 1, ptr getelementptr inbounds ([3 x %struct.X], ptr @Y, i64 0, i64 0, i32 0, i64 ptrtoint (ptr @addr to i64)), align 4
ret void
}

Expand All @@ -19,10 +19,9 @@ define void @frob() {
; CHECK: %b = load
; CHECK: add i32 %a, %b
define i32 @borf(i64 %i, i64 %j) {
%p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 0, i64 0
%a = load i32, i32* %p
%q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 0, i32 1, i64 0
%b = load i32, i32* %q
%a = load i32, ptr @Y
%q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 0, i32 1, i64 0
%b = load i32, ptr %q
%c = add i32 %a, %b
ret i32 %c
}
Expand All @@ -32,10 +31,10 @@ define i32 @borf(i64 %i, i64 %j) {
; CHECK: %b = load
; CHECK: add i32 %a, %b
define i32 @borg(i64 %i, i64 %j) {
%p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 1, i32 0, i64 1
%a = load i32, i32* %p
%q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 1, i32 1, i64 1
%b = load i32, i32* %q
%p = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 1, i32 0, i64 1
%a = load i32, ptr %p
%q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 1, i32 1, i64 1
%b = load i32, ptr %q
%c = add i32 %a, %b
ret i32 %c
}
Expand All @@ -45,10 +44,10 @@ define i32 @borg(i64 %i, i64 %j) {
; CHECK: %b = load
; CHECK: add i32 %a, %b
define i32 @borh(i64 %i, i64 %j) {
%p = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 2, i32 0, i64 2
%a = load i32, i32* %p
%q = getelementptr inbounds [3 x %struct.X], [3 x %struct.X]* @Y, i64 0, i64 2, i32 1, i64 2
%b = load i32, i32* %q
%p = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 2, i32 0, i64 2
%a = load i32, ptr %p
%q = getelementptr inbounds [3 x %struct.X], ptr @Y, i64 0, i64 2, i32 1, i64 2
%b = load i32, ptr %q
%c = add i32 %a, %b
ret i32 %c
}
20 changes: 10 additions & 10 deletions llvm/test/Transforms/GlobalOpt/globalsra.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,41 +5,41 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
@G = internal global { i32, float, { double } } {
i32 1,
float 1.000000e+00,
{ double } { double 1.727000e+01 } } ; <{ i32, float, { double } }*> [#uses=3]
{ double } { double 1.727000e+01 } } ; <ptr> [#uses=3]

define void @onlystore() {
store i32 123, i32* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G, i32 0, i32 0)
store i32 123, ptr getelementptr ({ i32, float, { double } }, ptr @G, i32 0, i32 0)
ret void
}

define float @storeinit() {
store float 1.000000e+00, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G, i32 0, i32 1)
%X = load float, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G, i32 0, i32 1) ; <float> [#uses=1]
store float 1.000000e+00, ptr getelementptr ({ i32, float, { double } }, ptr @G, i32 0, i32 1)
%X = load float, ptr getelementptr ({ i32, float, { double } }, ptr @G, i32 0, i32 1) ; <float> [#uses=1]
ret float %X
}

define double @constantize() {
%X = load double, double* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G, i32 0, i32 2, i32 0) ; <double> [#uses=1]
%X = load double, ptr getelementptr ({ i32, float, { double } }, ptr @G, i32 0, i32 2, i32 0) ; <double> [#uses=1]
ret double %X
}

@G2 = internal constant { i32, float, { double } } {
i32 1,
float 1.000000e+00,
{ double } { double 1.727000e+01 } } ; <{ i32, float, { double } }*> [#uses=3]
{ double } { double 1.727000e+01 } } ; <ptr> [#uses=3]

define void @onlystore2() {
store i32 123, i32* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 0)
store i32 123, ptr getelementptr ({ i32, float, { double } }, ptr @G2, i32 0, i32 0)
ret void
}

define float @storeinit2() {
store float 1.000000e+00, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1)
%X = load float, float* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 1) ; <float> [#uses=1]
store float 1.000000e+00, ptr getelementptr ({ i32, float, { double } }, ptr @G2, i32 0, i32 1)
%X = load float, ptr getelementptr ({ i32, float, { double } }, ptr @G2, i32 0, i32 1) ; <float> [#uses=1]
ret float %X
}

define double @constantize2() {
%X = load double, double* getelementptr ({ i32, float, { double } }, { i32, float, { double } }* @G2, i32 0, i32 2, i32 0) ; <double> [#uses=1]
%X = load double, ptr getelementptr ({ i32, float, { double } }, ptr @G2, i32 0, i32 2, i32 0) ; <double> [#uses=1]
ret double %X
}
15 changes: 7 additions & 8 deletions llvm/test/Transforms/GlobalOpt/heap-sra-1-no-null-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,30 @@
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

%struct.foo = type { i32, i32 }
@X = internal global %struct.foo* null
@X = internal global ptr null
; CHECK: @X
; CHECK-NOT: @X.f0

define void @bar(i64 %Size) nounwind noinline #0 {
entry:
%mallocsize = mul i64 %Size, 8 ; <i64> [#uses=1]
%malloccall = tail call i8* @malloc(i64 %mallocsize) ; <i8*> [#uses=1]
%.sub = bitcast i8* %malloccall to %struct.foo* ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 %mallocsize) ; <ptr> [#uses=1]
store ptr %malloccall, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline #0 {
bb1.thread:
%0 = load %struct.foo*, %struct.foo** @X, align 4
%0 = load ptr, ptr @X, align 4
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ]
%1 = getelementptr %struct.foo, %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0
%2 = load i32, i32* %1, align 4
%1 = getelementptr %struct.foo, ptr %0, i32 %i.0.reg2mem.0, i32 0
%2 = load i32, ptr %1, align 4
%3 = add i32 %2, %sum.0.reg2mem.0
%indvar.next = add i32 %i.0.reg2mem.0, 1
%exitcond = icmp eq i32 %indvar.next, 1200
Expand Down
17 changes: 8 additions & 9 deletions llvm/test/Transforms/GlobalOpt/heap-sra-1.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,28 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
;; Heap SROA has been removed. This tests we don't perform heap SROA.
; CHECK: @X =
%struct.foo = type { i32, i32 }
@X = internal global %struct.foo* null
@X = internal global ptr null

define void @bar(i64 %Size) nounwind noinline {
entry:
%mallocsize = mul i64 %Size, 8 ; <i64> [#uses=1]
%malloccall = tail call i8* @malloc(i64 %mallocsize) ; <i8*> [#uses=1]
%.sub = bitcast i8* %malloccall to %struct.foo* ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 %mallocsize) ; <ptr> [#uses=1]
store ptr %malloccall, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline {
bb1.thread:
%0 = load %struct.foo*, %struct.foo** @X, align 4
%0 = load ptr, ptr @X, align 4
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ]
%1 = getelementptr %struct.foo, %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0
%2 = load i32, i32* %1, align 4
%1 = getelementptr %struct.foo, ptr %0, i32 %i.0.reg2mem.0, i32 0
%2 = load i32, ptr %1, align 4
%3 = add i32 %2, %sum.0.reg2mem.0
%indvar.next = add i32 %i.0.reg2mem.0, 1
%exitcond = icmp eq i32 %indvar.next, 1200
Expand All @@ -38,7 +37,7 @@ bb2: ; preds = %bb1

define void @bam(i64 %Size) nounwind noinline #0 {
entry:
%0 = load %struct.foo*, %struct.foo** @X, align 4
%0 = load ptr, ptr @X, align 4
ret void
}

Expand Down
17 changes: 8 additions & 9 deletions llvm/test/Transforms/GlobalOpt/heap-sra-2-no-null-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,30 @@
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

%struct.foo = type { i32, i32 }
@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2]
@X = internal global ptr null ; <ptr> [#uses=2]
; CHECK: @X
; CHECK-NOT: @X.f0

define void @bar(i32 %Size) nounwind noinline #0 {
entry:
%malloccall = tail call i8* @malloc(i64 8000000) ; <i8*> [#uses=1]
%0 = bitcast i8* %malloccall to [1000000 x %struct.foo]* ; <[1000000 x %struct.foo]*> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], [1000000 x %struct.foo]* %0, i32 0, i32 0 ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 8000000) ; <ptr> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], ptr %malloccall, i32 0, i32 0 ; <ptr> [#uses=1]
store ptr %.sub, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline #0 {
bb1.thread:
%0 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
%0 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ] ; <i32> [#uses=1]
%1 = getelementptr %struct.foo, %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1]
%2 = load i32, i32* %1, align 4 ; <i32> [#uses=1]
%1 = getelementptr %struct.foo, ptr %0, i32 %i.0.reg2mem.0, i32 0 ; <ptr> [#uses=1]
%2 = load i32, ptr %1, align 4 ; <i32> [#uses=1]
%3 = add i32 %2, %sum.0.reg2mem.0 ; <i32> [#uses=2]
%indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1]
Expand Down
19 changes: 9 additions & 10 deletions llvm/test/Transforms/GlobalOpt/heap-sra-2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,28 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
;; Heap SROA has been removed. This tests we don't perform heap SROA.
; CHECK: @X =
%struct.foo = type { i32, i32 }
@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2]
@X = internal global ptr null ; <ptr> [#uses=2]

define void @bar(i32 %Size) nounwind noinline {
entry:
%malloccall = tail call i8* @malloc(i64 8000000) ; <i8*> [#uses=1]
%0 = bitcast i8* %malloccall to [1000000 x %struct.foo]* ; <[1000000 x %struct.foo]*> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], [1000000 x %struct.foo]* %0, i32 0, i32 0 ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 8000000) ; <ptr> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], ptr %malloccall, i32 0, i32 0 ; <ptr> [#uses=1]
store ptr %.sub, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline {
bb1.thread:
%0 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
%0 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %3, %bb1 ] ; <i32> [#uses=1]
%1 = getelementptr %struct.foo, %struct.foo* %0, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1]
%2 = load i32, i32* %1, align 4 ; <i32> [#uses=1]
%1 = getelementptr %struct.foo, ptr %0, i32 %i.0.reg2mem.0, i32 0 ; <ptr> [#uses=1]
%2 = load i32, ptr %1, align 4 ; <i32> [#uses=1]
%3 = add i32 %2, %sum.0.reg2mem.0 ; <i32> [#uses=2]
%indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2]
%exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1]
Expand All @@ -38,7 +37,7 @@ bb2: ; preds = %bb1

define void @bam(i64 %Size) nounwind noinline #0 {
entry:
%0 = load %struct.foo*, %struct.foo** @X, align 4
%0 = load ptr, ptr @X, align 4
ret void
}

Expand Down
35 changes: 17 additions & 18 deletions llvm/test/Transforms/GlobalOpt/heap-sra-phi-no-null-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,46 +3,45 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1

%struct.foo = type { i32, i32 }

@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2]
@X = internal global ptr null ; <ptr> [#uses=2]
; CHECK: @X
; CHECK-NOT: @X.f0

define void @bar(i32 %Size) nounwind noinline #0 {
; CHECK-LABEL: @bar(
entry:
%malloccall = tail call i8* @malloc(i64 8000000) ; <i8*> [#uses=1]
%tmp = bitcast i8* %malloccall to [1000000 x %struct.foo]* ; <[1000000 x %struct.foo]*> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], [1000000 x %struct.foo]* %tmp, i32 0, i32 0 ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 8000000) ; <ptr> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], ptr %malloccall, i32 0, i32 0 ; <ptr> [#uses=1]
store ptr %.sub, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline #0 {
; CHECK-LABEL: @baz(
bb1.thread:
%tmpLD1 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
; CHECK: load %struct.foo*, %struct.foo** @X, align 4
%tmpLD1 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]
; CHECK: load ptr, ptr @X, align 4
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%tmp = phi %struct.foo* [%tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ] ; <i32> [#uses=2]
; CHECK: %tmp = phi %struct.foo* [ %tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ]
%tmp = phi ptr [%tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ] ; <i32> [#uses=2]
; CHECK: %tmp = phi ptr [ %tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ]
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %tmp3, %bb1 ] ; <i32> [#uses=1]
%tmp1 = getelementptr %struct.foo, %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1]
%tmp2 = load i32, i32* %tmp1, align 4 ; <i32> [#uses=1]
; CHECK: load i32, i32* %tmp1, align 4
%tmp1 = getelementptr %struct.foo, ptr %tmp, i32 %i.0.reg2mem.0, i32 0 ; <ptr> [#uses=1]
%tmp2 = load i32, ptr %tmp1, align 4 ; <i32> [#uses=1]
; CHECK: load i32, ptr %tmp1, align 4
%tmp6 = add i32 %tmp2, %sum.0.reg2mem.0 ; <i32> [#uses=2]
%tmp4 = getelementptr %struct.foo, %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 1 ; <i32*> [#uses=1]
%tmp5 = load i32 , i32 * %tmp4
; CHECK: load i32, i32* %tmp4
%tmp4 = getelementptr %struct.foo, ptr %tmp, i32 %i.0.reg2mem.0, i32 1 ; <ptr> [#uses=1]
%tmp5 = load i32 , ptr %tmp4
; CHECK: load i32, ptr %tmp4
%tmp3 = add i32 %tmp5, %tmp6
%indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2]

%tmpLD2 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
; CHECK: load %struct.foo*, %struct.foo** @X, align 4
%tmpLD2 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]
; CHECK: load ptr, ptr @X, align 4

%exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1]
br i1 %exitcond, label %bb2, label %bb1
Expand Down
27 changes: 13 additions & 14 deletions llvm/test/Transforms/GlobalOpt/heap-sra-phi.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,36 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1
;; Heap SROA has been removed. This tests we don't perform heap SROA.
; CHECK: @X =
%struct.foo = type { i32, i32 }
@X = internal global %struct.foo* null ; <%struct.foo**> [#uses=2]
@X = internal global ptr null ; <ptr> [#uses=2]

define void @bar(i32 %Size) nounwind noinline {
entry:
%malloccall = tail call i8* @malloc(i64 8000000) ; <i8*> [#uses=1]
%tmp = bitcast i8* %malloccall to [1000000 x %struct.foo]* ; <[1000000 x %struct.foo]*> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], [1000000 x %struct.foo]* %tmp, i32 0, i32 0 ; <%struct.foo*> [#uses=1]
store %struct.foo* %.sub, %struct.foo** @X, align 4
%malloccall = tail call ptr @malloc(i64 8000000) ; <ptr> [#uses=1]
%.sub = getelementptr [1000000 x %struct.foo], ptr %malloccall, i32 0, i32 0 ; <ptr> [#uses=1]
store ptr %.sub, ptr @X, align 4
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @baz() nounwind readonly noinline {
bb1.thread:
%tmpLD1 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
%tmpLD1 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]
br label %bb1

bb1: ; preds = %bb1, %bb1.thread
%tmp = phi %struct.foo* [%tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ] ; <i32> [#uses=2]
%tmp = phi ptr [%tmpLD1, %bb1.thread ], [ %tmpLD2, %bb1 ] ; <i32> [#uses=2]
%i.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %indvar.next, %bb1 ] ; <i32> [#uses=2]
%sum.0.reg2mem.0 = phi i32 [ 0, %bb1.thread ], [ %tmp3, %bb1 ] ; <i32> [#uses=1]
%tmp1 = getelementptr %struct.foo, %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 0 ; <i32*> [#uses=1]
%tmp2 = load i32, i32* %tmp1, align 4 ; <i32> [#uses=1]
%tmp1 = getelementptr %struct.foo, ptr %tmp, i32 %i.0.reg2mem.0, i32 0 ; <ptr> [#uses=1]
%tmp2 = load i32, ptr %tmp1, align 4 ; <i32> [#uses=1]
%tmp6 = add i32 %tmp2, %sum.0.reg2mem.0 ; <i32> [#uses=2]
%tmp4 = getelementptr %struct.foo, %struct.foo* %tmp, i32 %i.0.reg2mem.0, i32 1 ; <i32*> [#uses=1]
%tmp5 = load i32 , i32 * %tmp4
%tmp4 = getelementptr %struct.foo, ptr %tmp, i32 %i.0.reg2mem.0, i32 1 ; <ptr> [#uses=1]
%tmp5 = load i32 , ptr %tmp4
%tmp3 = add i32 %tmp5, %tmp6
%indvar.next = add i32 %i.0.reg2mem.0, 1 ; <i32> [#uses=2]

%tmpLD2 = load %struct.foo*, %struct.foo** @X, align 4 ; <%struct.foo*> [#uses=1]
%tmpLD2 = load ptr, ptr @X, align 4 ; <ptr> [#uses=1]

%exitcond = icmp eq i32 %indvar.next, 1200 ; <i1> [#uses=1]
br i1 %exitcond, label %bb2, label %bb1
Expand All @@ -46,7 +45,7 @@ bb2: ; preds = %bb1

define void @bam(i64 %Size) nounwind noinline #0 {
entry:
%0 = load %struct.foo*, %struct.foo** @X, align 4
%0 = load ptr, ptr @X, align 4
ret void
}

Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/GlobalOpt/int_sideeffect.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

declare void @llvm.sideeffect()

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [ { i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null } ]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [ { i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null } ]
@G = global i32 0

define internal void @ctor() {
store i32 1, i32* @G
store i32 1, ptr @G
call void @llvm.sideeffect()
ret void
}
6 changes: 3 additions & 3 deletions llvm/test/Transforms/GlobalOpt/integer-bool-dwarf.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,21 @@
; Function Attrs: noinline nounwind optnone uwtable
define void @set1() #0 !dbg !11 {
entry:
store i32 111, i32* @foo, align 4, !dbg !14
store i32 111, ptr @foo, align 4, !dbg !14
ret void, !dbg !15
}

; Function Attrs: noinline nounwind optnone uwtable
define void @set2() #0 !dbg !16 {
entry:
store i32 0, i32* @foo, align 4, !dbg !17
store i32 0, ptr @foo, align 4, !dbg !17
ret void, !dbg !18
}

; Function Attrs: noinline nounwind optnone uwtable
define i32 @get() #0 !dbg !19 {
entry:
%0 = load i32, i32* @foo, align 4, !dbg !22
%0 = load i32, ptr @foo, align 4, !dbg !22
ret i32 %0, !dbg !23
}

Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Transforms/GlobalOpt/integer-bool.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@
; CHECK: global i1 false

define void @set1() {
store i32 0, i32 addrspace(1)* @G
store i32 0, ptr addrspace(1) @G
; CHECK: store i1 false
ret void
}

define void @set2() {
store i32 1, i32 addrspace(1)* @G
store i32 1, ptr addrspace(1) @G
; CHECK: store i1 true
ret void
}

define i1 @get() {
; CHECK-LABEL: @get(
%A = load i32, i32 addrspace(1) * @G
%A = load i32, ptr addrspace(1) @G
%C = icmp slt i32 %A, 2
ret i1 %C
; CHECK: ret i1 true
Expand Down
65 changes: 28 additions & 37 deletions llvm/test/Transforms/GlobalOpt/invariant.group.ll
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
; RUN: opt -S -passes=globalopt < %s | FileCheck %s

; CHECK: @llvm.global_ctors = appending global [1 x {{.*}}@_GLOBAL__I_c
@llvm.global_ctors = appending global [3 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_b, i8* null }, { i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_c, i8* null }]
@llvm.global_ctors = appending global [3 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_a, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_b, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_c, ptr null }]

; CHECK: @tmp = local_unnamed_addr global i32 42
; CHECK: @tmp2 = local_unnamed_addr global i32 42
; CHECK: @tmp3 = global i32 42
@tmp = global i32 0
@tmp2 = global i32 0
@tmp3 = global i32 0
@ptrToTmp3 = global i32* null
@ptrToTmp3 = global ptr null

define i32 @TheAnswerToLifeTheUniverseAndEverything() {
ret i32 42
Expand All @@ -27,48 +27,43 @@ enter:
%valptr = alloca i32

%val = call i32 @TheAnswerToLifeTheUniverseAndEverything()
store i32 %val, i32* @tmp
store i32 %val, i32* %valptr
store i32 %val, ptr @tmp
store i32 %val, ptr %valptr

%0 = bitcast i32* %valptr to i8*
%barr = call i8* @llvm.launder.invariant.group(i8* %0)
%1 = getelementptr i8, i8* %barr, i32 0
%2 = bitcast i8* %1 to i32*
%barr = call ptr @llvm.launder.invariant.group(ptr %valptr)

%val2 = load i32, i32* %2
store i32 %val2, i32* @tmp2
%val2 = load i32, ptr %barr
store i32 %val2, ptr @tmp2
ret void
}

; We can't step through launder.invariant.group here, because that would change
; this load in @usage_of_globals()
; %val = load i32, i32* %ptrVal, !invariant.group !0
; %val = load i32, ptr %ptrVal, !invariant.group !0
; into
; %val = load i32, i32* @tmp3, !invariant.group !0
; %val = load i32, ptr @tmp3, !invariant.group !0
; and then we could assume that %val and %val2 to be the same, which coud be
; false, because @changeTmp3ValAndCallBarrierInside() may change the value
; of @tmp3.
define void @_not_optimizable() {
enter:
store i32 13, i32* @tmp3, !invariant.group !0
store i32 13, ptr @tmp3, !invariant.group !0

%0 = bitcast i32* @tmp3 to i8*
%barr = call i8* @llvm.launder.invariant.group(i8* %0)
%1 = bitcast i8* %barr to i32*
%barr = call ptr @llvm.launder.invariant.group(ptr @tmp3)

store i32* %1, i32** @ptrToTmp3
store i32 42, i32* %1, !invariant.group !0
store ptr %barr, ptr @ptrToTmp3
store i32 42, ptr %barr, !invariant.group !0

ret void
}

define void @usage_of_globals() {
entry:
%ptrVal = load i32*, i32** @ptrToTmp3
%val = load i32, i32* %ptrVal, !invariant.group !0
%ptrVal = load ptr, ptr @ptrToTmp3
%val = load i32, ptr %ptrVal, !invariant.group !0

call void @changeTmp3ValAndCallBarrierInside()
%val2 = load i32, i32* @tmp3, !invariant.group !0
%val2 = load i32, ptr @tmp3, !invariant.group !0
ret void;
}

Expand All @@ -77,36 +72,32 @@ entry:
define void @_GLOBAL__I_b() {
enter:
%val = call i32 @TheAnswerToLifeTheUniverseAndEverything()
%p1 = bitcast i32* @tmp4 to i8*
%p2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %p1)
%p3 = bitcast i8* %p2 to i32*
store i32 %val, i32* %p3
%p2 = call ptr @llvm.strip.invariant.group.p0(ptr @tmp4)
store i32 %val, ptr %p2
ret void
}

@tmp5 = global i32 0
@tmp6 = global i32* null
; CHECK: @tmp6 = local_unnamed_addr global i32* null

define i32* @_dont_return_param(i32* %p) {
%p1 = bitcast i32* %p to i8*
%p2 = call i8* @llvm.launder.invariant.group(i8* %p1)
%p3 = bitcast i8* %p2 to i32*
ret i32* %p3
@tmp6 = global ptr null
; CHECK: @tmp6 = local_unnamed_addr global ptr null

define ptr @_dont_return_param(ptr %p) {
%p2 = call ptr @llvm.launder.invariant.group(ptr %p)
ret ptr %p2
}

; We should bail out if we return any pointers derived via invariant.group intrinsics at any point.
define void @_GLOBAL__I_c() {
enter:
%tmp5 = call i32* @_dont_return_param(i32* @tmp5)
store i32* %tmp5, i32** @tmp6
%tmp5 = call ptr @_dont_return_param(ptr @tmp5)
store ptr %tmp5, ptr @tmp6
ret void
}


declare void @changeTmp3ValAndCallBarrierInside()

declare i8* @llvm.launder.invariant.group(i8*)
declare i8* @llvm.strip.invariant.group.p0i8(i8*)
declare ptr @llvm.launder.invariant.group(ptr)
declare ptr @llvm.strip.invariant.group.p0(ptr)

!0 = !{}
10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/invoke.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,24 @@
; Globalopt should be able to evaluate an invoke.
; CHECK: @tmp = local_unnamed_addr global i32 1

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @_GLOBAL__I_a, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__I_a, ptr null }]
@tmp = global i32 0

define i32 @one() {
ret i32 1
}

define void @_GLOBAL__I_a() personality i8* undef {
define void @_GLOBAL__I_a() personality ptr undef {
bb:
%tmp1 = invoke i32 @one()
to label %bb2 unwind label %bb4

bb2: ; preds = %bb
store i32 %tmp1, i32* @tmp
store i32 %tmp1, ptr @tmp
ret void

bb4: ; preds = %bb
%tmp5 = landingpad { i8*, i32 }
filter [0 x i8*] zeroinitializer
%tmp5 = landingpad { ptr, i32 }
filter [0 x ptr] zeroinitializer
unreachable
}
8 changes: 4 additions & 4 deletions llvm/test/Transforms/GlobalOpt/iterate.ll
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
; CHECK-NOT: %G

@G = internal global i32 0 ; <i32*> [#uses=1]
@H = internal global { i32* } { i32* @G } ; <{ i32* }*> [#uses=1]
@G = internal global i32 0 ; <ptr> [#uses=1]
@H = internal global { ptr } { ptr @G } ; <ptr> [#uses=1]

define i32 @loadg() {
%G = load i32*, i32** getelementptr ({ i32* }, { i32* }* @H, i32 0, i32 0) ; <i32*> [#uses=1]
%GV = load i32, i32* %G ; <i32> [#uses=1]
%G = load ptr, ptr @H ; <ptr> [#uses=1]
%GV = load i32, ptr %G ; <i32> [#uses=1]
ret i32 %GV
}
4 changes: 2 additions & 2 deletions llvm/test/Transforms/GlobalOpt/large-element-size.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ target datalayout = "p:32:32"
%struct.u.0 = type { i32, i32, i32, i8 }

@s = external global [700 x [24000 x %struct.s.2]], align 1
@p = global %struct.s.2* bitcast (i8* getelementptr (i8, i8* bitcast ([700 x [24000 x %struct.s.2]]* @s to i8*), i64 2247483647) to %struct.s.2*), align 1
@p = global ptr getelementptr (i8, ptr @s, i64 2247483647), align 1

; CHECK: @p = local_unnamed_addr global %struct.s.2* bitcast (i8* getelementptr (i8, i8* bitcast ([700 x [24000 x %struct.s.2]]* @s to i8*), i32 -2047483649) to %struct.s.2*), align 1
; CHECK: @p = local_unnamed_addr global ptr getelementptr (i8, ptr @s, i32 -2047483649), align 1
8 changes: 4 additions & 4 deletions llvm/test/Transforms/GlobalOpt/large-int-crash.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@

define void @foo() {
; CHECK-LABEL: @foo(
; CHECK-NEXT: [[T0_B:%.*]] = load i1, i1* @X
; CHECK-NEXT: [[T0_B:%.*]] = load i1, ptr @X
; CHECK-NEXT: [[T0:%.*]] = select i1 [[T0_B]], i128 18446744073709551616, i128 0
; CHECK-NEXT: ret void
;
%t0 = load i128, i128* @X, align 8
%t0 = load i128, ptr @X, align 8
ret void
}

define void @store() {
; CHECK-LABEL: @store(
; CHECK-NEXT: store i1 true, i1* @X
; CHECK-NEXT: store i1 true, ptr @X
; CHECK-NEXT: ret void
;
store i128 18446744073709551616, i128* @X, align 8
store i128 18446744073709551616, ptr @X, align 8
ret void
}
25 changes: 12 additions & 13 deletions llvm/test/Transforms/GlobalOpt/load-store-global-no-null-opt.ll
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s

@a = internal global i64* null, align 8
@a = internal global ptr null, align 8
; CHECK: @a

; PR13968
define void @qux_no_null_opt() nounwind #0 {
; CHECK-LABEL: @qux_no_null_opt(
; CHECK: getelementptr i64*, i64** @a, i32 1
; CHECK: store i64* inttoptr (i64 1 to i64*), i64** @a
%b = bitcast i64** @a to i8*
%g = getelementptr i64*, i64** @a, i32 1
%cmp = icmp ne i8* null, %b
%cmp2 = icmp eq i8* null, %b
%cmp3 = icmp eq i64** null, %g
store i64* inttoptr (i64 1 to i64*), i64** @a, align 8
%l = load i64*, i64** @a, align 8
; CHECK: getelementptr ptr, ptr @a, i32 1
; CHECK: store ptr inttoptr (i64 1 to ptr), ptr @a
%g = getelementptr ptr, ptr @a, i32 1
%cmp = icmp ne ptr null, @a
%cmp2 = icmp eq ptr null, @a
%cmp3 = icmp eq ptr null, %g
store ptr inttoptr (i64 1 to ptr), ptr @a, align 8
%l = load ptr, ptr @a, align 8
ret void
}

define i64* @bar() {
%X = load i64*, i64** @a, align 8
ret i64* %X
define ptr @bar() {
%X = load ptr, ptr @a, align 8
ret ptr %X
; CHECK-LABEL: @bar(
; CHECK: load
}
Expand Down
23 changes: 11 additions & 12 deletions llvm/test/Transforms/GlobalOpt/load-store-global.ll
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s

@G = internal global i32 17 ; <i32*> [#uses=3]
@G = internal global i32 17 ; <ptr> [#uses=3]
; CHECK-NOT: @G

define void @foo() {
%V = load i32, i32* @G ; <i32> [#uses=1]
store i32 %V, i32* @G
%V = load i32, ptr @G ; <i32> [#uses=1]
store i32 %V, ptr @G
ret void
; CHECK-LABEL: @foo(
; CHECK-NEXT: ret void
}

define i32 @bar() {
%X = load i32, i32* @G ; <i32> [#uses=1]
%X = load i32, ptr @G ; <i32> [#uses=1]
ret i32 %X
; CHECK-LABEL: @bar(
; CHECK-NEXT: ret i32 17
}

@a = internal global i64* null, align 8
@a = internal global ptr null, align 8
; CHECK-NOT: @a

; PR13968
define void @qux() nounwind {
%b = bitcast i64** @a to i8*
%g = getelementptr i64*, i64** @a, i32 1
%cmp = icmp ne i8* null, %b
%cmp2 = icmp eq i8* null, %b
%cmp3 = icmp eq i64** null, %g
store i64* inttoptr (i64 1 to i64*), i64** @a, align 8
%l = load i64*, i64** @a, align 8
%g = getelementptr ptr, ptr @a, i32 1
%cmp = icmp ne ptr null, @a
%cmp2 = icmp eq ptr null, @a
%cmp3 = icmp eq ptr null, %g
store ptr inttoptr (i64 1 to ptr), ptr @a, align 8
%l = load ptr, ptr @a, align 8
ret void
; CHECK-LABEL: @qux(
; CHECK-NOT: store
Expand Down
22 changes: 10 additions & 12 deletions llvm/test/Transforms/GlobalOpt/localize-constexpr-debuginfo.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,25 @@
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

@_ZL1x = internal global [200 x i8]* null, align 8, !dbg !0
@_ZL1x = internal global ptr null, align 8, !dbg !0

define i32 @main(i32 %argc, i8** %argv) norecurse !dbg !18 {
define i32 @main(i32 %argc, ptr %argv) norecurse !dbg !18 {
; CHECK: define i32 @main
; Make sure we localized the global.
; CHECK: alloca [200 x i8]*
; CHECK: alloca ptr
; Make sure the metadata is sane. Currently, we just drop the metadata,
; so it points to nothing.
; CHECK: call void @llvm.dbg.value(metadata !2,
; CHECK: !2 = !{}
entry:
call void @llvm.dbg.value(metadata i32 %argc, metadata !22, metadata !23), !dbg !24
call void @llvm.dbg.value(metadata i8** %argv, metadata !25, metadata !23), !dbg !26
%arrayidx = getelementptr inbounds i8*, i8** %argv, i64 0, !dbg !27
%0 = load i8*, i8** %arrayidx, align 8, !dbg !27
%1 = bitcast i8* %0 to [200 x i8]*, !dbg !28
store [200 x i8]* %1, [200 x i8]** @_ZL1x, align 8, !dbg !29
call void @llvm.dbg.value(metadata i8** bitcast ([200 x i8]** @_ZL1x to i8**), metadata !30, metadata !23), !dbg !31
%2 = load i8*, i8** bitcast ([200 x i8]** @_ZL1x to i8**), align 8, !dbg !32
%3 = load i8, i8* %2, align 1, !dbg !33
%conv = sext i8 %3 to i32, !dbg !33
call void @llvm.dbg.value(metadata ptr %argv, metadata !25, metadata !23), !dbg !26
%0 = load ptr, ptr %argv, align 8, !dbg !27
store ptr %0, ptr @_ZL1x, align 8, !dbg !29
call void @llvm.dbg.value(metadata ptr @_ZL1x, metadata !30, metadata !23), !dbg !31
%1 = load ptr, ptr @_ZL1x, align 8, !dbg !32
%2 = load i8, ptr %1, align 1, !dbg !33
%conv = sext i8 %2 to i32, !dbg !33
ret i32 %conv, !dbg !34
}

Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/localize-constexpr.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,22 @@ define i8 @f() norecurse {
; CHECK: alloca
; CHECK-NOT: @G
; CHECK: }
store i32 42, i32* @G
%a = load i8, i8* bitcast (i32* @G to i8*)
store i32 42, ptr @G
%a = load i8, ptr @G
ret i8 %a
}

@H = internal global i32 42
@Halias = alias i32, i32* @H
@Halias = alias i32, ptr @H

; @H can't be localized because @Halias uses it, and @Halias can't be converted to an instruction.
define i8 @g() norecurse {
; CHECK-LABEL: @g
; CHECK-NOT: alloca
; CHECK: @H
; CHECK: }
store i32 42, i32* @H
%a = load i8, i8* bitcast (i32* @H to i8*)
store i32 42, ptr @H
%a = load i8, ptr @H
ret i8 %a
}

10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/long-compilation-global-sra.ll
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ target triple = "x86_64-unknown-linux-gnu"
; Function Attrs: norecurse uwtable
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i8 0, i8* getelementptr inbounds ([67108864 x i8], [67108864 x i8]* @LargeBufferE, i64 0, i64 0), align 16
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0))
%3 = load i8, i8* getelementptr inbounds ([67108864 x i8], [67108864 x i8]* @LargeBufferE, i64 0, i64 0), align 16
store i32 0, ptr %1, align 4
store i8 0, ptr @LargeBufferE, align 16
%2 = call i32 (ptr, ...) @printf(ptr @.str)
%3 = load i8, ptr @LargeBufferE, align 16
%4 = sext i8 %3 to i32
%5 = icmp eq i32 %4, 0
%6 = zext i1 %5 to i32
ret i32 %6
}

declare dso_local i32 @printf(i8*, ...) #0
declare dso_local i32 @printf(ptr, ...) #0

attributes #0 = { norecurse uwtable }

Expand Down
32 changes: 15 additions & 17 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-1-no-null-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,38 +2,36 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global i32* null ; <i32**> [#uses=3]
@G = internal global ptr null ; <ptr> [#uses=3]

;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i32* null
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global ptr null
;.
define void @init() #0 {
; CHECK-LABEL: @init(
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call i8* @malloc(i64 4)
; CHECK-NEXT: [[P:%.*]] = bitcast i8* [[MALLOCCALL]] to i32*
; CHECK-NEXT: store i32* [[P]], i32** @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load i32*, i32** @G, align 8
; CHECK-NEXT: store i32 0, i32* [[GV]], align 4
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call ptr @malloc(i64 4)
; CHECK-NEXT: store ptr [[MALLOCCALL]], ptr @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load ptr, ptr @G, align 8
; CHECK-NEXT: store i32 0, ptr [[GV]], align 4
; CHECK-NEXT: ret void
;
%malloccall = tail call i8* @malloc(i64 4)
%P = bitcast i8* %malloccall to i32*
store i32* %P, i32** @G
%GV = load i32*, i32** @G
store i32 0, i32* %GV
%malloccall = tail call ptr @malloc(i64 4)
store ptr %malloccall, ptr @G
%GV = load ptr, ptr @G
store i32 0, ptr %GV
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)

define i32 @get() #0 {
; CHECK-LABEL: @get(
; CHECK-NEXT: [[GV:%.*]] = load i32*, i32** @G, align 8
; CHECK-NEXT: [[V:%.*]] = load i32, i32* [[GV]], align 4
; CHECK-NEXT: [[GV:%.*]] = load ptr, ptr @G, align 8
; CHECK-NEXT: [[V:%.*]] = load i32, ptr [[GV]], align 4
; CHECK-NEXT: ret i32 [[V]]
;
%GV = load i32*, i32** @G
%V = load i32, i32* %GV
%GV = load ptr, ptr @G
%V = load i32, ptr %GV
ret i32 %V
}

Expand Down
19 changes: 9 additions & 10 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-1.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,27 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global i32* null
@G = internal global ptr null

define void @init() {
; CHECK-LABEL: @init(
; CHECK-NEXT: ret void
;
%malloccall = tail call i8* @malloc(i64 4)
%P = bitcast i8* %malloccall to i32*
store i32* %P, i32** @G
%GV = load i32*, i32** @G
store i32 0, i32* %GV
%malloccall = tail call ptr @malloc(i64 4)
store ptr %malloccall, ptr @G
%GV = load ptr, ptr @G
store i32 0, ptr %GV
ret void
}

declare noalias i8* @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
declare noalias ptr @malloc(i64) allockind("alloc,uninitialized") allocsize(0)

define i32 @get() {
; CHECK-LABEL: @get(
; CHECK-NEXT: ret i32 0
;
%GV = load i32*, i32** @G
%V = load i32, i32* %GV
%GV = load ptr, ptr @G
%V = load i32, ptr %GV
ret i32 %V
}

Expand All @@ -33,7 +32,7 @@ define void @foo(i64 %Size) nounwind noinline #0 {
; CHECK-NEXT: ret void
;
entry:
%0 = load i32*, i32** @G, align 4
%0 = load ptr, ptr @G, align 4
ret void
}

Expand Down
28 changes: 13 additions & 15 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-2-no-null-opt.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,29 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global i32* null
@G = internal global ptr null

;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i32* null
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global ptr null
;.
define void @t() #0 {
; CHECK-LABEL: @t(
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call i8* @malloc(i64 400)
; CHECK-NEXT: [[P:%.*]] = bitcast i8* [[MALLOCCALL]] to i32*
; CHECK-NEXT: store i32* [[P]], i32** @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load i32*, i32** @G, align 8
; CHECK-NEXT: [[GVE:%.*]] = getelementptr i32, i32* [[GV]], i32 40
; CHECK-NEXT: store i32 20, i32* [[GVE]], align 4
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call ptr @malloc(i64 400)
; CHECK-NEXT: store ptr [[MALLOCCALL]], ptr @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load ptr, ptr @G, align 8
; CHECK-NEXT: [[GVE:%.*]] = getelementptr i32, ptr [[GV]], i32 40
; CHECK-NEXT: store i32 20, ptr [[GVE]], align 4
; CHECK-NEXT: ret void
;
%malloccall = tail call i8* @malloc(i64 mul (i64 100, i64 4))
%P = bitcast i8* %malloccall to i32*
store i32* %P, i32** @G
%GV = load i32*, i32** @G
%GVe = getelementptr i32, i32* %GV, i32 40
store i32 20, i32* %GVe
%malloccall = tail call ptr @malloc(i64 mul (i64 100, i64 4))
store ptr %malloccall, ptr @G
%GV = load ptr, ptr @G
%GVe = getelementptr i32, ptr %GV, i32 40
store i32 20, ptr %GVe
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)
attributes #0 = { null_pointer_is_valid }
;.
; CHECK: attributes #[[ATTR0:[0-9]+]] = { null_pointer_is_valid }
Expand Down
17 changes: 8 additions & 9 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,29 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global i32* null
@G = internal global ptr null

define void @t() {
; CHECK-LABEL: @t(
; CHECK-NEXT: ret void
;
%malloccall = tail call i8* @malloc(i64 mul (i64 100, i64 4))
%P = bitcast i8* %malloccall to i32*
store i32* %P, i32** @G
%GV = load i32*, i32** @G
%GVe = getelementptr i32, i32* %GV, i32 40
store i32 20, i32* %GVe
%malloccall = tail call ptr @malloc(i64 mul (i64 100, i64 4))
store ptr %malloccall, ptr @G
%GV = load ptr, ptr @G
%GVe = getelementptr i32, ptr %GV, i32 40
store i32 20, ptr %GVe
ret void
}

declare noalias i8* @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
declare noalias ptr @malloc(i64) allockind("alloc,uninitialized") allocsize(0)

define void @foo(i64 %Size) nounwind noinline #0 {
; CHECK-LABEL: @foo(
; CHECK-NEXT: entry:
; CHECK-NEXT: ret void
;
entry:
%0 = load i32*, i32** @G, align 4
%0 = load ptr, ptr @G, align 4
ret void
}

Expand Down
28 changes: 13 additions & 15 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-3.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,29 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"

@G = internal global i32* null
@G = internal global ptr null

;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i32* null
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global ptr null
;.
define void @t() {
; CHECK-LABEL: @t(
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call i8* @malloc(i64 400) #[[ATTR0:[0-9]+]]
; CHECK-NEXT: [[P:%.*]] = bitcast i8* [[MALLOCCALL]] to i32*
; CHECK-NEXT: store i32* [[P]], i32** @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load i32*, i32** @G, align 8
; CHECK-NEXT: [[GVE:%.*]] = getelementptr i32, i32* [[GV]], i32 40
; CHECK-NEXT: store i32 20, i32* [[GVE]], align 4
; CHECK-NEXT: [[MALLOCCALL:%.*]] = tail call ptr @malloc(i64 400) #[[ATTR0:[0-9]+]]
; CHECK-NEXT: store ptr [[MALLOCCALL]], ptr @G, align 8
; CHECK-NEXT: [[GV:%.*]] = load ptr, ptr @G, align 8
; CHECK-NEXT: [[GVE:%.*]] = getelementptr i32, ptr [[GV]], i32 40
; CHECK-NEXT: store i32 20, ptr [[GVE]], align 4
; CHECK-NEXT: ret void
;
%malloccall = tail call i8* @malloc(i64 mul (i64 100, i64 4)) nobuiltin
%P = bitcast i8* %malloccall to i32*
store i32* %P, i32** @G
%GV = load i32*, i32** @G
%GVe = getelementptr i32, i32* %GV, i32 40
store i32 20, i32* %GVe
%malloccall = tail call ptr @malloc(i64 mul (i64 100, i64 4)) nobuiltin
store ptr %malloccall, ptr @G
%GV = load ptr, ptr @G
%GVe = getelementptr i32, ptr %GV, i32 40
store i32 20, ptr %GVe
ret void
}

declare noalias i8* @malloc(i64)
declare noalias ptr @malloc(i64)
;.
; CHECK: attributes #[[ATTR0]] = { nobuiltin }
;.
21 changes: 10 additions & 11 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-4.ll
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-globals
; RUN: opt -S -passes=globalopt -o - < %s | FileCheck %s

@g = internal global i32* null, align 8
@g = internal global ptr null, align 8

;.
; CHECK: @[[G_INIT:[a-zA-Z0-9_$"\\.-]+]] = internal unnamed_addr global i1 false
;.
define internal i32 @f1() {
; CHECK-LABEL: define {{[^@]+}}@f1() unnamed_addr {
; CHECK-NEXT: [[G_INIT_VAL:%.*]] = load i1, i1* @g.init, align 1
; CHECK-NEXT: [[G_INIT_VAL:%.*]] = load i1, ptr @g.init, align 1
; CHECK-NEXT: call fastcc void @f2()
; CHECK-NEXT: [[NOTINIT:%.*]] = xor i1 [[G_INIT_VAL]], true
; CHECK-NEXT: br i1 [[NOTINIT]], label [[TMP1:%.*]], label [[TMP2:%.*]]
Expand All @@ -20,9 +20,9 @@ define internal i32 @f1() {
; CHECK-NEXT: [[TMP4:%.*]] = phi i32 [ -1, [[TMP1]] ], [ 1, [[TMP2]] ]
; CHECK-NEXT: ret i32 [[TMP4]]
;
%1 = load i32*, i32** @g, align 8
%1 = load ptr, ptr @g, align 8
call void @f2();
%2 = icmp eq i32* %1, null
%2 = icmp eq ptr %1, null
br i1 %2, label %3, label %4

3: ; preds = %0
Expand All @@ -38,24 +38,23 @@ define internal i32 @f1() {

define internal void @f2() {
; CHECK-LABEL: define {{[^@]+}}@f2() unnamed_addr {
; CHECK-NEXT: store i1 true, i1* @g.init, align 1
; CHECK-NEXT: store i1 true, ptr @g.init, align 1
; CHECK-NEXT: ret void
;
%1 = call noalias i8* @malloc(i64 4)
%2 = bitcast i8* %1 to i32*
store i32* %2, i32** @g, align 8
%1 = call noalias ptr @malloc(i64 4)
store ptr %1, ptr @g, align 8
ret void
}

define dso_local i32 @main() {
; CHECK-LABEL: define {{[^@]+}}@main() local_unnamed_addr {
; CHECK-NEXT: store i1 false, i1* @g.init, align 1
; CHECK-NEXT: store i1 false, ptr @g.init, align 1
; CHECK-NEXT: [[TMP1:%.*]] = call fastcc i32 @f1()
; CHECK-NEXT: ret i32 [[TMP1]]
;
store i32* null, i32** @g, align 8
store ptr null, ptr @g, align 8
%1 = call i32 @f1()
ret i32 %1
}

declare dso_local noalias i8* @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
declare dso_local noalias ptr @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
32 changes: 15 additions & 17 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-5.ll
Original file line number Diff line number Diff line change
@@ -1,20 +1,18 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -passes=globalopt -S < %s | FileCheck %s

@g = internal global i32* null, align 8
@g = internal global ptr null, align 8

define signext i32 @f() local_unnamed_addr {
; CHECK-LABEL: @f(
; CHECK-NEXT: entry:
; CHECK-NEXT: store i16 -1, i16* bitcast ([4 x i8]* @g.body to i16*), align 2
; CHECK-NEXT: store i16 -1, ptr @g.body, align 2
; CHECK-NEXT: ret i32 0
;
entry:
%call = call i8* @malloc(i64 4)
%b = bitcast i8* %call to i32*
store i32* %b, i32** @g, align 8
%b2 = bitcast i8* %call to i16*
store i16 -1, i16* %b2
%call = call ptr @malloc(i64 4)
store ptr %call, ptr @g, align 8
store i16 -1, ptr %call
ret i32 0
}

Expand All @@ -23,26 +21,26 @@ define signext i32 @main() {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CALL:%.*]] = call signext i32 @f()
; CHECK-NEXT: call void @f1()
; CHECK-NEXT: store i32 1, i32* bitcast ([4 x i8]* @g.body to i32*), align 4
; CHECK-NEXT: store i32 1, ptr @g.body, align 4
; CHECK-NEXT: call void @f1()
; CHECK-NEXT: store i8 2, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @g.body, i32 0, i32 0), align 4
; CHECK-NEXT: store i8 2, ptr @g.body, align 4
; CHECK-NEXT: call void @f1()
; CHECK-NEXT: [[RES:%.*]] = load i32, i32* bitcast ([4 x i8]* @g.body to i32*), align 4
; CHECK-NEXT: [[RES:%.*]] = load i32, ptr @g.body, align 4
; CHECK-NEXT: ret i32 [[RES]]
;
entry:
%call = call signext i32 @f()
call void @f1()
%v0 = load i32*, i32** @g, align 8
store i32 1, i32* %v0, align 4
%v0 = load ptr, ptr @g, align 8
store i32 1, ptr %v0, align 4
call void @f1()
%v1 = load i8*, i8** bitcast (i32** @g to i8**), align 8
store i8 2, i8* %v1, align 4
%v1 = load ptr, ptr @g, align 8
store i8 2, ptr %v1, align 4
call void @f1()
%v2 = load i32*, i32** @g, align 8
%res = load i32, i32* %v2, align 4
%v2 = load ptr, ptr @g, align 8
%res = load i32, ptr %v2, align 4
ret i32 %res
}

declare noalias align 16 i8* @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
declare noalias align 16 ptr @malloc(i64) allockind("alloc,uninitialized") allocsize(0)
declare void @f1()
20 changes: 9 additions & 11 deletions llvm/test/Transforms/GlobalOpt/malloc-promote-6.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,27 @@

; CHECK-NOT: @global

@global = internal global i8* null
@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @zot, i8* null }]
@global = internal global ptr null
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @zot, ptr null }]

declare i8* @_Znwm(i64)
declare ptr @_Znwm(i64)

define internal void @widget() {
%tmp = tail call i8* @_Znwm(i64 0)
%tmp2 = getelementptr inbounds i8, i8* %tmp, i64 0
store i8* %tmp, i8** @global, align 8
call void @baz(void ()* @spam)
%tmp = tail call ptr @_Znwm(i64 0)
store ptr %tmp, ptr @global, align 8
call void @baz(ptr @spam)
ret void
}

define internal void @spam() {
%tmp = load i8*, i8** @global, align 8
%tmp2 = getelementptr inbounds i8, i8* %tmp, i64 0
%tmp = load ptr, ptr @global, align 8
ret void
}

define internal void @zot() {
call void @baz(void ()* @widget)
call void @baz(ptr @widget)
ret void
}

declare void @baz(void ()*)
declare void @baz(ptr)

7 changes: 3 additions & 4 deletions llvm/test/Transforms/GlobalOpt/memcpy.ll
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
; CHECK: G1 = internal unnamed_addr constant

@G1 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <[58 x i8]*> [#uses=1]
@G1 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <ptr> [#uses=1]

define void @foo() {
%Blah = alloca [58 x i8]
%tmp.0 = getelementptr [58 x i8], [58 x i8]* %Blah, i32 0, i32 0
call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 1 %tmp.0, i8* align 1 getelementptr inbounds ([58 x i8], [58 x i8]* @G1, i32 0, i32 0), i32 58, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr align 1 %Blah, ptr align 1 @G1, i32 58, i1 false)
ret void
}

declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind
14 changes: 7 additions & 7 deletions llvm/test/Transforms/GlobalOpt/memset-null.ll
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
; RUN: opt -passes=globalopt -S < %s | FileCheck %s
; PR10047

%0 = type { i32, void ()*, i8* }
%0 = type { i32, ptr, ptr }
%struct.A = type { [100 x i32] }

; CHECK: @a
@a = global %struct.A zeroinitializer, align 4
@llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, void ()* @_GLOBAL__I_a, i8* null }, %0 { i32 65535, void ()* @_GLOBAL__I_b, i8* null }]
@llvm.global_ctors = appending global [2 x %0] [%0 { i32 65535, ptr @_GLOBAL__I_a, ptr null }, %0 { i32 65535, ptr @_GLOBAL__I_b, ptr null }]

declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i1) nounwind
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) nounwind

; CHECK-NOT: GLOBAL__I_a
define internal void @_GLOBAL__I_a() nounwind {
entry:
tail call void @llvm.memset.p0i8.i64(i8* align 4 bitcast (%struct.A* @a to i8*), i8 0, i64 400, i1 false) nounwind
tail call void @llvm.memset.p0.i64(ptr align 4 @a, i8 0, i64 400, i1 false) nounwind
ret void
}

%struct.X = type { i8 }
@y = global i8* null, align 8
@y = global ptr null, align 8
@x = global %struct.X zeroinitializer, align 1

define internal void @_GLOBAL__I_b() nounwind {
entry:
%tmp.i.i.i = load i8*, i8** @y, align 8
tail call void @llvm.memset.p0i8.i64(i8* %tmp.i.i.i, i8 0, i64 10, i1 false) nounwind
%tmp.i.i.i = load ptr, ptr @y, align 8
tail call void @llvm.memset.p0.i64(ptr %tmp.i.i.i, i8 0, i64 10, i1 false) nounwind
ret void
}
24 changes: 11 additions & 13 deletions llvm/test/Transforms/GlobalOpt/memset.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,28 +4,26 @@

; Both globals are write only, delete them.

@G0 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <[58 x i8]*> [#uses=1]
@G1 = internal global [4 x i32] [ i32 1, i32 2, i32 3, i32 4 ] ; <[4 x i32]*> [#uses=1]
@G0 = internal global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <ptr> [#uses=1]
@G1 = internal global [4 x i32] [ i32 1, i32 2, i32 3, i32 4 ] ; <ptr> [#uses=1]

define void @foo() {
%Blah = alloca [58 x i8]
%tmp3 = bitcast [58 x i8]* %Blah to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* bitcast ([4 x i32]* @G1 to i8*), i8* %tmp3, i32 16, i1 false)
call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @G0, i32 0, i32 0), i8 17, i32 58, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr @G1, ptr %Blah, i32 16, i1 false)
call void @llvm.memset.p0.i32(ptr @G0, i8 17, i32 58, i1 false)
ret void
}

@G0_as1 = internal addrspace(1) global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <[58 x i8]*> [#uses=1]
@G1_as1 = internal addrspace(1) global [4 x i32] [ i32 1, i32 2, i32 3, i32 4 ] ; <[4 x i32]*> [#uses=1]
@G0_as1 = internal addrspace(1) global [58 x i8] c"asdlfkajsdlfkajsd;lfkajds;lfkjasd;flkajsd;lkfja;sdlkfjasd\00" ; <ptr> [#uses=1]
@G1_as1 = internal addrspace(1) global [4 x i32] [ i32 1, i32 2, i32 3, i32 4 ] ; <ptr> [#uses=1]

define void @foo_as1() {
%Blah = alloca [58 x i8]
%tmp3 = bitcast [58 x i8]* %Blah to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* addrspacecast ([4 x i32] addrspace(1)* @G1_as1 to i8*), i8* %tmp3, i32 16, i1 false)
call void @llvm.memset.p1i8.i32(i8 addrspace(1)* getelementptr inbounds ([58 x i8], [58 x i8] addrspace(1)* @G0_as1, i32 0, i32 0), i8 17, i32 58, i1 false)
call void @llvm.memcpy.p0.p0.i32(ptr addrspacecast (ptr addrspace(1) @G1_as1 to ptr), ptr %Blah, i32 16, i1 false)
call void @llvm.memset.p1.i32(ptr addrspace(1) @G0_as1, i8 17, i32 58, i1 false)
ret void
}

declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i1) nounwind
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i1) nounwind
declare void @llvm.memset.p1i8.i32(i8 addrspace(1)* nocapture, i8, i32, i1) nounwind
declare void @llvm.memcpy.p0.p0.i32(ptr nocapture, ptr nocapture, i32, i1) nounwind
declare void @llvm.memset.p0.i32(ptr nocapture, i8, i32, i1) nounwind
declare void @llvm.memset.p1.i32(ptr addrspace(1) nocapture, i8, i32, i1) nounwind
10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/metadata.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
; PR6112 - When globalopt does RAUW(@G, %G), the metadata reference should drop
; to null. Function local metadata that references @G from a different function
; to that containing %G should likewise drop to null.
@G = internal global i8** null
@G = internal global ptr null

define i32 @main(i32 %argc, i8** %argv) norecurse {
define i32 @main(i32 %argc, ptr %argv) norecurse {
; CHECK-LABEL: @main(
; CHECK: %G = alloca
store i8** %argv, i8*** @G
store ptr %argv, ptr @G
ret i32 0
}

Expand All @@ -17,7 +17,7 @@ define void @foo(i32 %x) {
; for 'MetadataAsValue::get(ValueAsMetadata::get(Value*))'. When @G drops to
; null, the ValueAsMetadata instance gets replaced by metadata !{}, or
; MDNode::get({}).
call void @llvm.foo(metadata i8*** @G, metadata i32 %x)
call void @llvm.foo(metadata ptr @G, metadata i32 %x)
; CHECK: call void @llvm.foo(metadata ![[EMPTY:[0-9]+]], metadata i32 %x)
ret void
}
Expand All @@ -27,6 +27,6 @@ declare void @llvm.foo(metadata, metadata) nounwind readnone
!named = !{!0}
; CHECK: !named = !{![[NULL:[0-9]+]]}

!0 = !{i8*** @G}
!0 = !{ptr @G}
; CHECK-DAG: ![[NULL]] = distinct !{null}
; CHECK-DAG: ![[EMPTY]] = !{}
8 changes: 4 additions & 4 deletions llvm/test/Transforms/GlobalOpt/naked_functions.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@

define i32 @bar() {
entry:
%call = call i32 @foo(i32* @g)
; CHECK: %call = call i32 @foo(i32* @g)
%call = call i32 @foo(ptr @g)
; CHECK: %call = call i32 @foo(ptr @g)
ret i32 %call
}

define internal i32 @foo(i32*) #0 {
define internal i32 @foo(ptr) #0 {
entry:
%retval = alloca i32, align 4
call void asm sideeffect "ldr r0, [r0] \0Abx lr \0A", ""()
unreachable
}

; CHECK: define internal i32 @foo(i32* %0)
; CHECK: define internal i32 @foo(ptr %0)

attributes #0 = { naked }
21 changes: 9 additions & 12 deletions llvm/test/Transforms/GlobalOpt/new-promote.ll
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
; RUN: opt -passes=globalopt -S < %s | FileCheck %s

%s = type { i32 }
@g = internal global %s* null, align 8
@g = internal global ptr null, align 8

; Test code pattern for:
; class s { int a; s() { a = 1;} };
Expand All @@ -12,11 +12,9 @@ define internal void @f() {
; CHECK-LABEL: @f(
; CHECK-NEXT: ret void
;
%1 = tail call i8* @_Znwm(i64 4)
%2 = bitcast i8* %1 to %s*
%3 = getelementptr inbounds %s, %s* %2, i64 0, i32 0
store i32 1, i32* %3, align 4
store i8* %1, i8** bitcast (%s** @g to i8**), align 8
%1 = tail call ptr @_Znwm(i64 4)
store i32 1, ptr %1, align 4
store ptr %1, ptr @g, align 8
ret void
}

Expand All @@ -28,13 +26,12 @@ define dso_local signext i32 @main() {
;
entry:
call void @f()
%0 = load %s*, %s** @g, align 4
%1 = getelementptr inbounds %s, %s* %0, i64 0, i32 0
%2 = load i32, i32* %1, align 4
ret i32 %2
%0 = load ptr, ptr @g, align 4
%1 = load i32, ptr %0, align 4
ret i32 %1
}

declare nonnull i8* @_Znwm(i64)
declare nonnull ptr @_Znwm(i64)

declare signext i32 @printf(i8*, ...)
declare signext i32 @printf(ptr, ...)

18 changes: 9 additions & 9 deletions llvm/test/Transforms/GlobalOpt/null-check-global-value.ll
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@
; RUN: opt -passes=globalopt -S < %s | FileCheck %s

%sometype = type { i8* }
%sometype = type { ptr }

@map = internal unnamed_addr global %sometype* null, align 8
@map = internal unnamed_addr global ptr null, align 8

define void @Init() {
; CHECK-LABEL: @Init(
; CHECK-NEXT: entry:
; CHECK-NEXT: store i1 true, i1* @map.init, align 1
; CHECK-NEXT: store i1 true, ptr @map.init, align 1
; CHECK-NEXT: ret void
;
entry:
%call = tail call noalias nonnull dereferenceable(48) i8* @_Znwm(i64 48)
store i8* %call, i8** bitcast (%sometype** @map to i8**), align 8
%call = tail call noalias nonnull dereferenceable(48) ptr @_Znwm(i64 48)
store ptr %call, ptr @map, align 8
ret void
}

define void @Usage() {
; CHECK-LABEL: @Usage(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[MAP_INIT_VAL:%.*]] = load i1, i1* @map.init, align 1
; CHECK-NEXT: [[MAP_INIT_VAL:%.*]] = load i1, ptr @map.init, align 1
; CHECK-NEXT: [[NOTINIT:%.*]] = xor i1 [[MAP_INIT_VAL]], true
; CHECK-NEXT: unreachable
;
entry:
%0 = load i8*, i8** bitcast (%sometype** @map to i8**), align 8
%.not = icmp eq i8* %0, null
%0 = load ptr, ptr @map, align 8
%.not = icmp eq ptr %0, null
unreachable
}

declare i8* @_Znwm(i64)
declare ptr @_Znwm(i64)
12 changes: 6 additions & 6 deletions llvm/test/Transforms/GlobalOpt/phi-select.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
; CHECK-NOT: global

@X = internal global i32 4 ; <i32*> [#uses=2]
@Y = internal global i32 5 ; <i32*> [#uses=2]
@X = internal global i32 4 ; <ptr> [#uses=2]
@Y = internal global i32 5 ; <ptr> [#uses=2]

define i32 @test1(i1 %C) {
%P = select i1 %C, i32* @X, i32* @Y ; <i32*> [#uses=1]
%V = load i32, i32* %P ; <i32> [#uses=1]
%P = select i1 %C, ptr @X, ptr @Y ; <ptr> [#uses=1]
%V = load i32, ptr %P ; <i32> [#uses=1]
ret i32 %V
}

Expand All @@ -21,7 +21,7 @@ T: ; preds = %0
br label %Cont

Cont: ; preds = %T, %0
%P = phi i32* [ @X, %0 ], [ @Y, %T ] ; <i32*> [#uses=1]
%V = load i32, i32* %P ; <i32> [#uses=1]
%P = phi ptr [ @X, %0 ], [ @Y, %T ] ; <ptr> [#uses=1]
%V = load i32, ptr %P ; <i32> [#uses=1]
ret i32 %V
}
2 changes: 1 addition & 1 deletion llvm/test/Transforms/GlobalOpt/pr33686.ll
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ entry:
ret void

notreachable:
%patatino = select i1 undef, i16* @glob, i16* %patatino
%patatino = select i1 undef, ptr @glob, ptr %patatino
br label %notreachable
}
4 changes: 2 additions & 2 deletions llvm/test/Transforms/GlobalOpt/pr39751.ll
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
define void @f1() {
; CHECK-LABEL: @f1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i16], [2 x i16]* @a, i32 0, <2 x i32> <i32 0, i32 1>
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [2 x i16], ptr @a, i32 0, <2 x i32> <i32 0, i32 1>
; CHECK-NEXT: ret void
;
entry:
%gep = getelementptr inbounds [2 x i16], [2 x i16]* @a, i32 0, <2 x i32> <i32 0, i32 1>
%gep = getelementptr inbounds [2 x i16], ptr @a, i32 0, <2 x i32> <i32 0, i32 1>
ret void
}
22 changes: 11 additions & 11 deletions llvm/test/Transforms/GlobalOpt/pr51879.ll
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals
; RUN: opt -S -passes=globalopt < %s | FileCheck %s

%type = type { { i8** } }
%type = type { { ptr } }

@g = internal global %type zeroinitializer
@g2 = external global i8*
@g2 = external global ptr

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }]

;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal global [[TYPE:%.*]] { { i8** } { i8** @g2 } }
; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = external global i8*
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = internal global [[TYPE:%.*]] { { ptr } { ptr @g2 } }
; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = external global ptr
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, ptr, ptr }] zeroinitializer
;.
define internal void @ctor() {
store i64 0, i64* bitcast (%type* @g to i64*), align 8
store i8** @g2, i8*** getelementptr inbounds (%type, %type* @g, i64 0, i32 0, i32 0), align 8
store i64 0, ptr @g, align 8
store ptr @g2, ptr @g, align 8
ret void
}

define %type* @test() {
define ptr @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: ret %type* @g
; CHECK-NEXT: ret ptr @g
;
ret %type* @g
ret ptr @g
}
6 changes: 3 additions & 3 deletions llvm/test/Transforms/GlobalOpt/pr52994.ll
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@

; Check that aggregate stores work correctly.

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }]

@g = global { i64, i64 } poison

;.
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, void ()*, i8* }] zeroinitializer
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [0 x { i32, ptr, ptr }] zeroinitializer
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i64, i64 } { i64 1, i64 2 }
;.
define internal void @ctor() {
store { i64, i64 } { i64 1, i64 2 }, { i64, i64 }* @g
store { i64, i64 } { i64 1, i64 2 }, ptr @g
ret void
}
8 changes: 4 additions & 4 deletions llvm/test/Transforms/GlobalOpt/pr53002.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@

@g = global %T zeroinitializer

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }]

;.
; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [[T:%.*]] zeroinitializer
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }]
; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor, ptr null }]
;.
define internal void @ctor() {
; CHECK-LABEL: @ctor(
; CHECK-NEXT: store i8 0, i8* getelementptr inbounds ([[T:%.*]], %T* @g, i64 0, i32 0, i64 5), align 1
; CHECK-NEXT: store i8 0, ptr getelementptr inbounds ([[T:%.*]], ptr @g, i64 0, i32 0, i64 5), align 1
; CHECK-NEXT: ret void
;
store i8 0, i8* getelementptr inbounds (%T, %T* @g, i64 0, i32 0, i64 5)
store i8 0, ptr getelementptr inbounds (%T, ptr @g, i64 0, i32 0, i64 5)
ret void
}
26 changes: 13 additions & 13 deletions llvm/test/Transforms/GlobalOpt/preserve-comdats.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,31 @@ $comdat_global = comdat any
; CHECK: @comdat_global = weak_odr global i8 0, comdat{{$}}
; CHECK: @simple_global = internal global i8 42

@llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [
{ i32, void ()*, i8* } { i32 65535, void ()* @init_comdat_global, i8* @comdat_global },
{ i32, void ()*, i8* } { i32 65535, void ()* @init_simple_global, i8* null }
@llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [
{ i32, ptr, ptr } { i32 65535, ptr @init_comdat_global, ptr @comdat_global },
{ i32, ptr, ptr } { i32 65535, ptr @init_simple_global, ptr null }
]
; CHECK: @llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }]
; CHECK: [{ i32, void ()*, i8* } { i32 65535, void ()* @init_comdat_global, i8* @comdat_global }]
; CHECK: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }]
; CHECK: [{ i32, ptr, ptr } { i32 65535, ptr @init_comdat_global, ptr @comdat_global }]

define void @init_comdat_global() {
store i8 42, i8* @comdat_global
store i8 42, ptr @comdat_global
ret void
}
; CHECK: define void @init_comdat_global()

define internal void @init_simple_global() comdat($comdat_global) {
store i8 42, i8* @simple_global
store i8 42, ptr @simple_global
ret void
}
; CHECK-NOT: @init_simple_global()

define i8* @use_simple() {
ret i8* @simple_global
define ptr @use_simple() {
ret ptr @simple_global
}
; CHECK: define i8* @use_simple()
; CHECK: define ptr @use_simple()

define i8* @use_comdat() {
ret i8* @comdat_global
define ptr @use_comdat() {
ret ptr @comdat_global
}
; CHECK: define i8* @use_comdat()
; CHECK: define ptr @use_comdat()
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
; a constant in the meantime. Make sure this does not cause an assertion
; failure.

@a = internal global i32** null
@b = internal global i32*** @a
@a = internal global ptr null
@b = internal global ptr @a

define void @test() {
; CHECK-LABEL: @test(
; CHECK-NEXT: ret void
;
%v1 = load i32***, i32**** @b
%v2 = load i32**, i32*** %v1
store i32** %v2, i32*** @a
%v1 = load ptr, ptr @b
%v2 = load ptr, ptr %v1
store ptr %v2, ptr @a
ret void
}

10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/shrink-address-to-bool.ll
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
;RUN: opt -S -passes=globalopt -f %s | FileCheck %s

;CHECK: @foo = {{.*}}, !dbg !0
@foo = global i64 ptrtoint ([1 x i64]* @baa to i64), align 8, !dbg !0
@foo = global i64 ptrtoint (ptr @baa to i64), align 8, !dbg !0
@baa = common global [1 x i64] zeroinitializer, align 8, !dbg !6

; Function Attrs: noinline nounwind optnone uwtable
define void @fun() #0 !dbg !16 {
entry:
%0 = load i64, i64* @foo, align 8, !dbg !19
%1 = inttoptr i64 %0 to i64*, !dbg !19
%cmp = icmp ugt i64* getelementptr inbounds ([1 x i64], [1 x i64]* @baa, i32 0, i32 0), %1, !dbg !20
%0 = load i64, ptr @foo, align 8, !dbg !19
%1 = inttoptr i64 %0 to ptr, !dbg !19
%cmp = icmp ugt ptr @baa, %1, !dbg !20
%conv = zext i1 %cmp to i32, !dbg !20
store i64 0, i64* @foo, align 8, !dbg !21
store i64 0, ptr @foo, align 8, !dbg !21
ret void, !dbg !22
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@

define void @store() {
entry:
store i32 5, i32* @foo, align 4
store i32 5, ptr @foo, align 4
ret void
}

define i32 @bar() {
entry:
%0 = load i32, i32* @foo, align 4
%0 = load i32, ptr @foo, align 4
ret i32 %0
}

;CHECK: @bar
;CHECK-NEXT: entry:
;CHECK-NEXT: %.b = load i1, i1* @foo, align 1, !dbg ![[DbgLocLoadSel:[0-9]+]]
;CHECK-NEXT: %.b = load i1, ptr @foo, align 1, !dbg ![[DbgLocLoadSel:[0-9]+]]
;CHECK-NEXT: %0 = select i1 %.b, i32 5, i32 0, !dbg ![[DbgLocLoadSel]]
;CHECK-NEXT: call void @llvm.dbg.value({{.*}}), !dbg ![[DbgLocLoadSel]]
;CHECK-NEXT: ret i32 %0, !dbg ![[DbgLocRet:[0-9]+]]
Expand Down
20 changes: 10 additions & 10 deletions llvm/test/Transforms/GlobalOpt/shrink-global-to-bool.ll
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,32 @@

define void @test_global_var(i1 %i) {
; CHECK-LABEL: @test_global_var(
; CHECK: store volatile i32 10, i32* undef, align 4
; CHECK: store volatile i32 10, ptr undef, align 4
;
entry:
br i1 %i, label %bb1, label %exit
bb1:
store i32 10, i32* @gvar
store i32 10, ptr @gvar
br label %exit
exit:
%ld = load i32, i32* @gvar
store volatile i32 %ld, i32* undef
%ld = load i32, ptr @gvar
store volatile i32 %ld, ptr undef
ret void
}

define void @test_lds_var(i1 %i) {
; CHECK-LABEL: @test_lds_var(
; CHECK: store i32 10, i32 addrspace(3)* @lvar, align 4
; CHECK: [[LD:%.*]] = load i32, i32 addrspace(3)* @lvar, align 4
; CHECK: store volatile i32 [[LD]], i32* undef, align 4
; CHECK: store i32 10, ptr addrspace(3) @lvar, align 4
; CHECK: [[LD:%.*]] = load i32, ptr addrspace(3) @lvar, align 4
; CHECK: store volatile i32 [[LD]], ptr undef, align 4
;
entry:
br i1 %i, label %bb1, label %exit
bb1:
store i32 10, i32 addrspace(3)* @lvar
store i32 10, ptr addrspace(3) @lvar
br label %exit
exit:
%ld = load i32, i32 addrspace(3)* @lvar
store volatile i32 %ld, i32* undef
%ld = load i32, ptr addrspace(3) @lvar
store volatile i32 %ld, ptr undef
ret void
}
33 changes: 15 additions & 18 deletions llvm/test/Transforms/GlobalOpt/static-const-bitcast.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,45 +10,42 @@ $Wrapper = comdat any
@kA = internal global %struct.A zeroinitializer, align 4
; CHECK: @kA = internal unnamed_addr constant %struct.A { %class.Wrapper { i32 1036831949 } }, align 4

@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } {
i32 65535, void ()* @_GLOBAL__sub_I_const_static.cc, i8* null }]
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } {
i32 65535, ptr @_GLOBAL__sub_I_const_static.cc, ptr null }]

define dso_local i32 @AsBits(float* %x) #0 {
define dso_local i32 @AsBits(ptr %x) #0 {
entry:
%0 = bitcast float* %x to i32*
%1 = load i32, i32* %0, align 4
ret i32 %1
%0 = load i32, ptr %x, align 4
ret i32 %0
}

define internal void @__cxx_global_var_init() #1 section ".text.startup" {
entry:
call void @Wrapper(%class.Wrapper* getelementptr inbounds (%struct.A, %struct.A* @kA, i32 0, i32 0), float 0x3FB99999A0000000)
%0 = call {}* @llvm.invariant.start.p0i8(i64 4, i8* bitcast (%struct.A* @kA to i8*))
call void @Wrapper(ptr @kA, float 0x3FB99999A0000000)
%0 = call ptr @llvm.invariant.start.p0(i64 4, ptr @kA)
ret void
}

define linkonce_odr dso_local void @Wrapper(%class.Wrapper* %this, float %x) unnamed_addr #0 comdat align 2 {
define linkonce_odr dso_local void @Wrapper(ptr %this, float %x) unnamed_addr #0 comdat align 2 {
entry:
%x.addr = alloca float, align 4
store float %x, float* %x.addr, align 4
%store_ = getelementptr inbounds %class.Wrapper, %class.Wrapper* %this, i32 0, i32 0
%call = call i32 @AsBits(float* %x.addr)
store i32 %call, i32* %store_, align 4
store float %x, ptr %x.addr, align 4
%call = call i32 @AsBits(ptr %x.addr)
store i32 %call, ptr %this, align 4
ret void
}

declare {}* @llvm.invariant.start.p0i8(i64, i8* nocapture) #2
declare ptr @llvm.invariant.start.p0(i64, ptr nocapture) #2

; Function Attrs: nounwind uwtable
define dso_local void @LoadIt(%struct.A* %c) #0 {
define dso_local void @LoadIt(ptr %c) #0 {
entry:
%0 = bitcast %struct.A* %c to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %0, i8* align 4 bitcast (%struct.A* @kA to i8*), i64 4, i1 false)
call void @llvm.memcpy.p0.p0.i64(ptr align 4 %c, ptr align 4 @kA, i64 4, i1 false)
ret void
}

; Function Attrs: argmemonly nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #2
declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1) #2

; Function Attrs: uwtable
define internal void @_GLOBAL__sub_I_const_static.cc() #1 section ".text.startup" {
Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/store-struct-element.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,20 @@
@A = local_unnamed_addr global %class.Class undef, align 4
@B = local_unnamed_addr global %class.Class undef, align 4

@llvm.global_ctors = appending global [2 x { i32, void ()*, i8* }] [
{ i32, void ()*, i8* } { i32 65535, void ()* @initA, i8* null },
{ i32, void ()*, i8* } { i32 65535, void ()* @initB, i8* null }
@llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [
{ i32, ptr, ptr } { i32 65535, ptr @initA, ptr null },
{ i32, ptr, ptr } { i32 65535, ptr @initB, ptr null }
]

define internal void @initA() section "__TEXT,__StaticInit,regular,pure_instructions" {
entry:
store i32 -1, i32* bitcast (%class.Class* @A to i32*), align 4
store i32 -1, ptr @A, align 4
ret void
}

define internal void @initB() section "__TEXT,__StaticInit,regular,pure_instructions" {
entry:
store i8 -1, i8* bitcast (%class.Class* @B to i8*), align 4
store i8 -1, ptr @B, align 4
ret void
}

Expand Down
10 changes: 5 additions & 5 deletions llvm/test/Transforms/GlobalOpt/stored-once-different-type.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,31 +10,31 @@ define void @store() {
; CHECK-LABEL: @store(
; CHECK-NEXT: ret void
;
store i32 42, i32* bitcast ([4 x i8]* @g to i32*)
store i32 42, ptr @g
ret void
}

define i32 @load1() {
; CHECK-LABEL: @load1(
; CHECK-NEXT: ret i32 42
;
%v = load i32, i32* bitcast ([4 x i8]* @g to i32*)
%v = load i32, ptr @g
ret i32 %v
}

define i16 @load2() {
; CHECK-LABEL: @load2(
; CHECK-NEXT: ret i16 42
;
%v = load i16, i16* bitcast ([4 x i8]* @g to i16*)
%v = load i16, ptr @g
ret i16 %v
}

define [4 x i8] @load3() {
; CHECK-LABEL: @load3(
; CHECK-NEXT: [[V:%.*]] = load [4 x i8], [4 x i8]* bitcast (i32* @g to [4 x i8]*), align 1
; CHECK-NEXT: [[V:%.*]] = load [4 x i8], ptr @g, align 1
; CHECK-NEXT: ret [4 x i8] [[V]]
;
%v = load [4 x i8], [4 x i8]* @g
%v = load [4 x i8], ptr @g
ret [4 x i8] %v
}
5 changes: 2 additions & 3 deletions llvm/test/Transforms/GlobalOpt/stored-once-through-gep.ll
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ define void @store() {
; CHECK-LABEL: @store(
; CHECK-NEXT: ret void
;
%addr = getelementptr inbounds %s, %s* bitcast (i32* @g to %s*), i64 0, i32 0
store i32 1, i32* %addr, align 4
store i32 1, ptr @g, align 4
ret void
}

Expand All @@ -25,6 +24,6 @@ define i32 @load() {
; CHECK-NEXT: ret i32 1
;
call fastcc void @store()
%v = load i32, i32* @g
%v = load i32, ptr @g
ret i32 %v
}
20 changes: 9 additions & 11 deletions llvm/test/Transforms/GlobalOpt/stored-once-value-type.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,22 @@
; RUN: opt -passes=globalopt < %s -S | FileCheck %s

; Check that we don't try to set a global initializer to a value of a different type.
; In this case, we were trying to set @0's initializer to be i32* null.
; In this case, we were trying to set @0's initializer to be ptr null.

%T = type { i32* }
%T = type { ptr }

@0 = internal global %T* null
@0 = internal global ptr null

define void @a() {
; CHECK-LABEL: @a(
; CHECK-NEXT: ret void
;
%1 = tail call i8* @_Znwm(i64 8)
%2 = bitcast i8* %1 to %T*
%3 = getelementptr inbounds %T, %T* %2, i64 0, i32 0
store i32* null, i32** %3, align 8
store i8* %1, i8** bitcast (%T** @0 to i8**), align 8
%4 = load i64*, i64** bitcast (%T** @0 to i64**), align 8
%5 = load atomic i64, i64* %4 acquire, align 8
%1 = tail call ptr @_Znwm(i64 8)
store ptr null, ptr %1, align 8
store ptr %1, ptr @0, align 8
%2 = load ptr, ptr @0, align 8
%3 = load atomic i64, ptr %2 acquire, align 8
ret void
}

declare i8* @_Znwm(i64)
declare ptr @_Znwm(i64)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
; RUN: opt < %s -passes=globalopt -S | FileCheck %s
; CHECK: global

@G = internal global void ()* null ; <void ()**> [#uses=2]
@G = internal global ptr null ; <ptr> [#uses=2]

define internal void @Actual() {
; CHECK-LABEL: Actual(
Expand All @@ -10,17 +10,17 @@ define internal void @Actual() {

define void @init() {
; CHECK-LABEL: init(
; CHECK: store void ()* @Actual, void ()** @G
store void ()* @Actual, void ()** @G
; CHECK: store ptr @Actual, ptr @G
store ptr @Actual, ptr @G
ret void
}

define void @doit() #0 {
; CHECK-LABEL: doit(
%FP = load void ()*, void ()** @G ; <void ()*> [#uses=2]
; CHECK: %FP = load void ()*, void ()** @G
%CC = icmp eq void ()* %FP, null ; <i1> [#uses=1]
; CHECK: %CC = icmp eq void ()* %FP, null
%FP = load ptr, ptr @G ; <ptr> [#uses=2]
; CHECK: %FP = load ptr, ptr @G
%CC = icmp eq ptr %FP, null ; <i1> [#uses=1]
; CHECK: %CC = icmp eq ptr %FP, null
br i1 %CC, label %isNull, label %DoCall
; CHECK: br i1 %CC, label %isNull, label %DoCall

Expand Down
Loading