alloca-bonus.ll 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. ; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s
  2. target datalayout = "p:32:32"
  3. declare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr)
  4. @glbl = external global i32
  5. define void @outer1() {
  6. ; CHECK-LABEL: @outer1(
  7. ; CHECK-NOT: call void @inner1
  8. %ptr = alloca i32
  9. call void @inner1(i32* %ptr)
  10. ret void
  11. }
  12. define void @inner1(i32 *%ptr) {
  13. %A = load i32, i32* %ptr
  14. store i32 0, i32* %ptr
  15. %C = getelementptr inbounds i32, i32* %ptr, i32 0
  16. %D = getelementptr inbounds i32, i32* %ptr, i32 1
  17. %E = bitcast i32* %ptr to i8*
  18. %F = select i1 false, i32* %ptr, i32* @glbl
  19. call void @llvm.lifetime.start(i64 0, i8* %E)
  20. ret void
  21. }
  22. define void @outer2() {
  23. ; CHECK-LABEL: @outer2(
  24. ; CHECK: call void @inner2
  25. %ptr = alloca i32
  26. call void @inner2(i32* %ptr)
  27. ret void
  28. }
  29. ; %D poisons this call, scalar-repl can't handle that instruction.
  30. define void @inner2(i32 *%ptr) {
  31. %A = load i32, i32* %ptr
  32. store i32 0, i32* %ptr
  33. %C = getelementptr inbounds i32, i32* %ptr, i32 0
  34. %D = getelementptr inbounds i32, i32* %ptr, i32 %A
  35. %E = bitcast i32* %ptr to i8*
  36. %F = select i1 false, i32* %ptr, i32* @glbl
  37. call void @llvm.lifetime.start(i64 0, i8* %E)
  38. ret void
  39. }
  40. define void @outer3() {
  41. ; CHECK-LABEL: @outer3(
  42. ; CHECK-NOT: call void @inner3
  43. %ptr = alloca i32
  44. call void @inner3(i32* %ptr, i1 undef)
  45. ret void
  46. }
  47. define void @inner3(i32 *%ptr, i1 %x) {
  48. %A = icmp eq i32* %ptr, null
  49. %B = and i1 %x, %A
  50. br i1 %A, label %bb.true, label %bb.false
  51. bb.true:
  52. ; This block musn't be counted in the inline cost.
  53. %t1 = load i32, i32* %ptr
  54. %t2 = add i32 %t1, 1
  55. %t3 = add i32 %t2, 1
  56. %t4 = add i32 %t3, 1
  57. %t5 = add i32 %t4, 1
  58. %t6 = add i32 %t5, 1
  59. %t7 = add i32 %t6, 1
  60. %t8 = add i32 %t7, 1
  61. %t9 = add i32 %t8, 1
  62. %t10 = add i32 %t9, 1
  63. %t11 = add i32 %t10, 1
  64. %t12 = add i32 %t11, 1
  65. %t13 = add i32 %t12, 1
  66. %t14 = add i32 %t13, 1
  67. %t15 = add i32 %t14, 1
  68. %t16 = add i32 %t15, 1
  69. %t17 = add i32 %t16, 1
  70. %t18 = add i32 %t17, 1
  71. %t19 = add i32 %t18, 1
  72. %t20 = add i32 %t19, 1
  73. ret void
  74. bb.false:
  75. ret void
  76. }
  77. define void @outer4(i32 %A) {
  78. ; CHECK-LABEL: @outer4(
  79. ; CHECK-NOT: call void @inner4
  80. %ptr = alloca i32
  81. call void @inner4(i32* %ptr, i32 %A)
  82. ret void
  83. }
  84. ; %B poisons this call, scalar-repl can't handle that instruction. However, we
  85. ; still want to detect that the icmp and branch *can* be handled.
  86. define void @inner4(i32 *%ptr, i32 %A) {
  87. %B = getelementptr inbounds i32, i32* %ptr, i32 %A
  88. %C = icmp eq i32* %ptr, null
  89. br i1 %C, label %bb.true, label %bb.false
  90. bb.true:
  91. ; This block musn't be counted in the inline cost.
  92. %t1 = load i32, i32* %ptr
  93. %t2 = add i32 %t1, 1
  94. %t3 = add i32 %t2, 1
  95. %t4 = add i32 %t3, 1
  96. %t5 = add i32 %t4, 1
  97. %t6 = add i32 %t5, 1
  98. %t7 = add i32 %t6, 1
  99. %t8 = add i32 %t7, 1
  100. %t9 = add i32 %t8, 1
  101. %t10 = add i32 %t9, 1
  102. %t11 = add i32 %t10, 1
  103. %t12 = add i32 %t11, 1
  104. %t13 = add i32 %t12, 1
  105. %t14 = add i32 %t13, 1
  106. %t15 = add i32 %t14, 1
  107. %t16 = add i32 %t15, 1
  108. %t17 = add i32 %t16, 1
  109. %t18 = add i32 %t17, 1
  110. %t19 = add i32 %t18, 1
  111. %t20 = add i32 %t19, 1
  112. ret void
  113. bb.false:
  114. ret void
  115. }
  116. define void @outer5() {
  117. ; CHECK-LABEL: @outer5(
  118. ; CHECK-NOT: call void @inner5
  119. %ptr = alloca i32
  120. call void @inner5(i1 false, i32* %ptr)
  121. ret void
  122. }
  123. ; %D poisons this call, scalar-repl can't handle that instruction. However, if
  124. ; the flag is set appropriately, the poisoning instruction is inside of dead
  125. ; code, and so shouldn't be counted.
  126. define void @inner5(i1 %flag, i32 *%ptr) {
  127. %A = load i32, i32* %ptr
  128. store i32 0, i32* %ptr
  129. %C = getelementptr inbounds i32, i32* %ptr, i32 0
  130. br i1 %flag, label %if.then, label %exit
  131. if.then:
  132. %D = getelementptr inbounds i32, i32* %ptr, i32 %A
  133. %E = bitcast i32* %ptr to i8*
  134. %F = select i1 false, i32* %ptr, i32* @glbl
  135. call void @llvm.lifetime.start(i64 0, i8* %E)
  136. ret void
  137. exit:
  138. ret void
  139. }