loads.ll 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. ; RUN: opt < %s -default-data-layout="e-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=LE
  2. ; RUN: opt < %s -default-data-layout="E-p:64:64:64-p1:16:16:16-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" -instcombine -S | FileCheck %s --check-prefix=BE
  3. ; {{ 0xDEADBEEF, 0xBA }, 0xCAFEBABE}
  4. @g1 = constant {{i32,i8},i32} {{i32,i8} { i32 -559038737, i8 186 }, i32 -889275714 }
  5. @g2 = constant double 1.0
  6. ; { 0x7B, 0x06B1BFF8 }
  7. @g3 = constant {i64, i64} { i64 123, i64 112312312 }
  8. ; Simple load
  9. define i32 @test1() {
  10. %r = load i32, i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0)
  11. ret i32 %r
  12. ; 0xDEADBEEF
  13. ; LE-LABEL: @test1(
  14. ; LE: ret i32 -559038737
  15. ; 0xDEADBEEF
  16. ; BE-LABEL: @test1(
  17. ; BE: ret i32 -559038737
  18. }
  19. ; PR3152
  20. ; Load of first 16 bits of 32-bit value.
  21. define i16 @test2() {
  22. %r = load i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*)
  23. ret i16 %r
  24. ; 0xBEEF
  25. ; LE-LABEL: @test2(
  26. ; LE: ret i16 -16657
  27. ; 0xDEAD
  28. ; BE-LABEL: @test2(
  29. ; BE: ret i16 -8531
  30. }
  31. define i16 @test2_addrspacecast() {
  32. %r = load i16, i16 addrspace(1)* addrspacecast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16 addrspace(1)*)
  33. ret i16 %r
  34. ; 0xBEEF
  35. ; LE-LABEL: @test2_addrspacecast(
  36. ; LE: ret i16 -16657
  37. ; 0xDEAD
  38. ; BE-LABEL: @test2_addrspacecast(
  39. ; BE: ret i16 -8531
  40. }
  41. ; Load of second 16 bits of 32-bit value.
  42. define i16 @test3() {
  43. %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 1)
  44. ret i16 %r
  45. ; 0xDEAD
  46. ; LE-LABEL: @test3(
  47. ; LE: ret i16 -8531
  48. ; 0xBEEF
  49. ; BE-LABEL: @test3(
  50. ; BE: ret i16 -16657
  51. }
  52. ; Load of 8 bit field + tail padding.
  53. define i16 @test4() {
  54. %r = load i16, i16* getelementptr(i16, i16* bitcast(i32* getelementptr ({{i32,i8},i32}, {{i32,i8},i32}* @g1, i32 0, i32 0, i32 0) to i16*), i32 2)
  55. ret i16 %r
  56. ; 0x00BA
  57. ; LE-LABEL: @test4(
  58. ; LE: ret i16 186
  59. ; 0xBA00
  60. ; BE-LABEL: @test4(
  61. ; BE: ret i16 -17920
  62. }
  63. ; Load of double bits.
  64. define i64 @test6() {
  65. %r = load i64, i64* bitcast(double* @g2 to i64*)
  66. ret i64 %r
  67. ; 0x3FF_0000000000000
  68. ; LE-LABEL: @test6(
  69. ; LE: ret i64 4607182418800017408
  70. ; 0x3FF_0000000000000
  71. ; BE-LABEL: @test6(
  72. ; BE: ret i64 4607182418800017408
  73. }
  74. ; Load of double bits.
  75. define i16 @test7() {
  76. %r = load i16, i16* bitcast(double* @g2 to i16*)
  77. ret i16 %r
  78. ; 0x0000
  79. ; LE-LABEL: @test7(
  80. ; LE: ret i16 0
  81. ; 0x3FF0
  82. ; BE-LABEL: @test7(
  83. ; BE: ret i16 16368
  84. }
  85. ; Double load.
  86. define double @test8() {
  87. %r = load double, double* bitcast({{i32,i8},i32}* @g1 to double*)
  88. ret double %r
  89. ; LE-LABEL: @test8(
  90. ; LE: ret double 0xBADEADBEEF
  91. ; BE-LABEL: @test8(
  92. ; BE: ret double 0xDEADBEEFBA000000
  93. }
  94. ; i128 load.
  95. define i128 @test9() {
  96. %r = load i128, i128* bitcast({i64, i64}* @g3 to i128*)
  97. ret i128 %r
  98. ; 0x00000000_06B1BFF8_00000000_0000007B
  99. ; LE-LABEL: @test9(
  100. ; LE: ret i128 2071796475790618158476296315
  101. ; 0x00000000_0000007B_00000000_06B1BFF8
  102. ; BE-LABEL: @test9(
  103. ; BE: ret i128 2268949521066387161080
  104. }
  105. ; vector load.
  106. define <2 x i64> @test10() {
  107. %r = load <2 x i64>, <2 x i64>* bitcast({i64, i64}* @g3 to <2 x i64>*)
  108. ret <2 x i64> %r
  109. ; LE-LABEL: @test10(
  110. ; LE: ret <2 x i64> <i64 123, i64 112312312>
  111. ; BE-LABEL: @test10(
  112. ; BE: ret <2 x i64> <i64 123, i64 112312312>
  113. }
  114. ; PR5287
  115. ; { 0xA1, 0x08 }
  116. @g4 = internal constant { i8, i8 } { i8 -95, i8 8 }
  117. define i16 @test11() nounwind {
  118. entry:
  119. %a = load i16, i16* bitcast ({ i8, i8 }* @g4 to i16*)
  120. ret i16 %a
  121. ; 0x08A1
  122. ; LE-LABEL: @test11(
  123. ; LE: ret i16 2209
  124. ; 0xA108
  125. ; BE-LABEL: @test11(
  126. ; BE: ret i16 -24312
  127. }
  128. ; PR5551
  129. @test12g = private constant [6 x i8] c"a\00b\00\00\00"
  130. define i16 @test12() {
  131. %a = load i16, i16* getelementptr inbounds ([3 x i16], [3 x i16]* bitcast ([6 x i8]* @test12g to [3 x i16]*), i32 0, i64 1)
  132. ret i16 %a
  133. ; 0x0062
  134. ; LE-LABEL: @test12(
  135. ; LE: ret i16 98
  136. ; 0x6200
  137. ; BE-LABEL: @test12(
  138. ; BE: ret i16 25088
  139. }
  140. ; PR5978
  141. @g5 = constant i8 4
  142. define i1 @test13() {
  143. %A = load i1, i1* bitcast (i8* @g5 to i1*)
  144. ret i1 %A
  145. ; LE-LABEL: @test13(
  146. ; LE: ret i1 false
  147. ; BE-LABEL: @test13(
  148. ; BE: ret i1 false
  149. }
  150. @g6 = constant [2 x i8*] [i8* inttoptr (i64 1 to i8*), i8* inttoptr (i64 2 to i8*)]
  151. define i64 @test14() nounwind {
  152. entry:
  153. %tmp = load i64, i64* bitcast ([2 x i8*]* @g6 to i64*)
  154. ret i64 %tmp
  155. ; LE-LABEL: @test14(
  156. ; LE: ret i64 1
  157. ; BE-LABEL: @test14(
  158. ; BE: ret i64 1
  159. }
  160. ; Check with address space pointers
  161. @g6_as1 = constant [2 x i8 addrspace(1)*] [i8 addrspace(1)* inttoptr (i16 1 to i8 addrspace(1)*), i8 addrspace(1)* inttoptr (i16 2 to i8 addrspace(1)*)]
  162. define i16 @test14_as1() nounwind {
  163. entry:
  164. %tmp = load i16, i16* bitcast ([2 x i8 addrspace(1)*]* @g6_as1 to i16*)
  165. ret i16 %tmp
  166. ; LE: @test14_as1
  167. ; LE: ret i16 1
  168. ; BE: @test14_as1
  169. ; BE: ret i16 1
  170. }
  171. define i64 @test15() nounwind {
  172. entry:
  173. %tmp = load i64, i64* bitcast (i8** getelementptr inbounds ([2 x i8*], [2 x i8*]* @g6, i32 0, i64 1) to i64*)
  174. ret i64 %tmp
  175. ; LE-LABEL: @test15(
  176. ; LE: ret i64 2
  177. ; BE-LABEL: @test15(
  178. ; BE: ret i64 2
  179. }
  180. @gv7 = constant [4 x i8*] [i8* null, i8* inttoptr (i64 -14 to i8*), i8* null, i8* null]
  181. define i64 @test16.1() {
  182. %v = load i64, i64* bitcast ([4 x i8*]* @gv7 to i64*), align 8
  183. ret i64 %v
  184. ; LE-LABEL: @test16.1(
  185. ; LE: ret i64 0
  186. ; BE-LABEL: @test16.1(
  187. ; BE: ret i64 0
  188. }
  189. define i64 @test16.2() {
  190. %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 1) to i64*), align 8
  191. ret i64 %v
  192. ; LE-LABEL: @test16.2(
  193. ; LE: ret i64 -14
  194. ; BE-LABEL: @test16.2(
  195. ; BE: ret i64 -14
  196. }
  197. define i64 @test16.3() {
  198. %v = load i64, i64* bitcast (i8** getelementptr inbounds ([4 x i8*], [4 x i8*]* @gv7, i64 0, i64 2) to i64*), align 8
  199. ret i64 %v
  200. ; LE-LABEL: @test16.3(
  201. ; LE: ret i64 0
  202. ; BE-LABEL: @test16.3(
  203. ; BE: ret i64 0
  204. }