unaligned.ll 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. ; RUN: opt < %s -tsan -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. define i16 @test_unaligned_read2(i16* %a) sanitize_thread {
  4. entry:
  5. %tmp1 = load i16, i16* %a, align 1
  6. ret i16 %tmp1
  7. }
  8. ; CHECK-LABEL: define i16 @test_unaligned_read2(i16* %a)
  9. ; CHECK: call void @__tsan_func_entry(i8* %0)
  10. ; CHECK-NEXT: %1 = bitcast i16* %a to i8*
  11. ; CHECK-NEXT: call void @__tsan_unaligned_read2(i8* %1)
  12. ; CHECK-NEXT: %tmp1 = load i16, i16* %a, align 1
  13. ; CHECK-NEXT: call void @__tsan_func_exit()
  14. ; CHECK: ret i16
  15. define i32 @test_unaligned_read4(i32* %a) sanitize_thread {
  16. entry:
  17. %tmp1 = load i32, i32* %a, align 2
  18. ret i32 %tmp1
  19. }
  20. ; CHECK-LABEL: define i32 @test_unaligned_read4(i32* %a)
  21. ; CHECK: call void @__tsan_func_entry(i8* %0)
  22. ; CHECK-NEXT: %1 = bitcast i32* %a to i8*
  23. ; CHECK-NEXT: call void @__tsan_unaligned_read4(i8* %1)
  24. ; CHECK-NEXT: %tmp1 = load i32, i32* %a, align 2
  25. ; CHECK-NEXT: call void @__tsan_func_exit()
  26. ; CHECK: ret i32
  27. define i64 @test_unaligned_read8(i64* %a) sanitize_thread {
  28. entry:
  29. %tmp1 = load i64, i64* %a, align 4
  30. ret i64 %tmp1
  31. }
  32. ; CHECK-LABEL: define i64 @test_unaligned_read8(i64* %a)
  33. ; CHECK: call void @__tsan_func_entry(i8* %0)
  34. ; CHECK-NEXT: %1 = bitcast i64* %a to i8*
  35. ; CHECK-NEXT: call void @__tsan_unaligned_read8(i8* %1)
  36. ; CHECK-NEXT: %tmp1 = load i64, i64* %a, align 4
  37. ; CHECK-NEXT: call void @__tsan_func_exit()
  38. ; CHECK: ret i64
  39. define i128 @test_unaligned_read16(i128* %a) sanitize_thread {
  40. entry:
  41. %tmp1 = load i128, i128* %a, align 1
  42. ret i128 %tmp1
  43. }
  44. ; CHECK-LABEL: define i128 @test_unaligned_read16(i128* %a)
  45. ; CHECK: call void @__tsan_func_entry(i8* %0)
  46. ; CHECK-NEXT: %1 = bitcast i128* %a to i8*
  47. ; CHECK-NEXT: call void @__tsan_unaligned_read16(i8* %1)
  48. ; CHECK-NEXT: %tmp1 = load i128, i128* %a, align 1
  49. ; CHECK-NEXT: call void @__tsan_func_exit()
  50. ; CHECK: ret i128
  51. define i128 @test_aligned_read16(i128* %a) sanitize_thread {
  52. entry:
  53. %tmp1 = load i128, i128* %a, align 8
  54. ret i128 %tmp1
  55. }
  56. ; CHECK-LABEL: define i128 @test_aligned_read16(i128* %a)
  57. ; CHECK: call void @__tsan_func_entry(i8* %0)
  58. ; CHECK-NEXT: %1 = bitcast i128* %a to i8*
  59. ; CHECK-NEXT: call void @__tsan_read16(i8* %1)
  60. ; CHECK-NEXT: %tmp1 = load i128, i128* %a, align 8
  61. ; CHECK-NEXT: call void @__tsan_func_exit()
  62. ; CHECK: ret i128
  63. define void @test_unaligned_write2(i16* %a) sanitize_thread {
  64. entry:
  65. store i16 1, i16* %a, align 1
  66. ret void
  67. }
  68. ; CHECK-LABEL: define void @test_unaligned_write2(i16* %a)
  69. ; CHECK: call void @__tsan_func_entry(i8* %0)
  70. ; CHECK-NEXT: %1 = bitcast i16* %a to i8*
  71. ; CHECK-NEXT: call void @__tsan_unaligned_write2(i8* %1)
  72. ; CHECK-NEXT: store i16 1, i16* %a, align 1
  73. ; CHECK-NEXT: call void @__tsan_func_exit()
  74. ; CHECK: ret void
  75. define void @test_unaligned_write4(i32* %a) sanitize_thread {
  76. entry:
  77. store i32 1, i32* %a, align 1
  78. ret void
  79. }
  80. ; CHECK-LABEL: define void @test_unaligned_write4(i32* %a)
  81. ; CHECK: call void @__tsan_func_entry(i8* %0)
  82. ; CHECK-NEXT: %1 = bitcast i32* %a to i8*
  83. ; CHECK-NEXT: call void @__tsan_unaligned_write4(i8* %1)
  84. ; CHECK-NEXT: store i32 1, i32* %a, align 1
  85. ; CHECK-NEXT: call void @__tsan_func_exit()
  86. ; CHECK: ret void
  87. define void @test_unaligned_write8(i64* %a) sanitize_thread {
  88. entry:
  89. store i64 1, i64* %a, align 1
  90. ret void
  91. }
  92. ; CHECK-LABEL: define void @test_unaligned_write8(i64* %a)
  93. ; CHECK: call void @__tsan_func_entry(i8* %0)
  94. ; CHECK-NEXT: %1 = bitcast i64* %a to i8*
  95. ; CHECK-NEXT: call void @__tsan_unaligned_write8(i8* %1)
  96. ; CHECK-NEXT: store i64 1, i64* %a, align 1
  97. ; CHECK-NEXT: call void @__tsan_func_exit()
  98. ; CHECK: ret void
  99. define void @test_unaligned_write16(i128* %a) sanitize_thread {
  100. entry:
  101. store i128 1, i128* %a, align 1
  102. ret void
  103. }
  104. ; CHECK-LABEL: define void @test_unaligned_write16(i128* %a)
  105. ; CHECK: call void @__tsan_func_entry(i8* %0)
  106. ; CHECK-NEXT: %1 = bitcast i128* %a to i8*
  107. ; CHECK-NEXT: call void @__tsan_unaligned_write16(i8* %1)
  108. ; CHECK-NEXT: store i128 1, i128* %a, align 1
  109. ; CHECK-NEXT: call void @__tsan_func_exit()
  110. ; CHECK: ret void
  111. define void @test_aligned_write16(i128* %a) sanitize_thread {
  112. entry:
  113. store i128 1, i128* %a, align 8
  114. ret void
  115. }
  116. ; CHECK-LABEL: define void @test_aligned_write16(i128* %a)
  117. ; CHECK: call void @__tsan_func_entry(i8* %0)
  118. ; CHECK-NEXT: %1 = bitcast i128* %a to i8*
  119. ; CHECK-NEXT: call void @__tsan_write16(i8* %1)
  120. ; CHECK-NEXT: store i128 1, i128* %a, align 8
  121. ; CHECK-NEXT: call void @__tsan_func_exit()
  122. ; CHECK: ret void