[AMDGPU] Add True16 register classes.
[llvm-project.git] / llvm / test / Transforms / GlobalOpt / stored-once-forward-value.ll
blob7b845070bbd0b3893c884d6f869d5123710b86dc
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
14 declare void @b()
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
22   call void @b()
23   %r = load i1, ptr @g1
24   ret i1 %r
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]]
34   store i32 %a, ptr @g2
35   call void @b()
36   %r = load i32, ptr @g2
37   ret i32 %r
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
48   call void @b()
49   %r = load ptr, ptr @g3
50   ret ptr %r
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
61   call void @b()
62   %r = load i32, ptr @g4
63   ret i32 %r
66 define i1 @no_dom(i1 %i) {
67 ; CHECK-LABEL: @no_dom(
68 ; CHECK-NEXT:    br i1 [[I:%.*]], label [[BB1:%.*]], label [[END:%.*]]
69 ; CHECK:       bb1:
70 ; CHECK-NEXT:    store i1 true, ptr @g5, align 1
71 ; CHECK-NEXT:    br label [[END]]
72 ; CHECK:       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
78 bb1:
79   store i1 true, ptr @g5
80   br label %end
81 end:
82   call void @b()
83   %r = load i1, ptr @g5
84   ret i1 %r
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
94   call void @b()
95   %r = load i1, ptr @g6
96   ret i1 %r
99 define i1 @other() {
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]]
105   call void @b()
106   %r = load i1, ptr @g6
107   ret i1 %r
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
118   call void @b()
119   %r = load volatile i1, ptr @g7
120   ret i1 %r
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
133   call void @b()
134   %r = load i1, ptr @g8
135   ret i1 %r