iv-fold.ll 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. ; RUN: opt < %s -indvars -S | 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-n32:64"
  3. ; Indvars should be able to fold IV increments into shr when low bits are zero.
  4. ;
  5. ; CHECK-LABEL: @foldIncShr(
  6. ; CHECK: shr.1 = lshr i32 %0, 5
  7. define i32 @foldIncShr(i32* %bitmap, i32 %bit_addr, i32 %nbits) nounwind {
  8. entry:
  9. br label %while.body
  10. while.body:
  11. %0 = phi i32 [ 0, %entry ], [ %inc.2, %while.body ]
  12. %shr = lshr i32 %0, 5
  13. %arrayidx = getelementptr inbounds i32, i32* %bitmap, i32 %shr
  14. %tmp6 = load i32, i32* %arrayidx, align 4
  15. %inc.1 = add i32 %0, 1
  16. %shr.1 = lshr i32 %inc.1, 5
  17. %arrayidx.1 = getelementptr inbounds i32, i32* %bitmap, i32 %shr.1
  18. %tmp6.1 = load i32, i32* %arrayidx.1, align 4
  19. %inc.2 = add i32 %inc.1, 1
  20. %exitcond.3 = icmp eq i32 %inc.2, 128
  21. br i1 %exitcond.3, label %while.end, label %while.body
  22. while.end:
  23. %r = add i32 %tmp6, %tmp6.1
  24. ret i32 %r
  25. }
  26. ; Invdars should not fold an increment into shr unless 2^shiftBits is
  27. ; a multiple of the recurrence step.
  28. ;
  29. ; CHECK-LABEL: @noFoldIncShr(
  30. ; CHECK: shr.1 = lshr i32 %inc.1, 5
  31. define i32 @noFoldIncShr(i32* %bitmap, i32 %bit_addr, i32 %nbits) nounwind {
  32. entry:
  33. br label %while.body
  34. while.body:
  35. %0 = phi i32 [ 0, %entry ], [ %inc.3, %while.body ]
  36. %shr = lshr i32 %0, 5
  37. %arrayidx = getelementptr inbounds i32, i32* %bitmap, i32 %shr
  38. %tmp6 = load i32, i32* %arrayidx, align 4
  39. %inc.1 = add i32 %0, 1
  40. %shr.1 = lshr i32 %inc.1, 5
  41. %arrayidx.1 = getelementptr inbounds i32, i32* %bitmap, i32 %shr.1
  42. %tmp6.1 = load i32, i32* %arrayidx.1, align 4
  43. %inc.3 = add i32 %inc.1, 2
  44. %exitcond.3 = icmp eq i32 %inc.3, 96
  45. br i1 %exitcond.3, label %while.end, label %while.body
  46. while.end:
  47. %r = add i32 %tmp6, %tmp6.1
  48. ret i32 %r
  49. }