canonicalize-neg-const.ll 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. ; RUN: opt -reassociate -gvn -S < %s | FileCheck %s
  2. ; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)
  3. define double @test1(double %x, double %y) {
  4. ; CHECK-LABEL: @test1
  5. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  6. ; CHECK-NEXT: fadd double %x, %mul
  7. ; CHECK-NEXT: fsub double %x, %mul
  8. ; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
  9. ; CHECK-NEXT: ret double %mul
  10. %mul = fmul double 1.234000e-01, %y
  11. %add = fadd double %mul, %x
  12. %mul1 = fmul double -1.234000e-01, %y
  13. %add2 = fadd double %mul1, %x
  14. %mul3 = fmul double %add, %add2
  15. ret double %mul3
  16. }
  17. ; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)
  18. define double @test2(double %x, double %y) {
  19. ; CHECK-LABEL: @test2
  20. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  21. ; CHECK-NEXT: fsub double %x, %mul
  22. ; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
  23. ; CHECK-NEXT: ret double %mul
  24. %mul = fmul double %y, -1.234000e-01
  25. %add = fadd double %mul, %x
  26. %mul1 = fmul double %y, -1.234000e-01
  27. %add2 = fadd double %mul1, %x
  28. %mul3 = fmul double %add, %add2
  29. ret double %mul3
  30. }
  31. ; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)
  32. define double @test3(double %x, double %y) {
  33. ; CHECK-LABEL: @test3
  34. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  35. ; CHECK-NEXT: fadd double %x, %mul
  36. ; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
  37. ; CHECK-NEXT: ret double
  38. %mul = fmul double %y, 1.234000e-01
  39. %add = fadd double %mul, %x
  40. %mul1 = fmul double %y, -1.234000e-01
  41. %add2 = fsub double %x, %mul1
  42. %mul3 = fmul double %add, %add2
  43. ret double %mul3
  44. }
  45. ; Canonicalize (x - -0.1234 * y)
  46. define double @test5(double %x, double %y) {
  47. ; CHECK-LABEL: @test5
  48. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  49. ; CHECK-NEXT: fadd double %x, %mul
  50. ; CHECK-NEXT: ret double
  51. %mul = fmul double -1.234000e-01, %y
  52. %sub = fsub double %x, %mul
  53. ret double %sub
  54. }
  55. ; Don't modify (-0.1234 * y - x)
  56. define double @test6(double %x, double %y) {
  57. ; CHECK-LABEL: @test6
  58. ; CHECK-NEXT: fmul double %y, -1.234000e-01
  59. ; CHECK-NEXT: fsub double %mul, %x
  60. ; CHECK-NEXT: ret double %sub
  61. %mul = fmul double -1.234000e-01, %y
  62. %sub = fsub double %mul, %x
  63. ret double %sub
  64. }
  65. ; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y)
  66. define double @test7(double %x, double %y) {
  67. ; CHECK-LABEL: @test7
  68. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  69. ; CHECK-NEXT: fsub double %x, %mul
  70. ; CHECK-NEXT: ret double %add
  71. %mul = fmul double -1.234000e-01, %y
  72. %add = fadd double %mul, %x
  73. ret double %add
  74. }
  75. ; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y)
  76. define double @test8(double %x, double %y) {
  77. ; CHECK-LABEL: @test8
  78. ; CHECK-NEXT: fmul double %y, 1.234000e-01
  79. ; CHECK-NEXT: fsub double %x, %mul
  80. ; CHECK-NEXT: ret double %add
  81. %mul = fmul double %y, -1.234000e-01
  82. %add = fadd double %mul, %x
  83. ret double %add
  84. }
  85. ; Canonicalize (x - -0.1234 / y)
  86. define double @test9(double %x, double %y) {
  87. ; CHECK-LABEL: @test9
  88. ; CHECK-NEXT: fdiv double 1.234000e-01, %y
  89. ; CHECK-NEXT: fadd double %x, %div
  90. ; CHECK-NEXT: ret double
  91. %div = fdiv double -1.234000e-01, %y
  92. %sub = fsub double %x, %div
  93. ret double %sub
  94. }
  95. ; Don't modify (-0.1234 / y - x)
  96. define double @test10(double %x, double %y) {
  97. ; CHECK-LABEL: @test10
  98. ; CHECK-NEXT: fdiv double -1.234000e-01, %y
  99. ; CHECK-NEXT: fsub double %div, %x
  100. ; CHECK-NEXT: ret double %sub
  101. %div = fdiv double -1.234000e-01, %y
  102. %sub = fsub double %div, %x
  103. ret double %sub
  104. }
  105. ; Canonicalize (-0.1234 / y + x) -> (x - 0.1234 / y)
  106. define double @test11(double %x, double %y) {
  107. ; CHECK-LABEL: @test11
  108. ; CHECK-NEXT: fdiv double 1.234000e-01, %y
  109. ; CHECK-NEXT: fsub double %x, %div
  110. ; CHECK-NEXT: ret double %add
  111. %div = fdiv double -1.234000e-01, %y
  112. %add = fadd double %div, %x
  113. ret double %add
  114. }
  115. ; Canonicalize (y / -0.1234 + x) -> (x - y / 0.1234)
  116. define double @test12(double %x, double %y) {
  117. ; CHECK-LABEL: @test12
  118. ; CHECK-NEXT: fdiv double %y, 1.234000e-01
  119. ; CHECK-NEXT: fsub double %x, %div
  120. ; CHECK-NEXT: ret double %add
  121. %div = fdiv double %y, -1.234000e-01
  122. %add = fadd double %div, %x
  123. ret double %add
  124. }
  125. ; Don't create an NSW violation
  126. define i4 @test13(i4 %x) {
  127. ; CHECK-LABEL: @test13
  128. ; CHECK-NEXT: %[[mul:.*]] = mul nsw i4 %x, -2
  129. ; CHECK-NEXT: %[[add:.*]] = add i4 %[[mul]], 3
  130. %mul = mul nsw i4 %x, -2
  131. %add = add i4 %mul, 3
  132. ret i4 %add
  133. }