always-inline.ll 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. ; RUN: opt < %s -inline-threshold=0 -always-inline -S | FileCheck %s
  2. ;
  3. ; Ensure the threshold has no impact on these decisions.
  4. ; RUN: opt < %s -inline-threshold=20000000 -always-inline -S | FileCheck %s
  5. ; RUN: opt < %s -inline-threshold=-20000000 -always-inline -S | FileCheck %s
  6. define i32 @inner1() alwaysinline {
  7. ret i32 1
  8. }
  9. define i32 @outer1() {
  10. ; CHECK-LABEL: @outer1(
  11. ; CHECK-NOT: call
  12. ; CHECK: ret
  13. %r = call i32 @inner1()
  14. ret i32 %r
  15. }
  16. ; The always inliner can't DCE internal functions. PR2945
  17. ; CHECK-LABEL: @pr2945(
  18. define internal i32 @pr2945() nounwind {
  19. ret i32 0
  20. }
  21. define internal void @inner2(i32 %N) alwaysinline {
  22. %P = alloca i32, i32 %N
  23. ret void
  24. }
  25. define void @outer2(i32 %N) {
  26. ; The always inliner (unlike the normal one) should be willing to inline
  27. ; a function with a dynamic alloca into one without a dynamic alloca.
  28. ; rdar://6655932
  29. ;
  30. ; CHECK-LABEL: @outer2(
  31. ; CHECK-NOT: call void @inner2
  32. ; CHECK-NOT: call void @inner2
  33. ; CHECK: ret void
  34. call void @inner2( i32 %N )
  35. ret void
  36. }
  37. declare i32 @a() returns_twice
  38. declare i32 @b() returns_twice
  39. define i32 @inner3() alwaysinline {
  40. entry:
  41. %call = call i32 @a() returns_twice
  42. %add = add nsw i32 1, %call
  43. ret i32 %add
  44. }
  45. define i32 @outer3() {
  46. entry:
  47. ; CHECK-LABEL: @outer3(
  48. ; CHECK-NOT: call i32 @a
  49. ; CHECK: ret
  50. %call = call i32 @inner3()
  51. %add = add nsw i32 1, %call
  52. ret i32 %add
  53. }
  54. define i32 @inner4() alwaysinline returns_twice {
  55. entry:
  56. %call = call i32 @b() returns_twice
  57. %add = add nsw i32 1, %call
  58. ret i32 %add
  59. }
  60. define i32 @outer4() {
  61. entry:
  62. ; CHECK-LABEL: @outer4(
  63. ; CHECK: call i32 @b()
  64. ; CHECK: ret
  65. %call = call i32 @inner4() returns_twice
  66. %add = add nsw i32 1, %call
  67. ret i32 %add
  68. }
  69. define i32 @inner5(i8* %addr) alwaysinline {
  70. entry:
  71. indirectbr i8* %addr, [ label %one, label %two ]
  72. one:
  73. ret i32 42
  74. two:
  75. ret i32 44
  76. }
  77. define i32 @outer5(i32 %x) {
  78. ; CHECK-LABEL: @outer5(
  79. ; CHECK: call i32 @inner5
  80. ; CHECK: ret
  81. %cmp = icmp slt i32 %x, 42
  82. %addr = select i1 %cmp, i8* blockaddress(@inner5, %one), i8* blockaddress(@inner5, %two)
  83. %call = call i32 @inner5(i8* %addr)
  84. ret i32 %call
  85. }
  86. define void @inner6(i32 %x) alwaysinline {
  87. entry:
  88. %icmp = icmp slt i32 %x, 0
  89. br i1 %icmp, label %return, label %bb
  90. bb:
  91. %sub = sub nsw i32 %x, 1
  92. call void @inner6(i32 %sub)
  93. ret void
  94. return:
  95. ret void
  96. }
  97. define void @outer6() {
  98. ; CHECK-LABEL: @outer6(
  99. ; CHECK: call void @inner6(i32 42)
  100. ; CHECK: ret
  101. entry:
  102. call void @inner6(i32 42)
  103. ret void
  104. }
  105. define i32 @inner7() {
  106. ret i32 1
  107. }
  108. define i32 @outer7() {
  109. ; CHECK-LABEL: @outer7(
  110. ; CHECK-NOT: call
  111. ; CHECK: ret
  112. %r = call i32 @inner7() alwaysinline
  113. ret i32 %r
  114. }