fast-SubReassociate.ll 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. ; RUN: opt < %s -reassociate -constprop -instcombine -S | FileCheck %s
  2. define float @test1(float %A, float %B) {
  3. ; CHECK-LABEL: test1
  4. ; CHECK-NEXT: %W = fadd float %B, 5.000000e+00
  5. ; CHECK-NEXT: %X = fadd float %A, -7.000000e+00
  6. ; CHECK-NEXT: %Y = fsub float %X, %W
  7. ; CHECK-NEXT: %Z = fadd float %Y, 1.200000e+01
  8. ; CHECK-NEXT: ret float %Z
  9. %W = fadd float 5.0, %B
  10. %X = fadd float -7.0, %A
  11. %Y = fsub float %X, %W
  12. %Z = fadd float %Y, 12.0
  13. ret float %Z
  14. }
  15. ; With sub reassociation, constant folding can eliminate all of the constants.
  16. define float @test2(float %A, float %B) {
  17. ; CHECK-LABEL: test2
  18. ; CHECK-NEXT: %Z = fsub fast float %A, %B
  19. ; CHECK-NEXT: ret float %Z
  20. %W = fadd fast float %B, 5.000000e+00
  21. %X = fadd fast float %A, -7.000000e+00
  22. %Y = fsub fast float %X, %W
  23. %Z = fadd fast float %Y, 1.200000e+01
  24. ret float %Z
  25. }
  26. define float @test3(float %A, float %B, float %C, float %D) {
  27. ; CHECK-LABEL: test3
  28. ; CHECK-NEXT: %M = fadd float %A, 1.200000e+01
  29. ; CHECK-NEXT: %N = fadd float %M, %B
  30. ; CHECK-NEXT: %O = fadd float %N, %C
  31. ; CHECK-NEXT: %P = fsub float %D, %O
  32. ; CHECK-NEXT: %Q = fadd float %P, 1.200000e+01
  33. ; CHECK-NEXT: ret float %Q
  34. %M = fadd float %A, 1.200000e+01
  35. %N = fadd float %M, %B
  36. %O = fadd float %N, %C
  37. %P = fsub float %D, %O
  38. %Q = fadd float %P, 1.200000e+01
  39. ret float %Q
  40. }
  41. ; With sub reassociation, constant folding can eliminate the two 12 constants.
  42. define float @test4(float %A, float %B, float %C, float %D) {
  43. ; CHECK-LABEL: test4
  44. ; CHECK-NEXT: %B.neg = fsub fast float -0.000000e+00, %B
  45. ; CHECK-NEXT: %O.neg = fsub fast float %B.neg, %A
  46. ; CHECK-NEXT: %P = fsub fast float %O.neg, %C
  47. ; CHECK-NEXT: %Q = fadd fast float %P, %D
  48. ; CHECK-NEXT: ret float %Q
  49. ; FIXME: InstCombine should be able to get us to the following:
  50. ; %sum = fadd fast float %B, %A
  51. ; %sum1 = fadd fast float %sum, %C
  52. ; %Q = fsub fast float %D, %sum1
  53. ; ret i32 %Q
  54. %M = fadd fast float 1.200000e+01, %A
  55. %N = fadd fast float %M, %B
  56. %O = fadd fast float %N, %C
  57. %P = fsub fast float %D, %O
  58. %Q = fadd fast float 1.200000e+01, %P
  59. ret float %Q
  60. }