2008-07-17-addrspace.ll 1.2 KB

12345678910111213141516171819202122232425262728
  1. ; This test lets globalopt split the global struct and array into different
  2. ; values. This used to crash, because globalopt forgot to put the new var in the
  3. ; same address space as the old one.
  4. ; RUN: opt < %s -globalopt -S > %t
  5. ; Check that the new global values still have their address space
  6. ; RUN: cat %t | grep 'addrspace.*global'
  7. @struct = internal addrspace(1) global { i32, i32 } zeroinitializer
  8. @array = internal addrspace(1) global [ 2 x i32 ] zeroinitializer
  9. define i32 @foo() {
  10. %A = load i32, i32 addrspace(1) * getelementptr ({ i32, i32 }, { i32, i32 } addrspace(1) * @struct, i32 0, i32 0)
  11. %B = load i32, i32 addrspace(1) * getelementptr ([ 2 x i32 ], [ 2 x i32 ] addrspace(1) * @array, i32 0, i32 0)
  12. ; Use the loaded values, so they won't get removed completely
  13. %R = add i32 %A, %B
  14. ret i32 %R
  15. }
  16. ; We put stores in a different function, so that the global variables won't get
  17. ; optimized away completely.
  18. define void @bar(i32 %R) {
  19. store i32 %R, i32 addrspace(1) * getelementptr ([ 2 x i32 ], [ 2 x i32 ] addrspace(1) * @array, i32 0, i32 0)
  20. store i32 %R, i32 addrspace(1) * getelementptr ({ i32, i32 }, { i32, i32 } addrspace(1) * @struct, i32 0, i32 0)
  21. ret void
  22. }