1; RUN: opt < %s -passes=globalopt -S | FileCheck %s 2; CHECK-NOT: CTOR 3%ini = type { i32, ptr, ptr } 4@llvm.global_ctors = appending global [16 x %ini] [ 5 %ini { i32 65534, ptr @CTOR1, ptr null }, 6 %ini { i32 65535, ptr @CTOR1, ptr null }, 7 %ini { i32 65535, ptr @CTOR1, ptr null }, 8 %ini { i32 65535, ptr @CTOR2, ptr null }, 9 %ini { i32 65535, ptr @CTOR3, ptr null }, 10 %ini { i32 65535, ptr @CTOR4, ptr null }, 11 %ini { i32 65535, ptr @CTOR5, ptr null }, 12 %ini { i32 65535, ptr @CTOR6, ptr null }, 13 %ini { i32 65535, ptr @CTOR7, ptr null }, 14 %ini { i32 65535, ptr @CTOR8, ptr null }, 15 %ini { i32 65535, ptr @CTOR9, ptr null }, 16 %ini { i32 65535, ptr @CTOR14,ptr null }, 17 %ini { i32 65536, ptr @CTOR10_EXTERNAL, ptr null }, 18 %ini { i32 65536, ptr @CTOR11, ptr null }, 19 %ini { i32 65537, ptr @CTOR12, ptr null }, 20 %ini { i32 2147483647, ptr null, ptr null } 21] 22 23@G = global i32 0 ; <ptr> [#uses=1] 24@G2 = global i32 0 ; <ptr> [#uses=1] 25@G3 = global i32 -123 ; <ptr> [#uses=2] 26@X = global { i32, [2 x i32] } { i32 0, [2 x i32] [ i32 17, i32 21 ] } ; <ptr> [#uses=2] 27@Y = global i32 -1 ; <ptr> [#uses=2] 28@Z = global i32 123 ; <ptr> [#uses=1] 29@D = global double 0.000000e+00 ; <ptr> [#uses=1] 30@CTORGV = internal global i1 false ; <ptr> [#uses=2] 31@GA = global i32 0 ; <ptr> [#uses=1] 32@GA14 = global i32 0 ; <ptr> [#uses=1] 33 34define internal void @CTOR1() { 35 ret void 36} 37 38define internal void @CTOR2() { 39 %A = add i32 1, 23 ; <i32> [#uses=1] 40 store i32 %A, ptr @G 41 store i1 true, ptr @CTORGV 42 ret void 43} 44 45define internal void @CTOR3() { 46 %X = or i1 true, false ; <i1> [#uses=1] 47 br label %Cont 48 49Cont: ; preds = %0 50 br i1 %X, label %S, label %T 51 52S: ; preds = %Cont 53 store i32 24, ptr @G2 54 ret void 55 56T: ; preds = %Cont 57 ret void 58} 59 60define internal void @CTOR4() { 61 %X = load i32, ptr @G3 ; <i32> [#uses=1] 62 %Y = add i32 %X, 123 ; <i32> [#uses=1] 63 store i32 %Y, ptr @G3 64 ret void 65} 66 67define internal void @CTOR5() { 68 %X.2p = getelementptr inbounds { i32, [2 x i32] }, ptr @X, i32 0, i32 1, i32 0 ; <ptr> [#uses=2] 69 %X.2 = load i32, ptr %X.2p ; <i32> [#uses=1] 70 %X.1p = getelementptr inbounds { i32, [2 x i32] }, ptr @X, i32 0, i32 0 ; <ptr> [#uses=1] 71 store i32 %X.2, ptr %X.1p 72 store i32 42, ptr %X.2p 73 ret void 74} 75 76define internal void @CTOR6() { 77 %A = alloca i32 ; <ptr> [#uses=2] 78 %y = load i32, ptr @Y ; <i32> [#uses=1] 79 store i32 %y, ptr %A 80 %Av = load i32, ptr %A ; <i32> [#uses=1] 81 %Av1 = add i32 %Av, 1 ; <i32> [#uses=1] 82 store i32 %Av1, ptr @Y 83 ret void 84} 85 86define internal void @CTOR7() { 87 call void @setto( ptr @Z, i32 0 ) 88 ret void 89} 90 91define void @setto(ptr %P, i32 %V) { 92 store i32 %V, ptr %P 93 ret void 94} 95 96declare double @cos(double) 97 98define internal void @CTOR8() { 99 %X = call double @cos( double 0.000000e+00 ) ; <double> [#uses=1] 100 store double %X, ptr @D 101 ret void 102} 103 104define i1 @accessor() { 105 %V = load i1, ptr @CTORGV ; <i1> [#uses=1] 106 ret i1 %V 107} 108 109%struct.A = type { i32 } 110%struct.B = type { ptr, ptr, [4 x i8] } 111@GV1 = global %struct.B zeroinitializer, align 8 112@GV2 = constant [3 x ptr] [ptr inttoptr (i64 16 to ptr), ptr null, ptr null] 113; CHECK-NOT: CTOR9 114define internal void @CTOR9() { 115entry: 116 %0 = getelementptr inbounds i8, ptr @GV1, i64 16 117 store ptr getelementptr inbounds ([3 x ptr], ptr @GV2, i64 1, i64 0), ptr @GV1 118 ret void 119} 120 121; CHECK: CTOR10_EXTERNAL 122declare external void @CTOR10_EXTERNAL(); 123 124; CHECK-NOT: CTOR11 125define internal void @CTOR11() { 126 ret void 127} 128 129; CHECK: CTOR12 130define internal void @CTOR12() { 131 ret void 132} 133 134; CHECK-NOT: CTOR13 135define internal void @CTOR13() { 136 store atomic i32 123, ptr @GA seq_cst, align 4 137 ret void 138} 139 140; CHECK-NOT: CTOR14 141define internal void @CTOR14() { 142 %X = load atomic i32, ptr @GA14 seq_cst, align 4 143 %Y = add i32 %X, 124 144 store i32 %Y, ptr @GA14 145 ret void 146} 147 148