aboutsummaryrefslogtreecommitdiffstats
path: root/test/Transforms/GlobalOpt/ctor-list-opt.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms/GlobalOpt/ctor-list-opt.ll')
-rw-r--r--test/Transforms/GlobalOpt/ctor-list-opt.ll97
1 files changed, 97 insertions, 0 deletions
diff --git a/test/Transforms/GlobalOpt/ctor-list-opt.ll b/test/Transforms/GlobalOpt/ctor-list-opt.ll
new file mode 100644
index 0000000..6270f4f
--- /dev/null
+++ b/test/Transforms/GlobalOpt/ctor-list-opt.ll
@@ -0,0 +1,97 @@
+; RUN: llvm-upgrade < %s | llvm-as | opt -globalopt | llvm-dis | not grep CTOR
+
+%llvm.global_ctors = appending global [10 x { int, void ()* }] [
+ { int, void ()* } { int 65535, void ()* %CTOR1 },
+ { int, void ()* } { int 65535, void ()* %CTOR1 },
+ { int, void ()* } { int 65535, void ()* %CTOR2 },
+ { int, void ()* } { int 65535, void ()* %CTOR3 },
+ { int, void ()* } { int 65535, void ()* %CTOR4 },
+ { int, void ()* } { int 65535, void ()* %CTOR5 },
+ { int, void ()* } { int 65535, void ()* %CTOR6 },
+ { int, void ()* } { int 65535, void ()* %CTOR7 },
+ { int, void ()* } { int 65535, void ()* %CTOR8 },
+ { int, void ()* } { int 2147483647, void ()* null }
+]
+
+%G = global int 0
+%G2 = global int 0
+%G3 = global int -123
+%X = global {int, [2 x int]} { int 0, [2 x int] [ int 17, int 21] }
+%Y = global int -1
+%Z = global int 123
+%D = global double 0.0
+
+%CTORGV = internal global bool false ;; Should become constant after eval
+
+implementation
+
+internal void %CTOR1() { ;; noop ctor, remove.
+ ret void
+}
+
+internal void %CTOR2() { ;; evaluate the store
+ %A = add int 1, 23
+ store int %A, int* %G
+ store bool true, bool* %CTORGV
+ ret void
+}
+
+internal void %CTOR3() {
+ %X = or bool true, false
+ br label %Cont
+Cont:
+ br bool %X, label %S, label %T
+S:
+ store int 24, int* %G2
+ ret void
+T:
+ ret void
+}
+
+internal void %CTOR4() {
+ %X = load int* %G3
+ %Y = add int %X, 123
+ store int %Y, int* %G3
+ ret void
+}
+
+internal void %CTOR5() {
+ %X.2p = getelementptr {int,[2 x int]}* %X, int 0, uint 1, int 0
+ %X.2 = load int* %X.2p
+ %X.1p = getelementptr {int,[2 x int]}* %X, int 0, uint 0
+ store int %X.2, int* %X.1p
+ store int 42, int* %X.2p
+ ret void
+}
+
+internal void %CTOR6() {
+ %A = alloca int
+ %y = load int* %Y
+ store int %y, int* %A
+ %Av = load int* %A
+ %Av1 = add int %Av, 1
+ store int %Av1, int* %Y
+ ret void
+}
+
+internal void %CTOR7() {
+ call void %setto(int* %Z, int 0)
+ ret void
+}
+
+void %setto(int* %P, int %V) {
+ store int %V, int* %P
+ ret void
+}
+
+declare double %cos(double)
+
+internal void %CTOR8() {
+ %X = call double %cos(double 1.0)
+ store double %X, double* %D
+ ret void
+}
+bool %accessor() {
+ %V = load bool* %CTORGV ;; constant true
+ ret bool %V
+}