| 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 |