2008-05-16-PHIBlockMerge.ll 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. ; RUN: opt < %s -simplifycfg -S > %t
  2. ; RUN: not grep "^BB.tomerge" %t
  3. ; RUN: grep "^BB.nomerge" %t | count 2
  4. ; ModuleID = '<stdin>'
  5. declare i1 @foo()
  6. declare i1 @bar(i32)
  7. ; This function can't be merged
  8. define void @a() {
  9. entry:
  10. br label %BB.nomerge
  11. BB.nomerge: ; preds = %Common, %entry
  12. ; This phi has a conflicting value (0) with below phi (2), so blocks
  13. ; can't be merged.
  14. %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1]
  15. br label %Succ
  16. Succ: ; preds = %Common, %BB.nomerge
  17. %b = phi i32 [ %a, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0]
  18. %conde = call i1 @foo( ) ; <i1> [#uses=1]
  19. br i1 %conde, label %Common, label %Exit
  20. Common: ; preds = %Succ
  21. %cond = call i1 @foo( ) ; <i1> [#uses=1]
  22. br i1 %cond, label %BB.nomerge, label %Succ
  23. Exit: ; preds = %Succ
  24. ret void
  25. }
  26. ; This function can't be merged
  27. define void @b() {
  28. entry:
  29. br label %BB.nomerge
  30. BB.nomerge: ; preds = %Common, %entry
  31. br label %Succ
  32. Succ: ; preds = %Common, %BB.nomerge
  33. ; This phi has confliction values for Common and (through BB) Common,
  34. ; blocks can't be merged
  35. %b = phi i32 [ 1, %BB.nomerge ], [ 2, %Common ] ; <i32> [#uses=0]
  36. %conde = call i1 @foo( ) ; <i1> [#uses=1]
  37. br i1 %conde, label %Common, label %Exit
  38. Common: ; preds = %Succ
  39. %cond = call i1 @foo( ) ; <i1> [#uses=1]
  40. br i1 %cond, label %BB.nomerge, label %Succ
  41. Exit: ; preds = %Succ
  42. ret void
  43. }
  44. ; This function can be merged
  45. define void @c() {
  46. entry:
  47. br label %BB.tomerge
  48. BB.tomerge: ; preds = %Common, %entry
  49. br label %Succ
  50. Succ: ; preds = %Common, %BB.tomerge, %Pre-Exit
  51. ; This phi has identical values for Common and (through BB) Common,
  52. ; blocks can't be merged
  53. %b = phi i32 [ 1, %BB.tomerge ], [ 1, %Common ], [ 2, %Pre-Exit ]
  54. %conde = call i1 @foo( ) ; <i1> [#uses=1]
  55. br i1 %conde, label %Common, label %Pre-Exit
  56. Common: ; preds = %Succ
  57. %cond = call i1 @foo( ) ; <i1> [#uses=1]
  58. br i1 %cond, label %BB.tomerge, label %Succ
  59. Pre-Exit: ; preds = %Succ
  60. ; This adds a backedge, so the %b phi node gets a third branch and is
  61. ; not completely trivial
  62. %cond2 = call i1 @foo( ) ; <i1> [#uses=1]
  63. br i1 %cond2, label %Succ, label %Exit
  64. Exit: ; preds = %Pre-Exit
  65. ret void
  66. }
  67. ; This function can be merged
  68. define void @d() {
  69. entry:
  70. br label %BB.tomerge
  71. BB.tomerge: ; preds = %Common, %entry
  72. ; This phi has a matching value (0) with below phi (0), so blocks
  73. ; can be merged.
  74. %a = phi i32 [ 1, %entry ], [ 0, %Common ] ; <i32> [#uses=1]
  75. br label %Succ
  76. Succ: ; preds = %Common, %BB.tomerge
  77. %b = phi i32 [ %a, %BB.tomerge ], [ 0, %Common ] ; <i32> [#uses=0]
  78. %conde = call i1 @foo( ) ; <i1> [#uses=1]
  79. br i1 %conde, label %Common, label %Exit
  80. Common: ; preds = %Succ
  81. %cond = call i1 @foo( ) ; <i1> [#uses=1]
  82. br i1 %cond, label %BB.tomerge, label %Succ
  83. Exit: ; preds = %Succ
  84. ret void
  85. }
  86. ; This function can be merged
  87. define void @e() {
  88. entry:
  89. br label %BB.tomerge
  90. BB.tomerge: ; preds = %Use, %entry
  91. ; This phi is used somewhere else than Succ, but this should not prevent
  92. ; merging this block
  93. %a = phi i32 [ 1, %entry ], [ 0, %Use ] ; <i32> [#uses=1]
  94. br label %Succ
  95. Succ: ; preds = %BB.tomerge
  96. %conde = call i1 @foo( ) ; <i1> [#uses=1]
  97. br i1 %conde, label %Use, label %Exit
  98. Use: ; preds = %Succ
  99. %cond = call i1 @bar( i32 %a ) ; <i1> [#uses=1]
  100. br i1 %cond, label %BB.tomerge, label %Exit
  101. Exit: ; preds = %Use, %Succ
  102. ret void
  103. }