lifetime.ll 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. ; RUN: opt -scalarrepl -S < %s | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
  3. target triple = "x86_64-unknown-linux-gnu"
  4. declare void @llvm.lifetime.start(i64, i8*)
  5. declare void @llvm.lifetime.end(i64, i8*)
  6. %t1 = type {i32, i32, i32}
  7. define void @test1() {
  8. ; CHECK-LABEL: @test1(
  9. %A = alloca %t1
  10. %A1 = getelementptr %t1, %t1* %A, i32 0, i32 0
  11. %A2 = getelementptr %t1, %t1* %A, i32 0, i32 1
  12. %A3 = getelementptr %t1, %t1* %A, i32 0, i32 2
  13. %B = bitcast i32* %A1 to i8*
  14. store i32 0, i32* %A1
  15. call void @llvm.lifetime.start(i64 -1, i8* %B)
  16. ret void
  17. ; CHECK-NEXT: ret void
  18. }
  19. define void @test2() {
  20. ; CHECK-LABEL: @test2(
  21. %A = alloca %t1
  22. %A1 = getelementptr %t1, %t1* %A, i32 0, i32 0
  23. %A2 = getelementptr %t1, %t1* %A, i32 0, i32 1
  24. %A3 = getelementptr %t1, %t1* %A, i32 0, i32 2
  25. %B = bitcast i32* %A2 to i8*
  26. store i32 0, i32* %A2
  27. call void @llvm.lifetime.start(i64 -1, i8* %B)
  28. %C = load i32, i32* %A2
  29. ret void
  30. ; CHECK: ret void
  31. }
  32. define void @test3() {
  33. ; CHECK-LABEL: @test3(
  34. %A = alloca %t1
  35. %A1 = getelementptr %t1, %t1* %A, i32 0, i32 0
  36. %A2 = getelementptr %t1, %t1* %A, i32 0, i32 1
  37. %A3 = getelementptr %t1, %t1* %A, i32 0, i32 2
  38. %B = bitcast i32* %A2 to i8*
  39. store i32 0, i32* %A2
  40. call void @llvm.lifetime.start(i64 6, i8* %B)
  41. %C = load i32, i32* %A2
  42. ret void
  43. ; CHECK-NEXT: ret void
  44. }
  45. define void @test4() {
  46. ; CHECK-LABEL: @test4(
  47. %A = alloca %t1
  48. %A1 = getelementptr %t1, %t1* %A, i32 0, i32 0
  49. %A2 = getelementptr %t1, %t1* %A, i32 0, i32 1
  50. %A3 = getelementptr %t1, %t1* %A, i32 0, i32 2
  51. %B = bitcast i32* %A2 to i8*
  52. store i32 0, i32* %A2
  53. call void @llvm.lifetime.start(i64 1, i8* %B)
  54. %C = load i32, i32* %A2
  55. ret void
  56. ; CHECK-NEXT: ret void
  57. }
  58. %t2 = type {i32, [4 x i8], i32}
  59. define void @test5() {
  60. ; CHECK-LABEL: @test5(
  61. %A = alloca %t2
  62. ; CHECK: alloca{{.*}}i8
  63. ; CHECK: alloca{{.*}}i8
  64. ; CHECK: alloca{{.*}}i8
  65. %A21 = getelementptr %t2, %t2* %A, i32 0, i32 1, i32 0
  66. %A22 = getelementptr %t2, %t2* %A, i32 0, i32 1, i32 1
  67. %A23 = getelementptr %t2, %t2* %A, i32 0, i32 1, i32 2
  68. %A24 = getelementptr %t2, %t2* %A, i32 0, i32 1, i32 3
  69. ; CHECK-NOT: store i8 1
  70. store i8 1, i8* %A21
  71. store i8 2, i8* %A22
  72. store i8 3, i8* %A23
  73. store i8 4, i8* %A24
  74. %A1 = getelementptr %t2, %t2* %A, i32 0, i32 0
  75. %A2 = getelementptr %t2, %t2* %A, i32 0, i32 1, i32 1
  76. %A3 = getelementptr %t2, %t2* %A, i32 0, i32 2
  77. store i8 0, i8* %A2
  78. call void @llvm.lifetime.start(i64 5, i8* %A2)
  79. ; CHECK: llvm.lifetime{{.*}}i64 1
  80. ; CHECK: llvm.lifetime{{.*}}i64 1
  81. ; CHECK: llvm.lifetime{{.*}}i64 1
  82. %C = load i8, i8* %A2
  83. ret void
  84. }
  85. %t3 = type {[4 x i16], [4 x i8]}
  86. define void @test6() {
  87. ; CHECK-LABEL: @test6(
  88. %A = alloca %t3
  89. ; CHECK: alloca i8
  90. ; CHECK: alloca i8
  91. ; CHECK: alloca i8
  92. %A11 = getelementptr %t3, %t3* %A, i32 0, i32 0, i32 0
  93. %A12 = getelementptr %t3, %t3* %A, i32 0, i32 0, i32 1
  94. %A13 = getelementptr %t3, %t3* %A, i32 0, i32 0, i32 2
  95. %A14 = getelementptr %t3, %t3* %A, i32 0, i32 0, i32 3
  96. store i16 11, i16* %A11
  97. store i16 12, i16* %A12
  98. store i16 13, i16* %A13
  99. store i16 14, i16* %A14
  100. ; CHECK-NOT: store i16 11
  101. ; CHECK-NOT: store i16 12
  102. ; CHECK-NOT: store i16 13
  103. ; CHECK-NOT: store i16 14
  104. %A21 = getelementptr %t3, %t3* %A, i32 0, i32 1, i32 0
  105. %A22 = getelementptr %t3, %t3* %A, i32 0, i32 1, i32 1
  106. %A23 = getelementptr %t3, %t3* %A, i32 0, i32 1, i32 2
  107. %A24 = getelementptr %t3, %t3* %A, i32 0, i32 1, i32 3
  108. store i8 21, i8* %A21
  109. store i8 22, i8* %A22
  110. store i8 23, i8* %A23
  111. store i8 24, i8* %A24
  112. ; CHECK: store i8 21
  113. ; CHECK: store i8 22
  114. ; CHECK: store i8 23
  115. ; CHECK-NOT: store i8 24
  116. %B = bitcast i16* %A13 to i8*
  117. call void @llvm.lifetime.start(i64 7, i8* %B)
  118. ; CHECK: lifetime.start{{.*}}i64 1
  119. ; CHECK: lifetime.start{{.*}}i64 1
  120. ; CHECK: lifetime.start{{.*}}i64 1
  121. ret void
  122. }