union-pointer.ll 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. ; PR892
  2. ; RUN: opt < %s -scalarrepl -S | FileCheck %s
  3. target datalayout = "e-p:32:32-p1:16:16-n8:16:32"
  4. target triple = "i686-apple-darwin8.7.2"
  5. %struct.Val = type { i32*, i32 }
  6. define i8* @test(i16* %X) {
  7. ; CHECK-LABEL: @test(
  8. ; CHECK-NOT: alloca
  9. ; CHECK: ret i8*
  10. %X_addr = alloca i16* ; <i16**> [#uses=2]
  11. store i16* %X, i16** %X_addr
  12. %X_addr.upgrd.1 = bitcast i16** %X_addr to i8** ; <i8**> [#uses=1]
  13. %tmp = load i8*, i8** %X_addr.upgrd.1 ; <i8*> [#uses=1]
  14. ret i8* %tmp
  15. }
  16. define i8 addrspace(1)* @test_as1(i16 addrspace(1)* %x) {
  17. ; CHECK-LABEL: @test_as1(
  18. ; CHECK-NEXT: %1 = ptrtoint i16 addrspace(1)* %x to i16
  19. ; CHECK-NEXT: %2 = inttoptr i16 %1 to i8 addrspace(1)*
  20. ; CHECK-NEXT: ret i8 addrspace(1)* %2
  21. %x_addr = alloca i16 addrspace(1)*
  22. store i16 addrspace(1)* %x, i16 addrspace(1)** %x_addr
  23. %x_addr.upgrd.1 = bitcast i16 addrspace(1)** %x_addr to i8 addrspace(1)**
  24. %tmp = load i8 addrspace(1)*, i8 addrspace(1)** %x_addr.upgrd.1
  25. ret i8 addrspace(1)* %tmp
  26. }
  27. define i8 addrspace(1)* @test_as1_array(i16 addrspace(1)* %x) {
  28. ; CHECK-LABEL: @test_as1_array(
  29. ; CHECK-NEXT: %1 = ptrtoint i16 addrspace(1)* %x to i16
  30. ; CHECK-NEXT: %2 = inttoptr i16 %1 to i8 addrspace(1)*
  31. ; CHECK-NEXT: ret i8 addrspace(1)* %2
  32. %as_ptr_array = alloca [4 x i16 addrspace(1)*]
  33. %elem1 = getelementptr [4 x i16 addrspace(1)*], [4 x i16 addrspace(1)*]* %as_ptr_array, i32 0, i32 1
  34. store i16 addrspace(1)* %x, i16 addrspace(1)** %elem1
  35. %elem1.cast = bitcast i16 addrspace(1)** %elem1 to i8 addrspace(1)**
  36. %tmp = load i8 addrspace(1)*, i8 addrspace(1)** %elem1.cast
  37. ret i8 addrspace(1)* %tmp
  38. }
  39. define void @test2(i64 %Op.0) {
  40. ; CHECK-LABEL: @test2(
  41. ; CHECK-NOT: alloca
  42. ; CHECK: ret void
  43. %tmp = alloca %struct.Val, align 8 ; <%struct.Val*> [#uses=3]
  44. %tmp1 = alloca %struct.Val, align 8 ; <%struct.Val*> [#uses=3]
  45. %tmp.upgrd.2 = call i64 @_Z3foov( ) ; <i64> [#uses=1]
  46. %tmp1.upgrd.3 = bitcast %struct.Val* %tmp1 to i64* ; <i64*> [#uses=1]
  47. store i64 %tmp.upgrd.2, i64* %tmp1.upgrd.3
  48. %tmp.upgrd.4 = getelementptr %struct.Val, %struct.Val* %tmp, i32 0, i32 0 ; <i32**> [#uses=1]
  49. %tmp2 = getelementptr %struct.Val, %struct.Val* %tmp1, i32 0, i32 0 ; <i32**> [#uses=1]
  50. %tmp.upgrd.5 = load i32*, i32** %tmp2 ; <i32*> [#uses=1]
  51. store i32* %tmp.upgrd.5, i32** %tmp.upgrd.4
  52. %tmp3 = getelementptr %struct.Val, %struct.Val* %tmp, i32 0, i32 1 ; <i32*> [#uses=1]
  53. %tmp4 = getelementptr %struct.Val, %struct.Val* %tmp1, i32 0, i32 1 ; <i32*> [#uses=1]
  54. %tmp.upgrd.6 = load i32, i32* %tmp4 ; <i32> [#uses=1]
  55. store i32 %tmp.upgrd.6, i32* %tmp3
  56. %tmp7 = bitcast %struct.Val* %tmp to { i64 }* ; <{ i64 }*> [#uses=1]
  57. %tmp8 = getelementptr { i64 }, { i64 }* %tmp7, i32 0, i32 0 ; <i64*> [#uses=1]
  58. %tmp9 = load i64, i64* %tmp8 ; <i64> [#uses=1]
  59. call void @_Z3bar3ValS_( i64 %Op.0, i64 %tmp9 )
  60. ret void
  61. }
  62. declare i64 @_Z3foov()
  63. declare void @_Z3bar3ValS_(i64, i64)