load.ll 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=1 -S | FileCheck %s --check-prefix=COMBINE_PTR_LABEL
  2. ; RUN: opt < %s -dfsan -dfsan-combine-pointer-labels-on-load=0 -S | FileCheck %s --check-prefix=NO_COMBINE_PTR_LABEL
  3. 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"
  4. target triple = "x86_64-unknown-linux-gnu"
  5. define {} @load0({}* %p) {
  6. ; COMBINE_PTR_LABEL: @"dfs$load0"
  7. ; COMBINE_PTR_LABEL: load
  8. ; COMBINE_PTR_LABEL-NOT: load
  9. ; NO_COMBINE_PTR_LABEL: @"dfs$load0"
  10. ; NO_COMBINE_PTR_LABEL: load
  11. ; NO_COMBINE_PTR_LABEL-NOT: load
  12. %a = load {}, {}* %p
  13. ret {} %a
  14. }
  15. define i8 @load8(i8* %p) {
  16. ; COMBINE_PTR_LABEL: @"dfs$load8"
  17. ; COMBINE_PTR_LABEL: load i16, i16*
  18. ; COMBINE_PTR_LABEL: ptrtoint i8* {{.*}} to i64
  19. ; COMBINE_PTR_LABEL: and i64
  20. ; COMBINE_PTR_LABEL: mul i64
  21. ; COMBINE_PTR_LABEL: inttoptr i64
  22. ; COMBINE_PTR_LABEL: load i16, i16*
  23. ; COMBINE_PTR_LABEL: icmp ne i16
  24. ; COMBINE_PTR_LABEL: call zeroext i16 @__dfsan_union
  25. ; COMBINE_PTR_LABEL: load i8, i8*
  26. ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  27. ; COMBINE_PTR_LABEL: ret i8
  28. ; NO_COMBINE_PTR_LABEL: @"dfs$load8"
  29. ; NO_COMBINE_PTR_LABEL: ptrtoint i8*
  30. ; NO_COMBINE_PTR_LABEL: and i64
  31. ; NO_COMBINE_PTR_LABEL: mul i64
  32. ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} to i16*
  33. ; NO_COMBINE_PTR_LABEL: load i16, i16*
  34. ; NO_COMBINE_PTR_LABEL: load i8, i8*
  35. ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  36. ; NO_COMBINE_PTR_LABEL: ret i8
  37. %a = load i8, i8* %p
  38. ret i8 %a
  39. }
  40. define i16 @load16(i16* %p) {
  41. ; COMBINE_PTR_LABEL: @"dfs$load16"
  42. ; COMBINE_PTR_LABEL: ptrtoint i16*
  43. ; COMBINE_PTR_LABEL: and i64
  44. ; COMBINE_PTR_LABEL: mul i64
  45. ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  46. ; COMBINE_PTR_LABEL: getelementptr i16
  47. ; COMBINE_PTR_LABEL: load i16, i16*
  48. ; COMBINE_PTR_LABEL: load i16, i16*
  49. ; COMBINE_PTR_LABEL: icmp ne
  50. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
  51. ; COMBINE_PTR_LABEL: icmp ne i16
  52. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
  53. ; COMBINE_PTR_LABEL: load i16, i16*
  54. ; COMBINE_PTR_LABEL: store {{.*}} @__dfsan_retval_tls
  55. ; COMBINE_PTR_LABEL: ret i16
  56. ; NO_COMBINE_PTR_LABEL: @"dfs$load16"
  57. ; NO_COMBINE_PTR_LABEL: ptrtoint i16*
  58. ; NO_COMBINE_PTR_LABEL: and i64
  59. ; NO_COMBINE_PTR_LABEL: mul i64
  60. ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  61. ; NO_COMBINE_PTR_LABEL: getelementptr i16, i16*
  62. ; NO_COMBINE_PTR_LABEL: load i16, i16*
  63. ; NO_COMBINE_PTR_LABEL: load i16, i16*
  64. ; NO_COMBINE_PTR_LABEL: icmp ne i16
  65. ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
  66. ; NO_COMBINE_PTR_LABEL: load i16, i16*
  67. ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  68. ; NO_COMBINE_PTR_LABEL: ret i16
  69. %a = load i16, i16* %p
  70. ret i16 %a
  71. }
  72. define i32 @load32(i32* %p) {
  73. ; COMBINE_PTR_LABEL: @"dfs$load32"
  74. ; COMBINE_PTR_LABEL: ptrtoint i32*
  75. ; COMBINE_PTR_LABEL: and i64
  76. ; COMBINE_PTR_LABEL: mul i64
  77. ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  78. ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
  79. ; COMBINE_PTR_LABEL: load i64, i64*
  80. ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
  81. ; COMBINE_PTR_LABEL: shl i64
  82. ; COMBINE_PTR_LABEL: lshr i64
  83. ; COMBINE_PTR_LABEL: or i64
  84. ; COMBINE_PTR_LABEL: icmp eq i64
  85. ; COMBINE_PTR_LABEL: icmp ne i16
  86. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
  87. ; COMBINE_PTR_LABEL: load i32, i32*
  88. ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  89. ; COMBINE_PTR_LABEL: ret i32
  90. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
  91. ; NO_COMBINE_PTR_LABEL: @"dfs$load32"
  92. ; NO_COMBINE_PTR_LABEL: ptrtoint i32*
  93. ; NO_COMBINE_PTR_LABEL: and i64
  94. ; NO_COMBINE_PTR_LABEL: mul i64
  95. ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  96. ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
  97. ; NO_COMBINE_PTR_LABEL: load i64, i64*
  98. ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
  99. ; NO_COMBINE_PTR_LABEL: shl i64
  100. ; NO_COMBINE_PTR_LABEL: lshr i64
  101. ; NO_COMBINE_PTR_LABEL: or i64
  102. ; NO_COMBINE_PTR_LABEL: icmp eq i64
  103. ; NO_COMBINE_PTR_LABEL: load i32, i32*
  104. ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  105. ; NO_COMBINE_PTR_LABEL: ret i32
  106. ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
  107. %a = load i32, i32* %p
  108. ret i32 %a
  109. }
  110. define i64 @load64(i64* %p) {
  111. ; COMBINE_PTR_LABEL: @"dfs$load64"
  112. ; COMBINE_PTR_LABEL: ptrtoint i64*
  113. ; COMBINE_PTR_LABEL: and i64
  114. ; COMBINE_PTR_LABEL: mul i64
  115. ; COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  116. ; COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
  117. ; COMBINE_PTR_LABEL: load i64, i64*
  118. ; COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
  119. ; COMBINE_PTR_LABEL: shl i64
  120. ; COMBINE_PTR_LABEL: lshr i64
  121. ; COMBINE_PTR_LABEL: or i64
  122. ; COMBINE_PTR_LABEL: icmp eq i64
  123. ; COMBINE_PTR_LABEL: icmp ne i16
  124. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union
  125. ; COMBINE_PTR_LABEL: load i64, i64*
  126. ; COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  127. ; COMBINE_PTR_LABEL: ret i64
  128. ; COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
  129. ; COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
  130. ; COMBINE_PTR_LABEL: load i64, i64*
  131. ; COMBINE_PTR_LABEL: icmp eq i64
  132. ; NO_COMBINE_PTR_LABEL: @"dfs$load64"
  133. ; NO_COMBINE_PTR_LABEL: ptrtoint i64*
  134. ; NO_COMBINE_PTR_LABEL: and i64
  135. ; NO_COMBINE_PTR_LABEL: mul i64
  136. ; NO_COMBINE_PTR_LABEL: inttoptr i64 {{.*}} i16*
  137. ; NO_COMBINE_PTR_LABEL: bitcast i16* {{.*}} i64*
  138. ; NO_COMBINE_PTR_LABEL: load i64, i64*
  139. ; NO_COMBINE_PTR_LABEL: trunc i64 {{.*}} i16
  140. ; NO_COMBINE_PTR_LABEL: shl i64
  141. ; NO_COMBINE_PTR_LABEL: lshr i64
  142. ; NO_COMBINE_PTR_LABEL: or i64
  143. ; NO_COMBINE_PTR_LABEL: icmp eq i64
  144. ; NO_COMBINE_PTR_LABEL: load i64, i64*
  145. ; NO_COMBINE_PTR_LABEL: store i16 {{.*}} @__dfsan_retval_tls
  146. ; NO_COMBINE_PTR_LABEL: ret i64
  147. ; NO_COMBINE_PTR_LABEL: call {{.*}} @__dfsan_union_load
  148. ; NO_COMBINE_PTR_LABEL: getelementptr i64, i64* {{.*}} i64
  149. ; NO_COMBINE_PTR_LABEL: load i64, i64*
  150. ; NO_COMBINE_PTR_LABEL: icmp eq i64
  151. %a = load i64, i64* %p
  152. ret i64 %a
  153. }