simple.ll 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
  2. ; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s
  3. define i32 @foo(i32* nocapture %a) nounwind uwtable readonly {
  4. entry:
  5. %ptrint = ptrtoint i32* %a to i64
  6. %maskedptr = and i64 %ptrint, 31
  7. %maskcond = icmp eq i64 %maskedptr, 0
  8. tail call void @llvm.assume(i1 %maskcond)
  9. %0 = load i32, i32* %a, align 4
  10. ret i32 %0
  11. ; CHECK-LABEL: @foo
  12. ; CHECK: load i32, i32* {{[^,]+}}, align 32
  13. ; CHECK: ret i32
  14. }
  15. define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly {
  16. entry:
  17. %ptrint = ptrtoint i32* %a to i64
  18. %offsetptr = add i64 %ptrint, 24
  19. %maskedptr = and i64 %offsetptr, 31
  20. %maskcond = icmp eq i64 %maskedptr, 0
  21. tail call void @llvm.assume(i1 %maskcond)
  22. %arrayidx = getelementptr inbounds i32, i32* %a, i64 2
  23. %0 = load i32, i32* %arrayidx, align 4
  24. ret i32 %0
  25. ; CHECK-LABEL: @foo2
  26. ; CHECK: load i32, i32* {{[^,]+}}, align 16
  27. ; CHECK: ret i32
  28. }
  29. define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly {
  30. entry:
  31. %ptrint = ptrtoint i32* %a to i64
  32. %offsetptr = add i64 %ptrint, 28
  33. %maskedptr = and i64 %offsetptr, 31
  34. %maskcond = icmp eq i64 %maskedptr, 0
  35. tail call void @llvm.assume(i1 %maskcond)
  36. %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1
  37. %0 = load i32, i32* %arrayidx, align 4
  38. ret i32 %0
  39. ; CHECK-LABEL: @foo2a
  40. ; CHECK: load i32, i32* {{[^,]+}}, align 32
  41. ; CHECK: ret i32
  42. }
  43. define i32 @goo(i32* nocapture %a) nounwind uwtable readonly {
  44. entry:
  45. %ptrint = ptrtoint i32* %a to i64
  46. %maskedptr = and i64 %ptrint, 31
  47. %maskcond = icmp eq i64 %maskedptr, 0
  48. tail call void @llvm.assume(i1 %maskcond)
  49. %0 = load i32, i32* %a, align 4
  50. ret i32 %0
  51. ; CHECK-LABEL: @goo
  52. ; CHECK: load i32, i32* {{[^,]+}}, align 32
  53. ; CHECK: ret i32
  54. }
  55. define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly {
  56. entry:
  57. %ptrint = ptrtoint i32* %a to i64
  58. %maskedptr = and i64 %ptrint, 31
  59. %maskcond = icmp eq i64 %maskedptr, 0
  60. tail call void @llvm.assume(i1 %maskcond)
  61. br label %for.body
  62. for.body: ; preds = %entry, %for.body
  63. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  64. %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  65. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  66. %0 = load i32, i32* %arrayidx, align 4
  67. %add = add nsw i32 %0, %r.06
  68. %indvars.iv.next = add i64 %indvars.iv, 8
  69. %1 = trunc i64 %indvars.iv.next to i32
  70. %cmp = icmp slt i32 %1, 2048
  71. br i1 %cmp, label %for.body, label %for.end
  72. for.end: ; preds = %for.body
  73. %add.lcssa = phi i32 [ %add, %for.body ]
  74. ret i32 %add.lcssa
  75. ; CHECK-LABEL: @hoo
  76. ; CHECK: load i32, i32* %arrayidx, align 32
  77. ; CHECK: ret i32 %add.lcssa
  78. }
  79. define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
  80. entry:
  81. %ptrint = ptrtoint i32* %a to i64
  82. %maskedptr = and i64 %ptrint, 31
  83. %maskcond = icmp eq i64 %maskedptr, 0
  84. tail call void @llvm.assume(i1 %maskcond)
  85. br label %for.body
  86. for.body: ; preds = %entry, %for.body
  87. %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ]
  88. %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  89. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  90. %0 = load i32, i32* %arrayidx, align 4
  91. %add = add nsw i32 %0, %r.06
  92. %indvars.iv.next = add i64 %indvars.iv, 8
  93. %1 = trunc i64 %indvars.iv.next to i32
  94. %cmp = icmp slt i32 %1, 2048
  95. br i1 %cmp, label %for.body, label %for.end
  96. for.end: ; preds = %for.body
  97. %add.lcssa = phi i32 [ %add, %for.body ]
  98. ret i32 %add.lcssa
  99. ; CHECK-LABEL: @joo
  100. ; CHECK: load i32, i32* %arrayidx, align 16
  101. ; CHECK: ret i32 %add.lcssa
  102. }
  103. define i32 @koo(i32* nocapture %a) nounwind uwtable readonly {
  104. entry:
  105. %ptrint = ptrtoint i32* %a to i64
  106. %maskedptr = and i64 %ptrint, 31
  107. %maskcond = icmp eq i64 %maskedptr, 0
  108. tail call void @llvm.assume(i1 %maskcond)
  109. br label %for.body
  110. for.body: ; preds = %entry, %for.body
  111. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  112. %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  113. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  114. %0 = load i32, i32* %arrayidx, align 4
  115. %add = add nsw i32 %0, %r.06
  116. %indvars.iv.next = add i64 %indvars.iv, 4
  117. %1 = trunc i64 %indvars.iv.next to i32
  118. %cmp = icmp slt i32 %1, 2048
  119. br i1 %cmp, label %for.body, label %for.end
  120. for.end: ; preds = %for.body
  121. %add.lcssa = phi i32 [ %add, %for.body ]
  122. ret i32 %add.lcssa
  123. ; CHECK-LABEL: @koo
  124. ; CHECK: load i32, i32* %arrayidx, align 16
  125. ; CHECK: ret i32 %add.lcssa
  126. }
  127. define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly {
  128. entry:
  129. %ptrint = ptrtoint i32* %a to i64
  130. %maskedptr = and i64 %ptrint, 31
  131. %maskcond = icmp eq i64 %maskedptr, 0
  132. tail call void @llvm.assume(i1 %maskcond)
  133. br label %for.body
  134. for.body: ; preds = %entry, %for.body
  135. %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ]
  136. %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  137. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  138. %0 = load i32, i32* %arrayidx, align 4
  139. %add = add nsw i32 %0, %r.06
  140. %indvars.iv.next = add i64 %indvars.iv, 4
  141. %1 = trunc i64 %indvars.iv.next to i32
  142. %cmp = icmp slt i32 %1, 2048
  143. br i1 %cmp, label %for.body, label %for.end
  144. for.end: ; preds = %for.body
  145. %add.lcssa = phi i32 [ %add, %for.body ]
  146. ret i32 %add.lcssa
  147. ; CHECK-LABEL: @koo2
  148. ; CHECK: load i32, i32* %arrayidx, align 16
  149. ; CHECK: ret i32 %add.lcssa
  150. }
  151. define i32 @moo(i32* nocapture %a) nounwind uwtable {
  152. entry:
  153. %ptrint = ptrtoint i32* %a to i64
  154. %maskedptr = and i64 %ptrint, 31
  155. %maskcond = icmp eq i64 %maskedptr, 0
  156. tail call void @llvm.assume(i1 %maskcond)
  157. %0 = bitcast i32* %a to i8*
  158. tail call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 4, i1 false)
  159. ret i32 undef
  160. ; CHECK-LABEL: @moo
  161. ; CHECK: @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 32, i1 false)
  162. ; CHECK: ret i32 undef
  163. }
  164. define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable {
  165. entry:
  166. %ptrint = ptrtoint i32* %a to i64
  167. %maskedptr = and i64 %ptrint, 31
  168. %maskcond = icmp eq i64 %maskedptr, 0
  169. tail call void @llvm.assume(i1 %maskcond)
  170. %ptrint1 = ptrtoint i32* %b to i64
  171. %maskedptr3 = and i64 %ptrint1, 127
  172. %maskcond4 = icmp eq i64 %maskedptr3, 0
  173. tail call void @llvm.assume(i1 %maskcond4)
  174. %0 = bitcast i32* %a to i8*
  175. %1 = bitcast i32* %b to i8*
  176. tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 4, i1 false)
  177. ret i32 undef
  178. ; CHECK-LABEL: @moo2
  179. ; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 32, i1 false)
  180. ; CHECK: ret i32 undef
  181. }
  182. declare void @llvm.assume(i1) nounwind
  183. declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
  184. declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind