1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=globalopt -S < %s | FileCheck %s
4 @g1 = internal unnamed_addr global i32 0
5 @g2 = internal unnamed_addr global i32 0
6 @g3 = internal unnamed_addr global i32 0
7 @g4 = internal unnamed_addr global i32 0
8 @g5 = internal unnamed_addr global i32 0
9 @g6 = internal unnamed_addr global i32 0
10 @g7 = internal unnamed_addr global i32 0
11 @g8 = internal unnamed_addr global ptr null
12 @tl = internal thread_local unnamed_addr global i32 0
16 define i1 @dom_const() {
17 ; CHECK-LABEL: @dom_const(
18 ; CHECK-NEXT: call void @b()
19 ; CHECK-NEXT: ret i1 true
21 store i1 true, ptr @g1
27 define i32 @dom_arg(i32 %a) {
28 ; CHECK-LABEL: @dom_arg(
29 ; CHECK-NEXT: store i32 [[A:%.*]], ptr @g2, align 4
30 ; CHECK-NEXT: call void @b()
31 ; CHECK-NEXT: [[R:%.*]] = load i32, ptr @g2, align 4
32 ; CHECK-NEXT: ret i32 [[R]]
36 %r = load i32, ptr @g2
40 define ptr @dom_thread_local_global() {
41 ; CHECK-LABEL: @dom_thread_local_global(
42 ; CHECK-NEXT: store ptr @tl, ptr @g3, align 8
43 ; CHECK-NEXT: call void @b()
44 ; CHECK-NEXT: [[R:%.*]] = load ptr, ptr @g3, align 8
45 ; CHECK-NEXT: ret ptr [[R]]
47 store ptr @tl, ptr @g3
49 %r = load ptr, ptr @g3
53 define i32 @dom_different_types() {
54 ; CHECK-LABEL: @dom_different_types(
55 ; CHECK-NEXT: store i1 true, ptr @g4, align 1
56 ; CHECK-NEXT: call void @b()
57 ; CHECK-NEXT: [[R:%.*]] = load i32, ptr @g4, align 4
58 ; CHECK-NEXT: ret i32 [[R]]
60 store i1 true, ptr @g4
62 %r = load i32, ptr @g4
66 define i1 @no_dom(i1 %i) {
67 ; CHECK-LABEL: @no_dom(
68 ; CHECK-NEXT: br i1 [[I:%.*]], label [[BB1:%.*]], label [[END:%.*]]
70 ; CHECK-NEXT: store i1 true, ptr @g5, align 1
71 ; CHECK-NEXT: br label [[END]]
73 ; CHECK-NEXT: call void @b()
74 ; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g5, align 1
75 ; CHECK-NEXT: ret i1 [[R]]
77 br i1 %i, label %bb1, label %end
79 store i1 true, ptr @g5
87 define i1 @dom_multiple_function_loads() {
88 ; CHECK-LABEL: @dom_multiple_function_loads(
89 ; CHECK-NEXT: store i1 true, ptr @g6, align 1
90 ; CHECK-NEXT: call void @b()
91 ; CHECK-NEXT: ret i1 true
93 store i1 true, ptr @g6
100 ; CHECK-LABEL: @other(
101 ; CHECK-NEXT: call void @b()
102 ; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g6, align 1
103 ; CHECK-NEXT: ret i1 [[R]]
106 %r = load i1, ptr @g6
110 define i1 @dom_volatile() {
111 ; CHECK-LABEL: @dom_volatile(
112 ; CHECK-NEXT: store i1 true, ptr @g7, align 1
113 ; CHECK-NEXT: call void @b()
114 ; CHECK-NEXT: [[R:%.*]] = load volatile i1, ptr @g7, align 1
115 ; CHECK-NEXT: ret i1 [[R]]
117 store i1 true, ptr @g7
119 %r = load volatile i1, ptr @g7
123 define i1 @dom_store_const_and_initializer() {
124 ; CHECK-LABEL: @dom_store_const_and_initializer(
125 ; CHECK-NEXT: store i1 true, ptr @g8, align 1
126 ; CHECK-NEXT: store i1 false, ptr @g8, align 1
127 ; CHECK-NEXT: call void @b()
128 ; CHECK-NEXT: [[R:%.*]] = load i1, ptr @g8, align 1
129 ; CHECK-NEXT: ret i1 [[R]]
131 store i1 true, ptr @g8
132 store i1 false, ptr @g8
134 %r = load i1, ptr @g8