trip-count10.ll 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. ; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
  2. ; Trip counts with trivial exit conditions.
  3. ; CHECK: Determining loop execution counts for: @a
  4. ; CHECK: Loop %loop: Unpredictable backedge-taken count.
  5. ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
  6. ; CHECK: Determining loop execution counts for: @b
  7. ; CHECK: Loop %loop: backedge-taken count is false
  8. ; CHECK: Loop %loop: max backedge-taken count is false
  9. ; CHECK: Determining loop execution counts for: @c
  10. ; CHECK: Loop %loop: backedge-taken count is false
  11. ; CHECK: Loop %loop: max backedge-taken count is false
  12. ; CHECK: Determining loop execution counts for: @d
  13. ; CHECK: Loop %loop: Unpredictable backedge-taken count.
  14. ; CHECK: Loop %loop: Unpredictable max backedge-taken count.
  15. define void @a(i64 %n) nounwind {
  16. entry:
  17. %t0 = icmp sgt i64 %n, 0
  18. br i1 %t0, label %loop, label %return
  19. loop:
  20. %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
  21. %i.next = add nsw i64 %i, 1
  22. %exitcond = icmp eq i64 %i.next, %n
  23. br i1 false, label %return, label %loop
  24. return:
  25. ret void
  26. }
  27. define void @b(i64 %n) nounwind {
  28. entry:
  29. %t0 = icmp sgt i64 %n, 0
  30. br i1 %t0, label %loop, label %return
  31. loop:
  32. %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
  33. %i.next = add nsw i64 %i, 1
  34. %exitcond = icmp eq i64 %i.next, %n
  35. br i1 true, label %return, label %loop
  36. return:
  37. ret void
  38. }
  39. define void @c(i64 %n) nounwind {
  40. entry:
  41. %t0 = icmp sgt i64 %n, 0
  42. br i1 %t0, label %loop, label %return
  43. loop:
  44. %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
  45. %i.next = add nsw i64 %i, 1
  46. %exitcond = icmp eq i64 %i.next, %n
  47. br i1 false, label %loop, label %return
  48. return:
  49. ret void
  50. }
  51. define void @d(i64 %n) nounwind {
  52. entry:
  53. %t0 = icmp sgt i64 %n, 0
  54. br i1 %t0, label %loop, label %return
  55. loop:
  56. %i = phi i64 [ %i.next, %loop ], [ 0, %entry ]
  57. %i.next = add nsw i64 %i, 1
  58. %exitcond = icmp eq i64 %i.next, %n
  59. br i1 true, label %loop, label %return
  60. return:
  61. ret void
  62. }
  63. ; Trip counts for non-polynomial iterations. It's theoretically possible
  64. ; to compute a maximum count for these, but short of that, ScalarEvolution
  65. ; should return unknown.
  66. ; PR7416
  67. ; CHECK: Determining loop execution counts for: @nonpolynomial
  68. ; CHECK-NEXT: Loop %loophead: Unpredictable backedge-taken count
  69. ; CHECK-NEXT: Loop %loophead: Unpredictable max backedge-taken count
  70. declare i1 @g() nounwind
  71. define void @nonpolynomial() {
  72. entry:
  73. br label %loophead
  74. loophead:
  75. %x = phi i32 [0, %entry], [%x.1, %bb1], [%x.2, %bb2]
  76. %y = icmp slt i32 %x, 100
  77. br i1 %y, label %loopbody, label %retbb
  78. loopbody:
  79. %z = call i1 @g()
  80. br i1 %z, label %bb1, label %bb2
  81. bb1:
  82. %x.1 = add i32 %x, 2
  83. br label %loophead
  84. bb2:
  85. %x.2 = add i32 %x, 3
  86. br label %loophead
  87. retbb:
  88. ret void
  89. }
  90. ; PHI nodes with all constant operands.
  91. ; CHECK: Determining loop execution counts for: @constant_phi_operands
  92. ; CHECK: Loop %loop: backedge-taken count is 1
  93. ; CHECK: Loop %loop: max backedge-taken count is 1
  94. define void @constant_phi_operands() nounwind {
  95. entry:
  96. br label %loop
  97. loop:
  98. %i = phi i64 [ 1, %loop ], [ 0, %entry ]
  99. %exitcond = icmp eq i64 %i, 1
  100. br i1 %exitcond, label %return, label %loop
  101. return:
  102. ret void
  103. }
  104. ; PR16130: Loop exit depends on an 'or' expression.
  105. ; One side of the expression test against a value that will be skipped.
  106. ; We can't assume undefined behavior just because we have an NSW flag.
  107. ;
  108. ; CHECK: Determining loop execution counts for: @exit_orcond_nsw
  109. ; CHECK: Loop %for.body.i: Unpredictable backedge-taken count.
  110. ; CHECK: Loop %for.body.i: max backedge-taken count is 1
  111. define void @exit_orcond_nsw(i32 *%a) nounwind {
  112. entry:
  113. br label %for.body.i
  114. for.body.i: ; preds = %for.body.i, %entry
  115. %b.01.i = phi i32 [ 0, %entry ], [ %add.i, %for.body.i ]
  116. %tobool.i = icmp ne i32 %b.01.i, 0
  117. %add.i = add nsw i32 %b.01.i, 8
  118. %cmp.i = icmp eq i32 %add.i, 13
  119. %or.cond = or i1 %tobool.i, %cmp.i
  120. br i1 %or.cond, label %exit, label %for.body.i
  121. exit: ; preds = %for.body.i
  122. %b.01.i.lcssa = phi i32 [ %b.01.i, %for.body.i ]
  123. store i32 %b.01.i.lcssa, i32* %a, align 4
  124. ret void
  125. }