malloc-free-delete.ll 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. ; PR1201
  3. define i32 @main(i32 %argc, i8** %argv) {
  4. ; CHECK-LABEL: @main(
  5. %c_19 = alloca i8*
  6. %malloc_206 = tail call i8* @malloc(i32 mul (i32 ptrtoint (i8* getelementptr (i8, i8* null, i32 1) to i32), i32 10))
  7. store i8* %malloc_206, i8** %c_19
  8. %tmp_207 = load i8*, i8** %c_19
  9. tail call void @free(i8* %tmp_207)
  10. ret i32 0
  11. ; CHECK-NEXT: ret i32 0
  12. }
  13. declare noalias i8* @calloc(i32, i32) nounwind
  14. declare noalias i8* @malloc(i32)
  15. declare void @free(i8*)
  16. define i1 @foo() {
  17. ; CHECK-LABEL: @foo(
  18. ; CHECK-NEXT: ret i1 false
  19. %m = call i8* @malloc(i32 1)
  20. %z = icmp eq i8* %m, null
  21. call void @free(i8* %m)
  22. ret i1 %z
  23. }
  24. declare void @llvm.lifetime.start(i64, i8*)
  25. declare void @llvm.lifetime.end(i64, i8*)
  26. declare i64 @llvm.objectsize.i64(i8*, i1)
  27. declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
  28. declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
  29. declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) nounwind
  30. define void @test3(i8* %src) {
  31. ; CHECK-LABEL: @test3(
  32. ; CHECK-NEXT: ret void
  33. %a = call noalias i8* @malloc(i32 10)
  34. call void @llvm.lifetime.start(i64 10, i8* %a)
  35. call void @llvm.lifetime.end(i64 10, i8* %a)
  36. %size = call i64 @llvm.objectsize.i64(i8* %a, i1 true)
  37. store i8 42, i8* %a
  38. call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a, i8* %src, i32 32, i32 1, i1 false)
  39. call void @llvm.memmove.p0i8.p0i8.i32(i8* %a, i8* %src, i32 32, i32 1, i1 false)
  40. call void @llvm.memset.p0i8.i32(i8* %a, i8 5, i32 32, i32 1, i1 false)
  41. %alloc2 = call noalias i8* @calloc(i32 5, i32 7) nounwind
  42. %z = icmp ne i8* %alloc2, null
  43. ret void
  44. }
  45. ;; This used to crash.
  46. define void @test4() {
  47. ; CHECK-LABEL: @test4(
  48. ; CHECK-NEXT: ret void
  49. %A = call i8* @malloc(i32 16000)
  50. %B = bitcast i8* %A to double*
  51. %C = bitcast double* %B to i8*
  52. call void @free(i8* %C)
  53. ret void
  54. }
  55. ; CHECK-LABEL: @test5(
  56. define void @test5(i8* %ptr, i8** %esc) {
  57. ; CHECK-NEXT: call i8* @malloc
  58. ; CHECK-NEXT: call i8* @malloc
  59. ; CHECK-NEXT: call i8* @malloc
  60. ; CHECK-NEXT: call i8* @malloc
  61. ; CHECK-NEXT: call i8* @malloc
  62. ; CHECK-NEXT: call i8* @malloc
  63. ; CHECK-NEXT: call i8* @malloc
  64. ; CHECK-NEXT: call void @llvm.memcpy
  65. ; CHECK-NEXT: call void @llvm.memmove
  66. ; CHECK-NEXT: store
  67. ; CHECK-NEXT: call void @llvm.memcpy
  68. ; CHECK-NEXT: call void @llvm.memmove
  69. ; CHECK-NEXT: call void @llvm.memset
  70. ; CHECK-NEXT: store volatile
  71. ; CHECK-NEXT: ret
  72. %a = call i8* @malloc(i32 700)
  73. %b = call i8* @malloc(i32 700)
  74. %c = call i8* @malloc(i32 700)
  75. %d = call i8* @malloc(i32 700)
  76. %e = call i8* @malloc(i32 700)
  77. %f = call i8* @malloc(i32 700)
  78. %g = call i8* @malloc(i32 700)
  79. call void @llvm.memcpy.p0i8.p0i8.i32(i8* %ptr, i8* %a, i32 32, i32 1, i1 false)
  80. call void @llvm.memmove.p0i8.p0i8.i32(i8* %ptr, i8* %b, i32 32, i32 1, i1 false)
  81. store i8* %c, i8** %esc
  82. call void @llvm.memcpy.p0i8.p0i8.i32(i8* %d, i8* %ptr, i32 32, i32 1, i1 true)
  83. call void @llvm.memmove.p0i8.p0i8.i32(i8* %e, i8* %ptr, i32 32, i32 1, i1 true)
  84. call void @llvm.memset.p0i8.i32(i8* %f, i8 5, i32 32, i32 1, i1 true)
  85. store volatile i8 4, i8* %g
  86. ret void
  87. }
  88. ;; When a basic block contains only a call to free and this block is accessed
  89. ;; through a test of the argument of free against null, move the call in the
  90. ;; predecessor block.
  91. ;; Using simplifycfg will remove the empty basic block and the branch operation
  92. ;; Then, performing a dead elimination will remove the comparison.
  93. ;; This is what happens with -O1 and upper.
  94. ; CHECK-LABEL: @test6(
  95. define void @test6(i8* %foo) minsize {
  96. ; CHECK: %tobool = icmp eq i8* %foo, null
  97. ;; Call to free moved
  98. ; CHECK-NEXT: tail call void @free(i8* %foo)
  99. ; CHECK-NEXT: br i1 %tobool, label %if.end, label %if.then
  100. ; CHECK: if.then:
  101. ;; Block is now empty and may be simplified by simplifycfg
  102. ; CHECK-NEXT: br label %if.end
  103. ; CHECK: if.end:
  104. ; CHECK-NEXT: ret void
  105. entry:
  106. %tobool = icmp eq i8* %foo, null
  107. br i1 %tobool, label %if.end, label %if.then
  108. if.then: ; preds = %entry
  109. tail call void @free(i8* %foo)
  110. br label %if.end
  111. if.end: ; preds = %entry, %if.then
  112. ret void
  113. }
  114. declare i8* @_ZnwmRKSt9nothrow_t(i64, i8*) nobuiltin
  115. declare void @_ZdlPvRKSt9nothrow_t(i8*, i8*) nobuiltin
  116. declare i32 @__gxx_personality_v0(...)
  117. declare void @_ZN1AC2Ev(i8* %this)
  118. ; CHECK-LABEL: @test7(
  119. define void @test7() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  120. entry:
  121. %nt = alloca i8
  122. ; CHECK-NOT: call {{.*}}@_ZnwmRKSt9nothrow_t(
  123. %call.i = tail call i8* @_ZnwmRKSt9nothrow_t(i64 1, i8* %nt) builtin nounwind
  124. invoke void @_ZN1AC2Ev(i8* undef)
  125. to label %.noexc.i unwind label %lpad.i
  126. .noexc.i: ; preds = %entry
  127. unreachable
  128. lpad.i: ; preds = %entry
  129. %0 = landingpad { i8*, i32 } cleanup
  130. ; CHECK-NOT: call {{.*}}@_ZdlPvRKSt9nothrow_t(
  131. call void @_ZdlPvRKSt9nothrow_t(i8* %call.i, i8* %nt) builtin nounwind
  132. resume { i8*, i32 } %0
  133. }
  134. declare i8* @_Znwm(i64) nobuiltin
  135. declare i8* @_Znwj(i32) nobuiltin
  136. declare i8* @_Znam(i64) nobuiltin
  137. declare i8* @_Znaj(i32) nobuiltin
  138. declare void @_ZdlPv(i8*) nobuiltin
  139. declare void @_ZdaPv(i8*) nobuiltin
  140. define linkonce void @_ZdlPvm(i8* %p, i64) nobuiltin {
  141. call void @_ZdlPv(i8* %p)
  142. ret void
  143. }
  144. define linkonce void @_ZdlPvj(i8* %p, i32) nobuiltin {
  145. call void @_ZdlPv(i8* %p)
  146. ret void
  147. }
  148. define linkonce void @_ZdaPvm(i8* %p, i64) nobuiltin {
  149. call void @_ZdaPv(i8* %p)
  150. ret void
  151. }
  152. define linkonce void @_ZdaPvj(i8* %p, i32) nobuiltin {
  153. call void @_ZdaPv(i8* %p)
  154. ret void
  155. }
  156. ; CHECK-LABEL: @test8(
  157. define void @test8() {
  158. ; CHECK-NOT: call
  159. %nw = call i8* @_Znwm(i64 32) builtin
  160. call void @_ZdlPv(i8* %nw) builtin
  161. %na = call i8* @_Znam(i64 32) builtin
  162. call void @_ZdaPv(i8* %na) builtin
  163. %nwm = call i8* @_Znwm(i64 32) builtin
  164. call void @_ZdlPvm(i8* %nwm, i64 32) builtin
  165. %nwj = call i8* @_Znwj(i32 32) builtin
  166. call void @_ZdlPvj(i8* %nwj, i32 32) builtin
  167. %nam = call i8* @_Znam(i64 32) builtin
  168. call void @_ZdaPvm(i8* %nam, i64 32) builtin
  169. %naj = call i8* @_Znaj(i32 32) builtin
  170. call void @_ZdaPvj(i8* %naj, i32 32) builtin
  171. ret void
  172. }