runtime-loop.ll 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ; RUN: opt < %s -S -loop-unroll -unroll-runtime=true | 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. ; Tests for unrolling loops with run-time trip counts
  4. ; CHECK: %xtraiter = and i32 %n
  5. ; CHECK: %lcmp.mod = icmp ne i32 %xtraiter, 0
  6. ; CHECK: br i1 %lcmp.mod, label %for.body.prol, label %for.body.preheader.split
  7. ; CHECK: for.body.prol:
  8. ; CHECK: %indvars.iv.prol = phi i64 [ %indvars.iv.next.prol, %for.body.prol ], [ 0, %for.body.preheader ]
  9. ; CHECK: %prol.iter.sub = sub i32 %prol.iter, 1
  10. ; CHECK: %prol.iter.cmp = icmp ne i32 %prol.iter.sub, 0
  11. ; CHECK: br i1 %prol.iter.cmp, label %for.body.prol, label %for.body.preheader.split, !llvm.loop !0
  12. define i32 @test(i32* nocapture %a, i32 %n) nounwind uwtable readonly {
  13. entry:
  14. %cmp1 = icmp eq i32 %n, 0
  15. br i1 %cmp1, label %for.end, label %for.body
  16. for.body: ; preds = %for.body, %entry
  17. %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  18. %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
  19. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  20. %0 = load i32, i32* %arrayidx, align 4
  21. %add = add nsw i32 %0, %sum.02
  22. %indvars.iv.next = add i64 %indvars.iv, 1
  23. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  24. %exitcond = icmp eq i32 %lftr.wideiv, %n
  25. br i1 %exitcond, label %for.end, label %for.body
  26. for.end: ; preds = %for.body, %entry
  27. %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.body ]
  28. ret i32 %sum.0.lcssa
  29. }
  30. ; Still try to completely unroll loops with compile-time trip counts
  31. ; even if the -unroll-runtime is specified
  32. ; CHECK: for.body:
  33. ; CHECK-NOT: for.body.prol:
  34. define i32 @test1(i32* nocapture %a) nounwind uwtable readonly {
  35. entry:
  36. br label %for.body
  37. for.body: ; preds = %for.body, %entry
  38. %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
  39. %sum.01 = phi i32 [ 0, %entry ], [ %add, %for.body ]
  40. %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
  41. %0 = load i32, i32* %arrayidx, align 4
  42. %add = add nsw i32 %0, %sum.01
  43. %indvars.iv.next = add i64 %indvars.iv, 1
  44. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  45. %exitcond = icmp eq i32 %lftr.wideiv, 5
  46. br i1 %exitcond, label %for.end, label %for.body
  47. for.end: ; preds = %for.body
  48. ret i32 %add
  49. }
  50. ; This is test 2007-05-09-UnknownTripCount.ll which can be unrolled now
  51. ; if the -unroll-runtime option is turned on
  52. ; CHECK: bb72.2:
  53. define void @foo(i32 %trips) {
  54. entry:
  55. br label %cond_true.outer
  56. cond_true.outer:
  57. %indvar1.ph = phi i32 [ 0, %entry ], [ %indvar.next2, %bb72 ]
  58. br label %bb72
  59. bb72:
  60. %indvar.next2 = add i32 %indvar1.ph, 1
  61. %exitcond3 = icmp eq i32 %indvar.next2, %trips
  62. br i1 %exitcond3, label %cond_true138, label %cond_true.outer
  63. cond_true138:
  64. ret void
  65. }
  66. ; Test run-time unrolling for a loop that counts down by -2.
  67. ; CHECK: for.body.prol:
  68. ; CHECK: br i1 %prol.iter.cmp, label %for.body.prol, label %for.body.preheader.split
  69. define zeroext i16 @down(i16* nocapture %p, i32 %len) nounwind uwtable readonly {
  70. entry:
  71. %cmp2 = icmp eq i32 %len, 0
  72. br i1 %cmp2, label %for.end, label %for.body
  73. for.body: ; preds = %for.body, %entry
  74. %p.addr.05 = phi i16* [ %incdec.ptr, %for.body ], [ %p, %entry ]
  75. %len.addr.04 = phi i32 [ %sub, %for.body ], [ %len, %entry ]
  76. %res.03 = phi i32 [ %add, %for.body ], [ 0, %entry ]
  77. %incdec.ptr = getelementptr inbounds i16, i16* %p.addr.05, i64 1
  78. %0 = load i16, i16* %p.addr.05, align 2
  79. %conv = zext i16 %0 to i32
  80. %add = add i32 %conv, %res.03
  81. %sub = add nsw i32 %len.addr.04, -2
  82. %cmp = icmp eq i32 %sub, 0
  83. br i1 %cmp, label %for.cond.for.end_crit_edge, label %for.body
  84. for.cond.for.end_crit_edge: ; preds = %for.body
  85. %phitmp = trunc i32 %add to i16
  86. br label %for.end
  87. for.end: ; preds = %for.cond.for.end_crit_edge, %entry
  88. %res.0.lcssa = phi i16 [ %phitmp, %for.cond.for.end_crit_edge ], [ 0, %entry ]
  89. ret i16 %res.0.lcssa
  90. }
  91. ; Test run-time unrolling disable metadata.
  92. ; CHECK: for.body:
  93. ; CHECK-NOT: for.body.prol:
  94. define zeroext i16 @test2(i16* nocapture %p, i32 %len) nounwind uwtable readonly {
  95. entry:
  96. %cmp2 = icmp eq i32 %len, 0
  97. br i1 %cmp2, label %for.end, label %for.body
  98. for.body: ; preds = %for.body, %entry
  99. %p.addr.05 = phi i16* [ %incdec.ptr, %for.body ], [ %p, %entry ]
  100. %len.addr.04 = phi i32 [ %sub, %for.body ], [ %len, %entry ]
  101. %res.03 = phi i32 [ %add, %for.body ], [ 0, %entry ]
  102. %incdec.ptr = getelementptr inbounds i16, i16* %p.addr.05, i64 1
  103. %0 = load i16, i16* %p.addr.05, align 2
  104. %conv = zext i16 %0 to i32
  105. %add = add i32 %conv, %res.03
  106. %sub = add nsw i32 %len.addr.04, -2
  107. %cmp = icmp eq i32 %sub, 0
  108. br i1 %cmp, label %for.cond.for.end_crit_edge, label %for.body, !llvm.loop !0
  109. for.cond.for.end_crit_edge: ; preds = %for.body
  110. %phitmp = trunc i32 %add to i16
  111. br label %for.end
  112. for.end: ; preds = %for.cond.for.end_crit_edge, %entry
  113. %res.0.lcssa = phi i16 [ %phitmp, %for.cond.for.end_crit_edge ], [ 0, %entry ]
  114. ret i16 %res.0.lcssa
  115. }
  116. !0 = distinct !{!0, !1}
  117. !1 = !{!"llvm.loop.unroll.runtime.disable"}
  118. ; CHECK: !0 = distinct !{!0, !1}
  119. ; CHECK: !1 = !{!"llvm.loop.unroll.disable"}