Revert "[Reassociate] Canonicalize negative constants out of expressions."
[oota-llvm.git] / test / Transforms / Reassociate / liftsign.ll
1 ; RUN: opt -reassociate -gvn -S < %s | FileCheck %s
2
3 ; (x + 0.1234 * y) * (x + -0.1234 * y) -> (x + 0.1234 * y) * (x - 0.1234 * y)
4 ; so CSE can simplify it further
5 define double @lift_sign1(double %x, double %y) nounwind readnone ssp uwtable {
6 ; CHECK-LABEL: @lift_sign1(
7   %mul = fmul double 1.234000e-01, %y
8   %add = fadd double %mul, %x
9   %mul1 = fmul double -1.234000e-01, %y
10   %add2 = fadd double %mul1, %x
11   %mul3 = fmul double %add, %add2
12 ; CHECK-NOT: %mul1 = fmul double -1.234000e-01, %y
13 ; CHECK-NOT: %add2 = fadd %mul1, %x
14 ; CHECK: %add2.repl = fsub double %x, %mul
15 ; CHECK: %mul3 = fmul double %add, %add2
16 ret double %mul3
17 }
18
19 ; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)
20 ; GVN can then rewrite it even further
21 define double @lift_sign2(double %x, double %y) nounwind readnone ssp uwtable {
22 ; CHECK-LABEL: @lift_sign2(
23   %mul = fmul double %y, -1.234000e-01
24   %add = fadd double %mul, %x
25   %mul1 = fmul double %y, -1.234000e-01
26   %add2 = fadd double %mul1, %x
27   %mul3 = fmul double %add, %add2
28 ; CHECK-NOT: %mul = fmul double %y, -1.234000e-01
29 ; CHECK-NOT: %add = fadd double %mul, %x
30 ; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01
31 ; CHECK-NOT: %add2 = fadd double %mul1, %x
32 ; CHECK-NOT: %mul3 = fmul double %add, %add2
33 ; CHECK: %mul = fmul double 1.234000e-01, %y
34 ; CHECK: %add.repl = fsub double %x, %mul
35 ; CHECK: %mul3 = fmul double %add.repl, %add.repl
36   ret double %mul3
37 }
38
39 ; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)
40 define double @lift_sign3(double %x, double %y) nounwind readnone ssp uwtable {
41 ; CHECK-LABEL: @lift_sign3(
42   %mul = fmul double %y, 1.234000e-01
43   %add = fadd double %mul, %x
44   %mul1 = fmul double %y, -1.234000e-01
45   %add2 = fsub double %x, %mul1
46   %mul3 = fmul double %add, %add2
47 ; CHECK-NOT: %mul1 = fmul double %y, -1.234000e-01
48 ; CHECK-NOT: %add2 = fsub double %x, %mul1
49 ; CHECK-NOT: %mul3 = fmul double %add, %add2
50 ; CHECK: %mul3 = fmul double %add, %add
51   ret double %mul3
52 }
53
54 ; (x + 0.1234 / y) * (x + -0.1234 / y) -> (x + 0.1234 / y) * (x - 0.1234 / y)
55 ; so CSE can simplify it further
56 define double @lift_sign4(double %x, double %y) nounwind readnone ssp uwtable {
57 ; CHECK-LABEL: @lift_sign4(
58   %div = fdiv double 1.234000e-01, %y
59   %add = fadd double %div, %x
60   %div1 = fdiv double -1.234000e-01, %y
61   %add2 = fadd double %div1, %x
62   %mul3 = fmul double %add, %add2
63 ; CHECK-NOT: %div1 = fdiv double -1.234000e-01, %y
64 ; CHECK-NOT: %add2 = fadd double %div1, %x
65 ; CHECK-NOT: %mul3 = fmul double %add, %add2
66 ; CHECK: %add2.repl = fsub double %x, %div
67 ; CHECK: %mul3 = fmul double %add, %add2.repl
68   ret double %mul3
69 }