strengthen-overflow.ll 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. ; RUN: opt < %s -indvars -S | FileCheck %s
  2. define i32 @test.signed.add.0(i32* %array, i32 %length, i32 %init) {
  3. ; CHECK-LABEL: @test.signed.add.0
  4. entry:
  5. %upper = icmp slt i32 %init, %length
  6. br i1 %upper, label %loop, label %exit
  7. loop:
  8. ; CHECK-LABEL: loop
  9. %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
  10. %civ.inc = add i32 %civ, 1
  11. ; CHECK: %civ.inc = add nsw i32 %civ, 1
  12. %cmp = icmp slt i32 %civ.inc, %length
  13. br i1 %cmp, label %latch, label %break
  14. latch:
  15. store i32 0, i32* %array
  16. %check = icmp slt i32 %civ.inc, %length
  17. br i1 %check, label %loop, label %break
  18. break:
  19. ret i32 %civ.inc
  20. exit:
  21. ret i32 42
  22. }
  23. define i32 @test.signed.add.1(i32* %array, i32 %length, i32 %init) {
  24. ; CHECK-LABEL: @test.signed.add.1
  25. entry:
  26. %upper = icmp sle i32 %init, %length
  27. br i1 %upper, label %loop, label %exit
  28. loop:
  29. ; CHECK-LABEL: loop
  30. %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
  31. %civ.inc = add i32 %civ, 1
  32. ; CHECK: %civ.inc = add i32 %civ, 1
  33. %cmp = icmp slt i32 %civ.inc, %length
  34. br i1 %cmp, label %latch, label %break
  35. latch:
  36. store i32 0, i32* %array
  37. %check = icmp slt i32 %civ.inc, %length
  38. br i1 %check, label %loop, label %break
  39. break:
  40. ret i32 %civ.inc
  41. exit:
  42. ret i32 42
  43. }
  44. define i32 @test.unsigned.add.0(i32* %array, i32 %length, i32 %init) {
  45. ; CHECK-LABEL: @test.unsigned.add.0
  46. entry:
  47. %upper = icmp ult i32 %init, %length
  48. br i1 %upper, label %loop, label %exit
  49. loop:
  50. ; CHECK-LABEL: loop
  51. %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
  52. %civ.inc = add i32 %civ, 1
  53. ; CHECK: %civ.inc = add nuw i32 %civ, 1
  54. %cmp = icmp slt i32 %civ.inc, %length
  55. br i1 %cmp, label %latch, label %break
  56. latch:
  57. store i32 0, i32* %array
  58. %check = icmp ult i32 %civ.inc, %length
  59. br i1 %check, label %loop, label %break
  60. break:
  61. ret i32 %civ.inc
  62. exit:
  63. ret i32 42
  64. }
  65. define i32 @test.unsigned.add.1(i32* %array, i32 %length, i32 %init) {
  66. ; CHECK-LABEL: @test.unsigned.add.1
  67. entry:
  68. %upper = icmp ule i32 %init, %length
  69. br i1 %upper, label %loop, label %exit
  70. loop:
  71. ; CHECK-LABEL: loop
  72. %civ = phi i32 [ %init, %entry ], [ %civ.inc, %latch ]
  73. %civ.inc = add i32 %civ, 1
  74. ; CHECK: %civ.inc = add i32 %civ, 1
  75. %cmp = icmp slt i32 %civ.inc, %length
  76. br i1 %cmp, label %latch, label %break
  77. latch:
  78. store i32 0, i32* %array
  79. %check = icmp ult i32 %civ.inc, %length
  80. br i1 %check, label %loop, label %break
  81. break:
  82. ret i32 %civ.inc
  83. exit:
  84. ret i32 42
  85. }
  86. !0 = !{i32 0, i32 2}
  87. !1 = !{i32 0, i32 42}