indirectbr.ll 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. ; RUN: opt < %s -loop-simplify -lcssa -verify-loop-info -verify-dom-info -S \
  2. ; RUN: | grep -F "indirectbr i8* %x, [label %L0, label %L1]" \
  3. ; RUN: | count 6
  4. ; LoopSimplify should not try to transform loops when indirectbr is involved.
  5. define void @entry(i8* %x) {
  6. entry:
  7. indirectbr i8* %x, [ label %L0, label %L1 ]
  8. L0:
  9. br label %L0
  10. L1:
  11. ret void
  12. }
  13. define void @backedge(i8* %x) {
  14. entry:
  15. br label %L0
  16. L0:
  17. br label %L1
  18. L1:
  19. indirectbr i8* %x, [ label %L0, label %L1 ]
  20. }
  21. define i64 @exit(i8* %x) {
  22. entry:
  23. br label %L2
  24. L2:
  25. %z = bitcast i64 0 to i64
  26. indirectbr i8* %x, [ label %L0, label %L1 ]
  27. L0:
  28. br label %L2
  29. L1:
  30. ret i64 %z
  31. }
  32. define i64 @criticalexit(i8* %x, i1 %a) {
  33. entry:
  34. br i1 %a, label %L1, label %L2
  35. L2:
  36. %z = bitcast i64 0 to i64
  37. indirectbr i8* %x, [ label %L0, label %L1 ]
  38. L0:
  39. br label %L2
  40. L1:
  41. %y = phi i64 [ %z, %L2 ], [ 1, %entry ]
  42. ret i64 %y
  43. }
  44. define i64 @exit_backedge(i8* %x) {
  45. entry:
  46. br label %L0
  47. L0:
  48. %z = bitcast i64 0 to i64
  49. indirectbr i8* %x, [ label %L0, label %L1 ]
  50. L1:
  51. ret i64 %z
  52. }
  53. define i64 @criticalexit_backedge(i8* %x, i1 %a) {
  54. entry:
  55. br i1 %a, label %L0, label %L1
  56. L0:
  57. %z = bitcast i64 0 to i64
  58. indirectbr i8* %x, [ label %L0, label %L1 ]
  59. L1:
  60. %y = phi i64 [ %z, %L0 ], [ 1, %entry ]
  61. ret i64 %y
  62. }
  63. define void @pr5502() nounwind {
  64. entry:
  65. br label %while.cond
  66. while.cond:
  67. br i1 undef, label %while.body, label %while.end
  68. while.body:
  69. indirectbr i8* undef, [label %end_opcode, label %end_opcode]
  70. end_opcode:
  71. br i1 false, label %end_opcode, label %while.cond
  72. while.end:
  73. ret void
  74. }