tbaa.ll 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ; RUN: opt -tbaa -basicaa -gvn -S < %s | FileCheck %s
  2. define i32 @test1(i8* %p, i8* %q) {
  3. ; CHECK: @test1(i8* %p, i8* %q)
  4. ; CHECK: call i32 @foo(i8* %p)
  5. ; CHECK-NOT: tbaa
  6. ; CHECK: %c = add i32 %a, %a
  7. %a = call i32 @foo(i8* %p), !tbaa !0
  8. %b = call i32 @foo(i8* %p)
  9. %c = add i32 %a, %b
  10. ret i32 %c
  11. }
  12. define i32 @test2(i8* %p, i8* %q) {
  13. ; CHECK: @test2(i8* %p, i8* %q)
  14. ; CHECK: call i32 @foo(i8* %p), !tbaa [[TAGC:!.*]]
  15. ; CHECK: %c = add i32 %a, %a
  16. %a = call i32 @foo(i8* %p), !tbaa !0
  17. %b = call i32 @foo(i8* %p), !tbaa !0
  18. %c = add i32 %a, %b
  19. ret i32 %c
  20. }
  21. define i32 @test3(i8* %p, i8* %q) {
  22. ; CHECK: @test3(i8* %p, i8* %q)
  23. ; CHECK: call i32 @foo(i8* %p), !tbaa [[TAGB:!.*]]
  24. ; CHECK: %c = add i32 %a, %a
  25. %a = call i32 @foo(i8* %p), !tbaa !3
  26. %b = call i32 @foo(i8* %p), !tbaa !3
  27. %c = add i32 %a, %b
  28. ret i32 %c
  29. }
  30. define i32 @test4(i8* %p, i8* %q) {
  31. ; CHECK: @test4(i8* %p, i8* %q)
  32. ; CHECK: call i32 @foo(i8* %p), !tbaa [[TAGA:!.*]]
  33. ; CHECK: %c = add i32 %a, %a
  34. %a = call i32 @foo(i8* %p), !tbaa !1
  35. %b = call i32 @foo(i8* %p), !tbaa !0
  36. %c = add i32 %a, %b
  37. ret i32 %c
  38. }
  39. define i32 @test5(i8* %p, i8* %q) {
  40. ; CHECK: @test5(i8* %p, i8* %q)
  41. ; CHECK: call i32 @foo(i8* %p), !tbaa [[TAGA:!.*]]
  42. ; CHECK: %c = add i32 %a, %a
  43. %a = call i32 @foo(i8* %p), !tbaa !0
  44. %b = call i32 @foo(i8* %p), !tbaa !1
  45. %c = add i32 %a, %b
  46. ret i32 %c
  47. }
  48. define i32 @test6(i8* %p, i8* %q) {
  49. ; CHECK: @test6(i8* %p, i8* %q)
  50. ; CHECK: call i32 @foo(i8* %p), !tbaa [[TAGA:!.*]]
  51. ; CHECK: %c = add i32 %a, %a
  52. %a = call i32 @foo(i8* %p), !tbaa !0
  53. %b = call i32 @foo(i8* %p), !tbaa !3
  54. %c = add i32 %a, %b
  55. ret i32 %c
  56. }
  57. define i32 @test7(i8* %p, i8* %q) {
  58. ; CHECK: @test7(i8* %p, i8* %q)
  59. ; CHECK: call i32 @foo(i8* %p)
  60. ; CHECK-NOT: tbaa
  61. ; CHECK: %c = add i32 %a, %a
  62. %a = call i32 @foo(i8* %p), !tbaa !4
  63. %b = call i32 @foo(i8* %p), !tbaa !3
  64. %c = add i32 %a, %b
  65. ret i32 %c
  66. }
  67. define i32 @test8(i32* %p, i32* %q) {
  68. ; CHECK-LABEL: test8
  69. ; CHECK-NEXT: store i32 15, i32* %p
  70. ; CHECK-NEXT: ret i32 0
  71. ; Since we know the location is invariant, we can forward the
  72. ; load across the potentially aliasing store.
  73. %a = load i32, i32* %q, !tbaa !10
  74. store i32 15, i32* %p
  75. %b = load i32, i32* %q, !tbaa !10
  76. %c = sub i32 %a, %b
  77. ret i32 %c
  78. }
  79. define i32 @test9(i32* %p, i32* %q) {
  80. ; CHECK-LABEL: test9
  81. ; CHECK-NEXT: call void @clobber()
  82. ; CHECK-NEXT: ret i32 0
  83. ; Since we know the location is invariant, we can forward the
  84. ; load across the potentially aliasing store (within the call).
  85. %a = load i32, i32* %q, !tbaa !10
  86. call void @clobber()
  87. %b = load i32, i32* %q, !tbaa !10
  88. %c = sub i32 %a, %b
  89. ret i32 %c
  90. }
  91. declare void @clobber()
  92. declare i32 @foo(i8*) readonly
  93. ; CHECK: [[TAGC]] = !{[[TYPEC:!.*]], [[TYPEC]], i64 0}
  94. ; CHECK: [[TYPEC]] = !{!"C", [[TYPEA:!.*]]}
  95. ; CHECK: [[TYPEA]] = !{!"A", !{{.*}}}
  96. ; CHECK: [[TAGB]] = !{[[TYPEB:!.*]], [[TYPEB]], i64 0}
  97. ; CHECK: [[TYPEB]] = !{!"B", [[TYPEA]]}
  98. ; CHECK: [[TAGA]] = !{[[TYPEA]], [[TYPEA]], i64 0}
  99. !0 = !{!5, !5, i64 0}
  100. !1 = !{!6, !6, i64 0}
  101. !2 = !{!"tbaa root", null}
  102. !3 = !{!7, !7, i64 0}
  103. !4 = !{!8, !8, i64 0}
  104. !5 = !{!"C", !6}
  105. !6 = !{!"A", !2}
  106. !7 = !{!"B", !6}
  107. !8 = !{!"another root", null}
  108. ;; A TBAA structure who's only point is to have a constant location
  109. !9 = !{!"yet another root"}
  110. !10 = !{!"node", !9, i64 1}