sharpen-range.ll 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. ;; RUN: opt -S < %s -indvars | FileCheck %s
  2. ;; Check if llvm can narrow !range metadata based on loop entry
  3. ;; predicates.
  4. declare void @abort()
  5. define i1 @bounded_below_slt(i32* nocapture readonly %buffer) {
  6. ; CHECK-LABEL: bounded_below_slt
  7. entry:
  8. %length = load i32, i32* %buffer, !range !0
  9. %entry.pred = icmp eq i32 %length, 0
  10. br i1 %entry.pred, label %abort, label %loop.preheader
  11. loop.preheader:
  12. br label %loop
  13. loop:
  14. ; CHECK: loop
  15. %idx = phi i32 [ %idx.inc, %loop.next ], [ 0, %loop.preheader ]
  16. %oob.pred = icmp slt i32 %idx, %length
  17. br i1 %oob.pred, label %loop.next, label %oob
  18. ; CHECK: br i1 true, label %loop.next, label %oob
  19. loop.next:
  20. ; CHECK: loop.next
  21. %idx.inc = add i32 %idx, 1
  22. %exit.pred = icmp slt i32 %idx.inc, %length
  23. br i1 %exit.pred, label %loop, label %abort.loopexit
  24. abort.loopexit:
  25. br label %abort
  26. abort:
  27. ret i1 false
  28. oob:
  29. tail call void @abort()
  30. ret i1 false
  31. }
  32. define i1 @bounded_below_sle(i32* nocapture readonly %buffer) {
  33. ; CHECK-LABEL: bounded_below_sle
  34. entry:
  35. %length = load i32, i32* %buffer, !range !0
  36. %entry.pred = icmp eq i32 %length, 0
  37. br i1 %entry.pred, label %abort, label %loop.preheader
  38. loop.preheader:
  39. br label %loop
  40. loop:
  41. ; CHECK: loop
  42. %idx = phi i32 [ %idx.inc, %loop.next ], [ 0, %loop.preheader ]
  43. %oob.pred = icmp sle i32 %idx, %length
  44. br i1 %oob.pred, label %loop.next, label %oob
  45. ; CHECK: br i1 true, label %loop.next, label %oob
  46. loop.next:
  47. ; CHECK: loop.next
  48. %idx.inc = add i32 %idx, 1
  49. %exit.pred = icmp sle i32 %idx.inc, %length
  50. br i1 %exit.pred, label %loop, label %abort.loopexit
  51. abort.loopexit:
  52. br label %abort
  53. abort:
  54. ret i1 false
  55. oob:
  56. tail call void @abort()
  57. ret i1 false
  58. }
  59. ;; Assert that we're not making an incorrect transform.
  60. declare i32 @check(i8*)
  61. define void @NoChange() {
  62. ; CHECK-LABEL: NoChange
  63. entry:
  64. br label %loop.begin
  65. loop.begin:
  66. ; CHECK: loop.begin:
  67. %i.01 = phi i64 [ 2, %entry ], [ %add, %loop.end ]
  68. %cmp = icmp ugt i64 %i.01, 1
  69. ; CHECK: %cmp = icmp ugt i64 %i.01, 1
  70. br i1 %cmp, label %loop, label %loop.end
  71. loop:
  72. ; CHECK: loop
  73. %.sum = add i64 %i.01, -2
  74. %v = getelementptr inbounds i8, i8* null, i64 %.sum
  75. %r = tail call i32 @check(i8* %v)
  76. %c = icmp eq i32 %r, 0
  77. br i1 %c, label %loop.end, label %abort.now
  78. abort.now:
  79. tail call void @abort()
  80. unreachable
  81. loop.end:
  82. %add = add i64 %i.01, -1
  83. %eq = icmp eq i64 %add, 0
  84. br i1 %eq, label %exit, label %loop.begin
  85. exit:
  86. ret void
  87. }
  88. !0 = !{i32 0, i32 100}