preserve-loop-simplify.ll 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. ; RUN: opt -S -loop-rotate < %s -verify-loop-info | FileCheck %s
  2. ;
  3. ; Verify that LoopRotate preserves LoopSimplify form even in very peculiar loop
  4. ; structures. We manually validate the CFG with FileCheck because currently we
  5. ; can't cause a failure when LoopSimplify fails to be preserved.
  6. define void @PR18643() {
  7. ; CHECK-LABEL: @PR18643(
  8. entry:
  9. br label %outer.header
  10. ; CHECK: br label %outer.header
  11. outer.header:
  12. ; CHECK: outer.header:
  13. br i1 undef, label %inner.header, label %outer.body
  14. ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER:[^,]*]], label %outer.body
  15. ; CHECK: [[INNER_PREROTATE_PREHEADER]]:
  16. ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_PREROTATE_PREHEADER_SPLIT_RETURN:[^,]*]], label %[[INNER_ROTATED_PREHEADER:[^,]*]]
  17. ; CHECK: [[INNER_ROTATED_PREHEADER]]:
  18. ; CHECK-NEXT: br label %inner.body
  19. inner.header:
  20. ; Now the latch!
  21. ; CHECK: inner.header:
  22. br i1 undef, label %return, label %inner.body
  23. ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_RETURN:[^,]*]], label %inner.body
  24. inner.body:
  25. ; Now the header!
  26. ; CHECK: inner.body:
  27. br i1 undef, label %outer.latch, label %inner.latch
  28. ; CHECK-NEXT: br i1 {{[^,]*}}, label %[[INNER_SPLIT_OUTER_LATCH:[^,]*]], label %inner.header
  29. inner.latch:
  30. ; Dead!
  31. br label %inner.header
  32. outer.body:
  33. ; CHECK: outer.body:
  34. br label %outer.latch
  35. ; CHECK-NEXT: br label %outer.latch
  36. ; L2 -> L1 exit edge needs a simplified exit block.
  37. ; CHECK: [[INNER_SPLIT_OUTER_LATCH]]:
  38. ; CHECK-NEXT: br label %outer.latch
  39. outer.latch:
  40. ; CHECK: outer.latch:
  41. br label %outer.header
  42. ; CHECK-NEXT: br label %outer.header
  43. ; L1 -> L0 exit edge need sa simplified exit block.
  44. ; CHECK: [[INNER_PREROTATE_PREHEADER_SPLIT_RETURN]]:
  45. ; CHECK-NEXT: br label %return
  46. ; L2 -> L0 exit edge needs a simplified exit block.
  47. ; CHECK: [[INNER_SPLIT_RETURN]]:
  48. ; CHECK-NEXT: br label %return
  49. return:
  50. ; CHECK: return:
  51. unreachable
  52. }