edge.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. ; RUN: opt -gvn -S < %s | FileCheck %s
  2. define i32 @f1(i32 %x) {
  3. ; CHECK-LABEL: define i32 @f1(
  4. bb0:
  5. %cmp = icmp eq i32 %x, 0
  6. br i1 %cmp, label %bb2, label %bb1
  7. bb1:
  8. br label %bb2
  9. bb2:
  10. %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
  11. %foo = add i32 %cond, %x
  12. ret i32 %foo
  13. ; CHECK: bb2:
  14. ; CHECK: ret i32 %x
  15. }
  16. define i32 @f2(i32 %x) {
  17. ; CHECK-LABEL: define i32 @f2(
  18. bb0:
  19. %cmp = icmp ne i32 %x, 0
  20. br i1 %cmp, label %bb1, label %bb2
  21. bb1:
  22. br label %bb2
  23. bb2:
  24. %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
  25. %foo = add i32 %cond, %x
  26. ret i32 %foo
  27. ; CHECK: bb2:
  28. ; CHECK: ret i32 %x
  29. }
  30. define i32 @f3(i32 %x) {
  31. ; CHECK-LABEL: define i32 @f3(
  32. bb0:
  33. switch i32 %x, label %bb1 [ i32 0, label %bb2]
  34. bb1:
  35. br label %bb2
  36. bb2:
  37. %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
  38. %foo = add i32 %cond, %x
  39. ret i32 %foo
  40. ; CHECK: bb2:
  41. ; CHECK: ret i32 %x
  42. }
  43. declare void @g(i1)
  44. define void @f4(i8 * %x) {
  45. ; CHECK-LABEL: define void @f4(
  46. bb0:
  47. %y = icmp eq i8* null, %x
  48. br i1 %y, label %bb2, label %bb1
  49. bb1:
  50. br label %bb2
  51. bb2:
  52. %zed = icmp eq i8* null, %x
  53. call void @g(i1 %zed)
  54. ; CHECK: call void @g(i1 %y)
  55. ret void
  56. }
  57. define double @fcmp_oeq_not_zero(double %x, double %y) {
  58. entry:
  59. %cmp = fcmp oeq double %y, 2.0
  60. br i1 %cmp, label %if, label %return
  61. if:
  62. %div = fdiv double %x, %y
  63. br label %return
  64. return:
  65. %retval = phi double [ %div, %if ], [ %x, %entry ]
  66. ret double %retval
  67. ; CHECK-LABEL: define double @fcmp_oeq_not_zero(
  68. ; CHECK: %div = fdiv double %x, 2.0
  69. }
  70. define double @fcmp_une_not_zero(double %x, double %y) {
  71. entry:
  72. %cmp = fcmp une double %y, 2.0
  73. br i1 %cmp, label %return, label %else
  74. else:
  75. %div = fdiv double %x, %y
  76. br label %return
  77. return:
  78. %retval = phi double [ %div, %else ], [ %x, %entry ]
  79. ret double %retval
  80. ; CHECK-LABEL: define double @fcmp_une_not_zero(
  81. ; CHECK: %div = fdiv double %x, 2.0
  82. }
  83. ; PR22376 - We can't propagate zero constants because -0.0
  84. ; compares equal to 0.0. If %y is -0.0 in this test case,
  85. ; we would produce the wrong sign on the infinity return value.
  86. define double @fcmp_oeq_zero(double %x, double %y) {
  87. entry:
  88. %cmp = fcmp oeq double %y, 0.0
  89. br i1 %cmp, label %if, label %return
  90. if:
  91. %div = fdiv double %x, %y
  92. br label %return
  93. return:
  94. %retval = phi double [ %div, %if ], [ %x, %entry ]
  95. ret double %retval
  96. ; CHECK-LABEL: define double @fcmp_oeq_zero(
  97. ; CHECK: %div = fdiv double %x, %y
  98. }
  99. define double @fcmp_une_zero(double %x, double %y) {
  100. entry:
  101. %cmp = fcmp une double %y, -0.0
  102. br i1 %cmp, label %return, label %else
  103. else:
  104. %div = fdiv double %x, %y
  105. br label %return
  106. return:
  107. %retval = phi double [ %div, %else ], [ %x, %entry ]
  108. ret double %retval
  109. ; CHECK-LABEL: define double @fcmp_une_zero(
  110. ; CHECK: %div = fdiv double %x, %y
  111. }
  112. ; We also cannot propagate a value if it's not a constant.
  113. ; This is because the value could be 0.0 or -0.0.
  114. define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
  115. entry:
  116. %z = fadd double %z1, %z2
  117. %cmp = fcmp oeq double %y, %z
  118. br i1 %cmp, label %if, label %return
  119. if:
  120. %div = fdiv double %x, %z
  121. br label %return
  122. return:
  123. %retval = phi double [ %div, %if ], [ %x, %entry ]
  124. ret double %retval
  125. ; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
  126. ; CHECK: %div = fdiv double %x, %z
  127. }
  128. define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
  129. entry:
  130. %z = fadd double %z1, %z2
  131. %cmp = fcmp une double %y, %z
  132. br i1 %cmp, label %return, label %else
  133. else:
  134. %div = fdiv double %x, %z
  135. br label %return
  136. return:
  137. %retval = phi double [ %div, %else ], [ %x, %entry ]
  138. ret double %retval
  139. ; CHECK-LABEL: define double @fcmp_une_maybe_zero(
  140. ; CHECK: %div = fdiv double %x, %z
  141. }