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
define double @test1(double %x, double %y) {
6
; CHECK-NEXT: fmul double %y, 1.234000e-01
7
; CHECK-NEXT: fadd double %x, %mul
8
; CHECK-NEXT: fsub double %x, %mul
9
; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
10
; CHECK-NEXT: ret double %mul
12
%mul = fmul double 1.234000e-01, %y
13
%add = fadd double %mul, %x
14
%mul1 = fmul double -1.234000e-01, %y
15
%add2 = fadd double %mul1, %x
16
%mul3 = fmul double %add, %add2
20
; (x + -0.1234 * y) * (x + -0.1234 * y) -> (x - 0.1234 * y) * (x - 0.1234 * y)
21
define double @test2(double %x, double %y) {
23
; CHECK-NEXT: fmul double %y, 1.234000e-01
24
; CHECK-NEXT: fsub double %x, %mul
25
; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
26
; CHECK-NEXT: ret double %mul
28
%mul = fmul double %y, -1.234000e-01
29
%add = fadd double %mul, %x
30
%mul1 = fmul double %y, -1.234000e-01
31
%add2 = fadd double %mul1, %x
32
%mul3 = fmul double %add, %add2
36
; (x + 0.1234 * y) * (x - -0.1234 * y) -> (x + 0.1234 * y) * (x + 0.1234 * y)
37
define double @test3(double %x, double %y) {
39
; CHECK-NEXT: fmul double %y, 1.234000e-01
40
; CHECK-NEXT: fadd double %x, %mul
41
; CHECK-NEXT: fmul double %add{{.*}}, %add{{.*}}
42
; CHECK-NEXT: ret double
44
%mul = fmul double %y, 1.234000e-01
45
%add = fadd double %mul, %x
46
%mul1 = fmul double %y, -1.234000e-01
47
%add2 = fsub double %x, %mul1
48
%mul3 = fmul double %add, %add2
52
; Canonicalize (x - -0.1234 * y)
53
define double @test5(double %x, double %y) {
55
; CHECK-NEXT: fmul double %y, 1.234000e-01
56
; CHECK-NEXT: fadd double %x, %mul
57
; CHECK-NEXT: ret double
59
%mul = fmul double -1.234000e-01, %y
60
%sub = fsub double %x, %mul
64
; Don't modify (-0.1234 * y - x)
65
define double @test6(double %x, double %y) {
67
; CHECK-NEXT: fmul double %y, -1.234000e-01
68
; CHECK-NEXT: fsub double %mul, %x
69
; CHECK-NEXT: ret double %sub
71
%mul = fmul double -1.234000e-01, %y
72
%sub = fsub double %mul, %x
76
; Canonicalize (-0.1234 * y + x) -> (x - 0.1234 * y)
77
define double @test7(double %x, double %y) {
79
; CHECK-NEXT: fmul double %y, 1.234000e-01
80
; CHECK-NEXT: fsub double %x, %mul
81
; CHECK-NEXT: ret double %add
83
%mul = fmul double -1.234000e-01, %y
84
%add = fadd double %mul, %x
88
; Canonicalize (y * -0.1234 + x) -> (x - 0.1234 * y)
89
define double @test8(double %x, double %y) {
91
; CHECK-NEXT: fmul double %y, 1.234000e-01
92
; CHECK-NEXT: fsub double %x, %mul
93
; CHECK-NEXT: ret double %add
95
%mul = fmul double %y, -1.234000e-01
96
%add = fadd double %mul, %x
100
; Canonicalize (x - -0.1234 / y)
101
define double @test9(double %x, double %y) {
102
; CHECK-LABEL: @test9
103
; CHECK-NEXT: fdiv double 1.234000e-01, %y
104
; CHECK-NEXT: fadd double %x, %div
105
; CHECK-NEXT: ret double
107
%div = fdiv double -1.234000e-01, %y
108
%sub = fsub double %x, %div
112
; Don't modify (-0.1234 / y - x)
113
define double @test10(double %x, double %y) {
114
; CHECK-LABEL: @test10
115
; CHECK-NEXT: fdiv double -1.234000e-01, %y
116
; CHECK-NEXT: fsub double %div, %x
117
; CHECK-NEXT: ret double %sub
119
%div = fdiv double -1.234000e-01, %y
120
%sub = fsub double %div, %x
124
; Canonicalize (-0.1234 / y + x) -> (x - 0.1234 / y)
125
define double @test11(double %x, double %y) {
126
; CHECK-LABEL: @test11
127
; CHECK-NEXT: fdiv double 1.234000e-01, %y
128
; CHECK-NEXT: fsub double %x, %div
129
; CHECK-NEXT: ret double %add
131
%div = fdiv double -1.234000e-01, %y
132
%add = fadd double %div, %x
136
; Canonicalize (y / -0.1234 + x) -> (x - y / 0.1234)
137
define double @test12(double %x, double %y) {
138
; CHECK-LABEL: @test12
139
; CHECK-NEXT: fdiv double %y, 1.234000e-01
140
; CHECK-NEXT: fsub double %x, %div
141
; CHECK-NEXT: ret double %add
143
%div = fdiv double %y, -1.234000e-01
144
%add = fadd double %div, %x
148
; Don't create an NSW violation
149
define i4 @test13(i4 %x) {
150
; CHECK-LABEL: @test13
151
; CHECK-NEXT: %[[mul:.*]] = mul nsw i4 %x, -2
152
; CHECK-NEXT: %[[add:.*]] = add i4 %[[mul]], 3
153
%mul = mul nsw i4 %x, -2
154
%add = add i4 %mul, 3