attributes.ll 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. ; RUN: opt < %s -inline -S | FileCheck %s
  2. target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
  3. define i32 @noattr_callee(i32 %i) {
  4. ret i32 %i
  5. }
  6. define i32 @sanitize_address_callee(i32 %i) sanitize_address {
  7. ret i32 %i
  8. }
  9. define i32 @sanitize_thread_callee(i32 %i) sanitize_thread {
  10. ret i32 %i
  11. }
  12. define i32 @sanitize_memory_callee(i32 %i) sanitize_memory {
  13. ret i32 %i
  14. }
  15. define i32 @alwaysinline_callee(i32 %i) alwaysinline {
  16. ret i32 %i
  17. }
  18. define i32 @alwaysinline_sanitize_address_callee(i32 %i) alwaysinline sanitize_address {
  19. ret i32 %i
  20. }
  21. define i32 @alwaysinline_sanitize_thread_callee(i32 %i) alwaysinline sanitize_thread {
  22. ret i32 %i
  23. }
  24. define i32 @alwaysinline_sanitize_memory_callee(i32 %i) alwaysinline sanitize_memory {
  25. ret i32 %i
  26. }
  27. ; Check that:
  28. ; * noattr callee is inlined into noattr caller,
  29. ; * sanitize_(address|memory|thread) callee is not inlined into noattr caller,
  30. ; * alwaysinline callee is always inlined no matter what sanitize_* attributes are present.
  31. define i32 @test_no_sanitize_address(i32 %arg) {
  32. %x1 = call i32 @noattr_callee(i32 %arg)
  33. %x2 = call i32 @sanitize_address_callee(i32 %x1)
  34. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  35. %x4 = call i32 @alwaysinline_sanitize_address_callee(i32 %x3)
  36. ret i32 %x4
  37. ; CHECK-LABEL: @test_no_sanitize_address(
  38. ; CHECK-NEXT: @sanitize_address_callee
  39. ; CHECK-NEXT: ret i32
  40. }
  41. define i32 @test_no_sanitize_memory(i32 %arg) {
  42. %x1 = call i32 @noattr_callee(i32 %arg)
  43. %x2 = call i32 @sanitize_memory_callee(i32 %x1)
  44. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  45. %x4 = call i32 @alwaysinline_sanitize_memory_callee(i32 %x3)
  46. ret i32 %x4
  47. ; CHECK-LABEL: @test_no_sanitize_memory(
  48. ; CHECK-NEXT: @sanitize_memory_callee
  49. ; CHECK-NEXT: ret i32
  50. }
  51. define i32 @test_no_sanitize_thread(i32 %arg) {
  52. %x1 = call i32 @noattr_callee(i32 %arg)
  53. %x2 = call i32 @sanitize_thread_callee(i32 %x1)
  54. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  55. %x4 = call i32 @alwaysinline_sanitize_thread_callee(i32 %x3)
  56. ret i32 %x4
  57. ; CHECK-LABEL: @test_no_sanitize_thread(
  58. ; CHECK-NEXT: @sanitize_thread_callee
  59. ; CHECK-NEXT: ret i32
  60. }
  61. ; Check that:
  62. ; * noattr callee is not inlined into sanitize_(address|memory|thread) caller,
  63. ; * sanitize_(address|memory|thread) callee is inlined into the caller with the same attribute,
  64. ; * alwaysinline callee is always inlined no matter what sanitize_* attributes are present.
  65. define i32 @test_sanitize_address(i32 %arg) sanitize_address {
  66. %x1 = call i32 @noattr_callee(i32 %arg)
  67. %x2 = call i32 @sanitize_address_callee(i32 %x1)
  68. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  69. %x4 = call i32 @alwaysinline_sanitize_address_callee(i32 %x3)
  70. ret i32 %x4
  71. ; CHECK-LABEL: @test_sanitize_address(
  72. ; CHECK-NEXT: @noattr_callee
  73. ; CHECK-NEXT: ret i32
  74. }
  75. define i32 @test_sanitize_memory(i32 %arg) sanitize_memory {
  76. %x1 = call i32 @noattr_callee(i32 %arg)
  77. %x2 = call i32 @sanitize_memory_callee(i32 %x1)
  78. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  79. %x4 = call i32 @alwaysinline_sanitize_memory_callee(i32 %x3)
  80. ret i32 %x4
  81. ; CHECK-LABEL: @test_sanitize_memory(
  82. ; CHECK-NEXT: @noattr_callee
  83. ; CHECK-NEXT: ret i32
  84. }
  85. define i32 @test_sanitize_thread(i32 %arg) sanitize_thread {
  86. %x1 = call i32 @noattr_callee(i32 %arg)
  87. %x2 = call i32 @sanitize_thread_callee(i32 %x1)
  88. %x3 = call i32 @alwaysinline_callee(i32 %x2)
  89. %x4 = call i32 @alwaysinline_sanitize_thread_callee(i32 %x3)
  90. ret i32 %x4
  91. ; CHECK-LABEL: @test_sanitize_thread(
  92. ; CHECK-NEXT: @noattr_callee
  93. ; CHECK-NEXT: ret i32
  94. }
  95. ; Check that a function doesn't get inlined if target-cpu strings don't match
  96. ; exactly.
  97. define i32 @test_target_cpu_callee0(i32 %i) "target-cpu"="corei7" {
  98. ret i32 %i
  99. }
  100. define i32 @test_target_cpu0(i32 %i) "target-cpu"="corei7" {
  101. %1 = call i32 @test_target_cpu_callee0(i32 %i)
  102. ret i32 %1
  103. ; CHECK-LABEL: @test_target_cpu0(
  104. ; CHECK-NOT: @test_target_cpu_callee0
  105. }
  106. define i32 @test_target_cpu_callee1(i32 %i) "target-cpu"="x86-64" {
  107. ret i32 %i
  108. }
  109. define i32 @test_target_cpu1(i32 %i) "target-cpu"="corei7" {
  110. %1 = call i32 @test_target_cpu_callee1(i32 %i)
  111. ret i32 %1
  112. ; CHECK-LABEL: @test_target_cpu1(
  113. ; CHECK-NEXT: @test_target_cpu_callee1
  114. ; CHECK-NEXT: ret i32
  115. }
  116. ; Check that a function doesn't get inlined if target-features strings don't
  117. ; match exactly.
  118. define i32 @test_target_features_callee0(i32 %i) "target-features"="+sse4.2" {
  119. ret i32 %i
  120. }
  121. define i32 @test_target_features0(i32 %i) "target-features"="+sse4.2" {
  122. %1 = call i32 @test_target_features_callee0(i32 %i)
  123. ret i32 %1
  124. ; CHECK-LABEL: @test_target_features0(
  125. ; CHECK-NOT: @test_target_features_callee0
  126. }
  127. define i32 @test_target_features_callee1(i32 %i) "target-features"="+avx2" {
  128. ret i32 %i
  129. }
  130. define i32 @test_target_features1(i32 %i) "target-features"="+sse4.2" {
  131. %1 = call i32 @test_target_features_callee1(i32 %i)
  132. ret i32 %1
  133. ; CHECK-LABEL: @test_target_features1(
  134. ; CHECK-NEXT: @test_target_features_callee1
  135. ; CHECK-NEXT: ret i32
  136. }