edge.ll 3.9 KB

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