1999aa6bfSNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals 20676acb6SBjorn Pettersson; RUN: opt -S -passes=globalopt < %s | FileCheck %s 3999aa6bfSNikita Popov 4f65c88c4SNikita Popovtarget datalayout = "p1:32:32" 5f65c88c4SNikita Popov 6*a722e236SNikita Popov@llvm.global_ctors = appending global [11 x { i32, ptr, ptr }] [ 7999aa6bfSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor0, ptr null }, 8999aa6bfSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor1, ptr null }, 9999aa6bfSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor2, ptr null }, 10999aa6bfSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null }, 11999aa6bfSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null }, 12771c46adSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor5, ptr null }, 13771c46adSNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor6, ptr null }, 14f65c88c4SNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null }, 15*a722e236SNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor8, ptr null }, 16*a722e236SNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor9, ptr null }, 17*a722e236SNikita Popov { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null } 18999aa6bfSNikita Popov] 19999aa6bfSNikita Popov 20*a722e236SNikita Popov 21*a722e236SNikita Popov; memset of all-zero global 22*a722e236SNikita Popov@g0 = global { i32, i32 } zeroinitializer 23999aa6bfSNikita Popov;. 24*a722e236SNikita Popov; CHECK: @[[LLVM_GLOBAL_CTORS:[a-zA-Z0-9_$"\\.-]+]] = appending global [4 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @ctor3, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor4, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor7, ptr null }, { i32, ptr, ptr } { i32 65535, ptr @ctor10, ptr null }] 25999aa6bfSNikita Popov; CHECK: @[[G0:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } zeroinitializer 26999aa6bfSNikita Popov; CHECK: @[[G1:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 0, i32 0, i32 1 } 27999aa6bfSNikita Popov; CHECK: @[[G2:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32, i32 } { i32 1, i32 0, i32 0 } 28999aa6bfSNikita Popov; CHECK: @[[G3:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 1 } 29999aa6bfSNikita Popov; CHECK: @[[G4:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 0, i32 undef } 30999aa6bfSNikita Popov; CHECK: @[[G5:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i16, i32 } { i16 0, i32 1 } 31771c46adSNikita Popov; CHECK: @[[G6:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 -1 } 32771c46adSNikita Popov; CHECK: @[[G7:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { i32, i32 } { i32 -1, i32 1 } 33f65c88c4SNikita Popov; CHECK: @[[G8:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr addrspace(1) global { i32, i32 } zeroinitializer 34*a722e236SNikita Popov; CHECK: @[[G9:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global [100000000 x i32] zeroinitializer 35*a722e236SNikita Popov; CHECK: @[[G10:[a-zA-Z0-9_$"\\.-]+]] = local_unnamed_addr global { [99999999 x i32], i32 } { [99999999 x i32] zeroinitializer, i32 1 } 36999aa6bfSNikita Popov;. 37999aa6bfSNikita Popovdefine internal void @ctor0() { 38999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr @g0, i8 0, i64 8, i1 false) 39999aa6bfSNikita Popov ret void 40999aa6bfSNikita Popov} 41999aa6bfSNikita Popov 42999aa6bfSNikita Popov; memset of zero prefix 43999aa6bfSNikita Popov@g1 = global { i32, i32, i32 } { i32 0, i32 0, i32 1 } 44999aa6bfSNikita Popov 45999aa6bfSNikita Popovdefine internal void @ctor1() { 46999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr @g1, i8 0, i64 8, i1 false) 47999aa6bfSNikita Popov ret void 48999aa6bfSNikita Popov} 49999aa6bfSNikita Popov 50999aa6bfSNikita Popov; memset of zero suffix 51999aa6bfSNikita Popov@g2 = global { i32, i32, i32 } { i32 1, i32 0, i32 0 } 52999aa6bfSNikita Popov 53999aa6bfSNikita Popovdefine internal void @ctor2() { 54999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr getelementptr (i32, ptr @g2, i64 1), i8 0, i64 8, i1 false) 55999aa6bfSNikita Popov ret void 56999aa6bfSNikita Popov} 57999aa6bfSNikita Popov 58999aa6bfSNikita Popov; memset of some non-zero bytes 59999aa6bfSNikita Popov@g3 = global { i32, i32 } { i32 0, i32 1 } 60999aa6bfSNikita Popov 61999aa6bfSNikita Popovdefine internal void @ctor3() { 62f65c88c4SNikita Popov; CHECK-LABEL: @ctor3( 63f65c88c4SNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false) 64f65c88c4SNikita Popov; CHECK-NEXT: ret void 65f65c88c4SNikita Popov; 66999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr @g3, i8 0, i64 8, i1 false) 67999aa6bfSNikita Popov ret void 68999aa6bfSNikita Popov} 69999aa6bfSNikita Popov 70999aa6bfSNikita Popov; memset of some undef bytes 71999aa6bfSNikita Popov@g4 = global { i32, i32 } { i32 0, i32 undef } 72999aa6bfSNikita Popov 73999aa6bfSNikita Popovdefine internal void @ctor4() { 74f65c88c4SNikita Popov; CHECK-LABEL: @ctor4( 75f65c88c4SNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false) 76f65c88c4SNikita Popov; CHECK-NEXT: ret void 77f65c88c4SNikita Popov; 78999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr @g4, i8 0, i64 8, i1 false) 79999aa6bfSNikita Popov ret void 80999aa6bfSNikita Popov} 81999aa6bfSNikita Popov 82999aa6bfSNikita Popov; memset including padding bytes 83f65c88c4SNikita Popov; FIXME: We still incorrectly optimize the memset away here, even though code 84f65c88c4SNikita Popov; might access the padding. 85999aa6bfSNikita Popov@g5 = global { i16, i32 } { i16 0, i32 1 } 86999aa6bfSNikita Popov 87999aa6bfSNikita Popovdefine internal void @ctor5() { 88999aa6bfSNikita Popov call void @llvm.memset.p0.i64(ptr @g5, i8 0, i64 4, i1 false) 89999aa6bfSNikita Popov ret void 90999aa6bfSNikita Popov} 91999aa6bfSNikita Popov 92771c46adSNikita Popov; memset of non-zero value (matching initializer) 93771c46adSNikita Popov@g6 = global { i32, i32 } { i32 -1, i32 -1 } 94771c46adSNikita Popov 95771c46adSNikita Popovdefine internal void @ctor6() { 96771c46adSNikita Popov call void @llvm.memset.p0.i64(ptr @g6, i8 -1, i64 8, i1 false) 97771c46adSNikita Popov ret void 98771c46adSNikita Popov} 99771c46adSNikita Popov 100771c46adSNikita Popov; memset of non-zero value (not matching initializer) 101771c46adSNikita Popov@g7 = global { i32, i32 } { i32 -1, i32 1 } 102771c46adSNikita Popov 103771c46adSNikita Popovdefine internal void @ctor7() { 104771c46adSNikita Popov; CHECK-LABEL: @ctor7( 105771c46adSNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false) 106771c46adSNikita Popov; CHECK-NEXT: ret void 107771c46adSNikita Popov; 108771c46adSNikita Popov call void @llvm.memset.p0.i64(ptr @g7, i8 -1, i64 8, i1 false) 109771c46adSNikita Popov ret void 110771c46adSNikita Popov} 111771c46adSNikita Popov 112f65c88c4SNikita Popov; memset of zero value in differently-sized address space 113f65c88c4SNikita Popov@g8 = addrspace(1) global { i32, i32 } zeroinitializer 114f65c88c4SNikita Popov 115f65c88c4SNikita Popovdefine internal void @ctor8() { 116f65c88c4SNikita Popov call void @llvm.memset.p0.i64(ptr addrspacecast (ptr addrspace(1) @g8 to ptr), i8 0, i64 8, i1 false) 117f65c88c4SNikita Popov ret void 118f65c88c4SNikita Popov} 119f65c88c4SNikita Popov 120*a722e236SNikita Popov@g9 = global [100000000 x i32] zeroinitializer 121*a722e236SNikita Popov 122*a722e236SNikita Popovdefine internal void @ctor9() { 123*a722e236SNikita Popov call void @llvm.memset.p0.i64(ptr @g9, i8 0, i64 100000000, i1 false) 124*a722e236SNikita Popov ret void 125*a722e236SNikita Popov} 126*a722e236SNikita Popov 127*a722e236SNikita Popov@g10 = global { [99999999 x i32], i32 } { [99999999 x i32 ] zeroinitializer, i32 1 } 128*a722e236SNikita Popov 129*a722e236SNikita Popovdefine internal void @ctor10() { 130*a722e236SNikita Popov; CHECK-LABEL: @ctor10( 131*a722e236SNikita Popov; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false) 132*a722e236SNikita Popov; CHECK-NEXT: ret void 133*a722e236SNikita Popov; 134*a722e236SNikita Popov call void @llvm.memset.p0.i64(ptr @g10, i8 0, i64 100000000, i1 false) 135*a722e236SNikita Popov ret void 136*a722e236SNikita Popov} 137*a722e236SNikita Popov 138999aa6bfSNikita Popovdeclare void @llvm.memset.p0.i64(ptr, i8, i64, i1) 139771c46adSNikita Popov;. 140304f1d59SNikita Popov; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } 141771c46adSNikita Popov;. 142