1 ; RUN: opt -reassociate -gvn -S < %s | FileCheck %s
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
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
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
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