OLD | NEW |
1 ; RUN: opt -flatten-globals %s -S | FileCheck %s | 1 ; RUN: opt -flatten-globals %s -S | FileCheck %s |
2 ; RUN: opt -flatten-globals %s -S | FileCheck %s -check-prefix=CLEANED | 2 ; RUN: opt -flatten-globals %s -S | FileCheck %s -check-prefix=CLEANED |
3 | 3 |
4 target datalayout = "p:32:32:32" | 4 target datalayout = "p:32:32:32" |
5 | 5 |
6 | 6 |
7 ; Check simple cases | 7 ; Check simple cases |
8 | 8 |
9 @var_i32 = global i32 258 | 9 @var_i32 = global i32 258 |
10 ; CHECK: @var_i32 = global [4 x i8] c"\02\01\00\00" | 10 ; CHECK: @var_i32 = global [4 x i8] c"\02\01\00\00" |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 143 |
144 @block_addr = global i8* blockaddress(@func_with_block, %label) | 144 @block_addr = global i8* blockaddress(@func_with_block, %label) |
145 ; CHECK: @block_addr = global i32 ptrtoint (i8* blockaddress(@func_with_block, %
label) to i32) | 145 ; CHECK: @block_addr = global i32 ptrtoint (i8* blockaddress(@func_with_block, %
label) to i32) |
146 | 146 |
147 @vector_reloc = global <2 x i32*> <i32* @var1, i32* @var1> | 147 @vector_reloc = global <2 x i32*> <i32* @var1, i32* @var1> |
148 ; CHECK: global <{ i32, i32 }> <{ i32 ptrtoint ([4 x i8]* @var1 to i32), i32 ptr
toint ([4 x i8]* @var1 to i32) }> | 148 ; CHECK: global <{ i32, i32 }> <{ i32 ptrtoint ([4 x i8]* @var1 to i32), i32 ptr
toint ([4 x i8]* @var1 to i32) }> |
149 | 149 |
150 | 150 |
151 ; Global references with addends | 151 ; Global references with addends |
152 | 152 |
153 @reloc_addend = global i32* getelementptr (%ptrs1* @ptrs1, i32 0, i32 2) | 153 @reloc_addend = global i32* getelementptr (%ptrs1, %ptrs1* @ptrs1, i32 0, i32 2) |
154 ; CHECK: @reloc_addend = global i32 add (i32 ptrtoint (<{ i32, [8 x i8] }>* @ptr
s1 to i32), i32 8) | 154 ; CHECK: @reloc_addend = global i32 add (i32 ptrtoint (<{ i32, [8 x i8] }>* @ptr
s1 to i32), i32 8) |
155 | 155 |
156 @negative_addend = global %ptrs1* getelementptr (%ptrs1* @ptrs1, i32 -1) | 156 @negative_addend = global %ptrs1* getelementptr (%ptrs1, %ptrs1* @ptrs1, i32 -1) |
157 ; CHECK: @negative_addend = global i32 add (i32 ptrtoint (<{ i32, [8 x i8] }>* @
ptrs1 to i32), i32 -12) | 157 ; CHECK: @negative_addend = global i32 add (i32 ptrtoint (<{ i32, [8 x i8] }>* @
ptrs1 to i32), i32 -12) |
158 | 158 |
159 @const_ptr = global i32* getelementptr (%ptrs1* null, i32 0, i32 2) | 159 @const_ptr = global i32* getelementptr (%ptrs1, %ptrs1* null, i32 0, i32 2) |
160 ; CHECK: @const_ptr = global [4 x i8] c"\08\00\00\00" | 160 ; CHECK: @const_ptr = global [4 x i8] c"\08\00\00\00" |
161 | 161 |
162 @int_to_ptr = global i32* inttoptr (i16 260 to i32*) | 162 @int_to_ptr = global i32* inttoptr (i16 260 to i32*) |
163 ; CHECK: @int_to_ptr = global [4 x i8] c"\04\01\00\00" | 163 ; CHECK: @int_to_ptr = global [4 x i8] c"\04\01\00\00" |
164 | 164 |
165 ; Clang allows "(uintptr_t) &var" as a global initializer, so we | 165 ; Clang allows "(uintptr_t) &var" as a global initializer, so we |
166 ; handle this case. | 166 ; handle this case. |
167 @ptr_to_int = global i32 ptrtoint (i8* @var2 to i32) | 167 @ptr_to_int = global i32 ptrtoint (i8* @var2 to i32) |
168 ; CHECK: @ptr_to_int = global i32 ptrtoint ([1 x i8]* @var2 to i32) | 168 ; CHECK: @ptr_to_int = global i32 ptrtoint ([1 x i8]* @var2 to i32) |
169 | 169 |
170 ; This is handled via Constant folding. The getelementptr is | 170 ; This is handled via Constant folding. The getelementptr is |
171 ; converted to an undef when it is created, so the pass does not see a | 171 ; converted to an undef when it is created, so the pass does not see a |
172 ; getelementptr here. | 172 ; getelementptr here. |
173 @undef_gep = global i32* getelementptr (%ptrs1* undef, i32 0, i32 2) | 173 @undef_gep = global i32* getelementptr (%ptrs1, %ptrs1* undef, i32 0, i32 2) |
174 ; CHECK: @undef_gep = global [4 x i8] zeroinitializer | 174 ; CHECK: @undef_gep = global [4 x i8] zeroinitializer |
175 | 175 |
176 ; Adding an offset to a function address isn't useful, but check that | 176 ; Adding an offset to a function address isn't useful, but check that |
177 ; the pass handles it anyway. | 177 ; the pass handles it anyway. |
178 @func_addend = global i8* getelementptr ( | 178 @func_addend = global i8* getelementptr ( |
| 179 i8, |
179 i8* bitcast (void ()* @func_with_block to i8*), i32 123) | 180 i8* bitcast (void ()* @func_with_block to i8*), i32 123) |
180 ; CHECK: @func_addend = global i32 add (i32 ptrtoint (void ()* @func_with_block
to i32), i32 123) | 181 ; CHECK: @func_addend = global i32 add (i32 ptrtoint (void ()* @func_with_block
to i32), i32 123) |
181 | 182 |
182 ; Similarly, adding an offset to a label address isn't useful, but | 183 ; Similarly, adding an offset to a label address isn't useful, but |
183 ; check it anyway. | 184 ; check it anyway. |
184 @block_addend = global i8* getelementptr ( | 185 @block_addend = global i8* getelementptr ( |
| 186 i8, |
185 i8* blockaddress(@func_with_block, %label), i32 100) | 187 i8* blockaddress(@func_with_block, %label), i32 100) |
186 ; CHECK: @block_addend = global i32 add (i32 ptrtoint (i8* blockaddress(@func_wi
th_block, %label) to i32), i32 100) | 188 ; CHECK: @block_addend = global i32 add (i32 ptrtoint (i8* blockaddress(@func_wi
th_block, %label) to i32), i32 100) |
187 | 189 |
188 | 190 |
189 ; Special cases | 191 ; Special cases |
190 | 192 |
191 ; Leave vars with "appending" linkage alone. | 193 ; Leave vars with "appending" linkage alone. |
192 @appending = appending global [1 x i32*] [i32* @var1] | 194 @appending = appending global [1 x i32*] [i32* @var1] |
193 ; CHECK: @appending = appending global [1 x i32*] [i32* bitcast ([4 x i8]* @var1
to i32*)] | 195 ; CHECK: @appending = appending global [1 x i32*] [i32* bitcast ([4 x i8]* @var1
to i32*)] |
194 | 196 |
195 | 197 |
196 define i32* @get_address() { | 198 define i32* @get_address() { |
197 ret i32* @var_i32 | 199 ret i32* @var_i32 |
198 } | 200 } |
199 ; CHECK: define i32* @get_address() { | 201 ; CHECK: define i32* @get_address() { |
200 ; CHECK-NEXT: ret i32* bitcast ([4 x i8]* @var_i32 to i32*) | 202 ; CHECK-NEXT: ret i32* bitcast ([4 x i8]* @var_i32 to i32*) |
201 | 203 |
202 | 204 |
203 define void @func_with_block() { | 205 define void @func_with_block() { |
204 br label %label | 206 br label %label |
205 label: | 207 label: |
206 ret void | 208 ret void |
207 } | 209 } |
OLD | NEW |