xref: /llvm-project/llvm/test/Transforms/InstCombine/fsqrtdiv-transform.ll (revision 3b3590aa59f6ba35c746c01c0692621494b62cab)
1*3b3590aaSSushant Gokhale; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2*3b3590aaSSushant Gokhale; RUN: opt -S -passes='instcombine<no-verify-fixpoint>' < %s | FileCheck %s
3*3b3590aaSSushant Gokhale
4*3b3590aaSSushant Gokhale@x = global double 0.000000e+00
5*3b3590aaSSushant Gokhale@r1 = global double 0.000000e+00
6*3b3590aaSSushant Gokhale@r2 = global double 0.000000e+00
7*3b3590aaSSushant Gokhale@r3 = global double 0.000000e+00
8*3b3590aaSSushant Gokhale@v = global [2 x double] zeroinitializer
9*3b3590aaSSushant Gokhale@v1 = global [2 x double] zeroinitializer
10*3b3590aaSSushant Gokhale@v2 = global [2 x double] zeroinitializer
11*3b3590aaSSushant Gokhale
12*3b3590aaSSushant Gokhale; div/mul/div1 in the same block.
13*3b3590aaSSushant Gokhaledefine void @bb_constraint_case1(double %a) {
14*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case1(
15*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
16*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
17*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
18*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
19*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]
20*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
21*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
22*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
23*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
24*3b3590aaSSushant Gokhale;
25*3b3590aaSSushant Gokhaleentry:
26*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
27*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
28*3b3590aaSSushant Gokhale  store double %div, ptr @x
29*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
30*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
31*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
32*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
33*3b3590aaSSushant Gokhale  ret void
34*3b3590aaSSushant Gokhale}
35*3b3590aaSSushant Gokhale
36*3b3590aaSSushant Gokhale; div/mul in one block and div1 in other block with conditional guard.
37*3b3590aaSSushant Gokhaledefine void @bb_constraint_case2(double %a, i32 %d) {
38*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case2(
39*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {
40*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
41*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
42*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
43*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]
44*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
45*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
46*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[D_NOT:%.*]] = icmp eq i32 [[D]], 0
47*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
48*3b3590aaSSushant Gokhale; CHECK:       if.then:
49*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
50*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
51*3b3590aaSSushant Gokhale; CHECK:       if.end:
52*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
53*3b3590aaSSushant Gokhale;
54*3b3590aaSSushant Gokhaleentry:
55*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
56*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
57*3b3590aaSSushant Gokhale  store double %div, ptr @x
58*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
59*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
60*3b3590aaSSushant Gokhale  %d.not = icmp eq i32 %d, 0
61*3b3590aaSSushant Gokhale  br i1 %d.not, label %if.end, label %if.then
62*3b3590aaSSushant Gokhale
63*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
64*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
65*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
66*3b3590aaSSushant Gokhale  br label %if.end
67*3b3590aaSSushant Gokhale
68*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.then, %entry
69*3b3590aaSSushant Gokhale  ret void
70*3b3590aaSSushant Gokhale}
71*3b3590aaSSushant Gokhale
72*3b3590aaSSushant Gokhale; div in one block. mul/div1 in other block and conditionally guarded. Don't optimize.
73*3b3590aaSSushant Gokhaledefine void @bb_constraint_case3(double %a, i32 %d) {
74*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case3(
75*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {
76*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
77*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
78*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
79*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
80*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[D_NOT:%.*]] = icmp eq i32 [[D]], 0
81*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[D_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
82*3b3590aaSSushant Gokhale; CHECK:       if.then:
83*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
84*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
85*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
86*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
87*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
88*3b3590aaSSushant Gokhale; CHECK:       if.end:
89*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
90*3b3590aaSSushant Gokhale;
91*3b3590aaSSushant Gokhaleentry:
92*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
93*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
94*3b3590aaSSushant Gokhale  store double %div, ptr @x
95*3b3590aaSSushant Gokhale  %d.not = icmp eq i32 %d, 0
96*3b3590aaSSushant Gokhale  br i1 %d.not, label %if.end, label %if.then
97*3b3590aaSSushant Gokhale
98*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
99*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
100*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
101*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
102*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
103*3b3590aaSSushant Gokhale  br label %if.end
104*3b3590aaSSushant Gokhale
105*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.then, %entry
106*3b3590aaSSushant Gokhale  ret void
107*3b3590aaSSushant Gokhale}
108*3b3590aaSSushant Gokhale
109*3b3590aaSSushant Gokhale; div in one block. mul/div1 each in different block and conditionally guarded. Don't optimize.
110*3b3590aaSSushant Gokhaledefine void @bb_constraint_case4(double %a, i32 %c, i32 %d) {
111*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case4(
112*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) {
113*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
114*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
115*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
116*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
117*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i32 [[C]], 0
118*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[C_NOT]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]
119*3b3590aaSSushant Gokhale; CHECK:       if.then:
120*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
121*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
122*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
123*3b3590aaSSushant Gokhale; CHECK:       if.end:
124*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[D_NOT:%.*]] = icmp eq i32 [[D]], 0
125*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[D_NOT]], label [[IF_END1:%.*]], label [[IF_THEN1:%.*]]
126*3b3590aaSSushant Gokhale; CHECK:       if.then1:
127*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
128*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
129*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END1]]
130*3b3590aaSSushant Gokhale; CHECK:       if.end1:
131*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
132*3b3590aaSSushant Gokhale;
133*3b3590aaSSushant Gokhaleentry:
134*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
135*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
136*3b3590aaSSushant Gokhale  store double %div, ptr @x
137*3b3590aaSSushant Gokhale  %c.not = icmp eq i32 %c, 0
138*3b3590aaSSushant Gokhale  br i1 %c.not, label %if.end, label %if.then
139*3b3590aaSSushant Gokhale
140*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
141*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
142*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
143*3b3590aaSSushant Gokhale  br label %if.end
144*3b3590aaSSushant Gokhale
145*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.then, %entry
146*3b3590aaSSushant Gokhale  %d.not = icmp eq i32 %d, 0
147*3b3590aaSSushant Gokhale  br i1 %d.not, label %if.end1, label %if.then1
148*3b3590aaSSushant Gokhale
149*3b3590aaSSushant Gokhaleif.then1:                                         ; preds = %if.end
150*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
151*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
152*3b3590aaSSushant Gokhale  br label %if.end1
153*3b3590aaSSushant Gokhale
154*3b3590aaSSushant Gokhaleif.end1:                                          ; preds = %if.then1, %if.end
155*3b3590aaSSushant Gokhale  ret void
156*3b3590aaSSushant Gokhale}
157*3b3590aaSSushant Gokhale
158*3b3590aaSSushant Gokhale; sqrt value comes from different blocks. Don't optimize.
159*3b3590aaSSushant Gokhaledefine void @bb_constraint_case5(double %a, i32 %c) {
160*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case5(
161*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {
162*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
163*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i32 [[C]], 0
164*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
165*3b3590aaSSushant Gokhale; CHECK:       if.then:
166*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
167*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END:%.*]]
168*3b3590aaSSushant Gokhale; CHECK:       if.else:
169*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[ADD:%.*]] = fadd double [[A]], 1.000000e+01
170*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[ADD]])
171*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
172*3b3590aaSSushant Gokhale; CHECK:       if.end:
173*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = phi double [ [[TMP0]], [[IF_THEN]] ], [ [[TMP1]], [[IF_ELSE]] ]
174*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
175*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
176*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
177*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
178*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
179*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
180*3b3590aaSSushant Gokhale;
181*3b3590aaSSushant Gokhaleentry:
182*3b3590aaSSushant Gokhale  %c.not = icmp eq i32 %c, 0
183*3b3590aaSSushant Gokhale  br i1 %c.not, label %if.else, label %if.then
184*3b3590aaSSushant Gokhale
185*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
186*3b3590aaSSushant Gokhale  %0 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
187*3b3590aaSSushant Gokhale  br label %if.end
188*3b3590aaSSushant Gokhale
189*3b3590aaSSushant Gokhaleif.else:                                          ; preds = %entry
190*3b3590aaSSushant Gokhale  %add = fadd double %a, 1.000000e+01
191*3b3590aaSSushant Gokhale  %1 = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %add)
192*3b3590aaSSushant Gokhale  br label %if.end
193*3b3590aaSSushant Gokhale
194*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.else, %if.then
195*3b3590aaSSushant Gokhale  %sqrt = phi double[ %0, %if.then], [ %1, %if.else]
196*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
197*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
198*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
199*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
200*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
201*3b3590aaSSushant Gokhale  ret void
202*3b3590aaSSushant Gokhale}
203*3b3590aaSSushant Gokhale
204*3b3590aaSSushant Gokhale; div in one block and conditionally guarded. mul/div1 in other block. Don't optimize.
205*3b3590aaSSushant Gokhaledefine void @bb_constraint_case6(double %a, i32 %d) {
206*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case6(
207*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[D:%.*]]) {
208*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
209*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
210*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[D_NOT:%.*]] = icmp eq i32 [[D]], 0
211*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[D_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
212*3b3590aaSSushant Gokhale; CHECK:       if.else:
213*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = load double, ptr @x, align 8
214*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END:%.*]]
215*3b3590aaSSushant Gokhale; CHECK:       if.then:
216*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
217*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP1]], ptr @x, align 8
218*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
219*3b3590aaSSushant Gokhale; CHECK:       if.end:
220*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = phi double [ [[TMP0]], [[IF_ELSE]] ], [ [[TMP1]], [[IF_THEN]] ]
221*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
222*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
223*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
224*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
225*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
226*3b3590aaSSushant Gokhale;
227*3b3590aaSSushant Gokhaleentry:
228*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
229*3b3590aaSSushant Gokhale  %d.not = icmp eq i32 %d, 0
230*3b3590aaSSushant Gokhale  br i1 %d.not, label %if.else, label %if.then
231*3b3590aaSSushant Gokhale
232*3b3590aaSSushant Gokhaleif.else:                                          ; preds = %entry
233*3b3590aaSSushant Gokhale  %1 = load double, ptr @x
234*3b3590aaSSushant Gokhale  br label %if.end
235*3b3590aaSSushant Gokhale
236*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
237*3b3590aaSSushant Gokhale  %2 = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
238*3b3590aaSSushant Gokhale  store double %2, ptr @x
239*3b3590aaSSushant Gokhale  br label %if.end
240*3b3590aaSSushant Gokhale
241*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.else, %if.then
242*3b3590aaSSushant Gokhale  %div = phi double [ %1, %if.else ], [ %2, %if.then ]
243*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
244*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
245*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
246*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
247*3b3590aaSSushant Gokhale  ret void
248*3b3590aaSSushant Gokhale}
249*3b3590aaSSushant Gokhale
250*3b3590aaSSushant Gokhale; value for mul comes from different blocks. Don't optimize.
251*3b3590aaSSushant Gokhaledefine void @bb_constraint_case7(double %a, i32 %c, i32 %d) {
252*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case7(
253*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]], i32 [[D:%.*]]) {
254*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
255*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
256*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
257*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
258*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i32 [[C]], 0
259*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[C_NOT]], label [[IF_ELSE:%.*]], label [[IF_THEN:%.*]]
260*3b3590aaSSushant Gokhale; CHECK:       if.then:
261*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv double 3.000000e+00, [[A]]
262*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END:%.*]]
263*3b3590aaSSushant Gokhale; CHECK:       if.else:
264*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[D_NOT:%.*]] = icmp eq i32 [[D]], 0
265*3b3590aaSSushant Gokhale; CHECK-NEXT:    br i1 [[D_NOT]], label [[IF_ELSE1:%.*]], label [[IF_THEN1:%.*]]
266*3b3590aaSSushant Gokhale; CHECK:       if.then1:
267*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = fdiv double 2.000000e+00, [[A]]
268*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
269*3b3590aaSSushant Gokhale; CHECK:       if.else1:
270*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP2:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
271*3b3590aaSSushant Gokhale; CHECK-NEXT:    br label [[IF_END]]
272*3b3590aaSSushant Gokhale; CHECK:       if.end:
273*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = phi double [ [[TMP1]], [[IF_THEN1]] ], [ [[TMP2]], [[IF_ELSE1]] ], [ [[TMP0]], [[IF_THEN]] ]
274*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
275*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
276*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
277*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
278*3b3590aaSSushant Gokhale;
279*3b3590aaSSushant Gokhaleentry:
280*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
281*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
282*3b3590aaSSushant Gokhale  store double %div, ptr @x
283*3b3590aaSSushant Gokhale  %c.not = icmp eq i32 %c, 0
284*3b3590aaSSushant Gokhale  br i1 %c.not, label %if.else, label %if.then
285*3b3590aaSSushant Gokhale
286*3b3590aaSSushant Gokhaleif.then:                                          ; preds = %entry
287*3b3590aaSSushant Gokhale  %1 = fdiv double 3.000000e+00, %a
288*3b3590aaSSushant Gokhale  br label %if.end
289*3b3590aaSSushant Gokhale
290*3b3590aaSSushant Gokhaleif.else:                                          ; preds = %entry
291*3b3590aaSSushant Gokhale  %d.not = icmp eq i32 %d, 0
292*3b3590aaSSushant Gokhale  br i1 %d.not, label %if.else1, label %if.then1
293*3b3590aaSSushant Gokhale
294*3b3590aaSSushant Gokhaleif.then1:                                         ; preds = %if.else
295*3b3590aaSSushant Gokhale  %2 = fdiv double 2.000000e+00, %a
296*3b3590aaSSushant Gokhale  br label %if.end
297*3b3590aaSSushant Gokhale
298*3b3590aaSSushant Gokhaleif.else1:                                         ; preds = %if.else
299*3b3590aaSSushant Gokhale  %3 = fmul reassoc double %div, %div
300*3b3590aaSSushant Gokhale  br label %if.end
301*3b3590aaSSushant Gokhale
302*3b3590aaSSushant Gokhaleif.end:                                           ; preds = %if.then1, %if.else1, %if.then
303*3b3590aaSSushant Gokhale  %mul = phi double [ %2, %if.then1 ], [ %3, %if.else1 ], [ %1, %if.then ]
304*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
305*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
306*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
307*3b3590aaSSushant Gokhale  ret void
308*3b3590aaSSushant Gokhale}
309*3b3590aaSSushant Gokhale
310*3b3590aaSSushant Gokhale; value of mul  comes from two different blocks(as shown by select ins).
311*3b3590aaSSushant Gokhaledefine void @bb_constraint_case8(double %a, i32 %c) {
312*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @bb_constraint_case8(
313*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {
314*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
315*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
316*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
317*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]
318*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
319*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i32 [[C]], 0
320*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = fmul double [[A]], [[A]]
321*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP0]]
322*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
323*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
324*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
325*3b3590aaSSushant Gokhale;
326*3b3590aaSSushant Gokhaleentry:
327*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
328*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
329*3b3590aaSSushant Gokhale  store double %div, ptr @x
330*3b3590aaSSushant Gokhale  %c.not = icmp eq i32 %c, 0
331*3b3590aaSSushant Gokhale  %1 = fmul double %a, %a
332*3b3590aaSSushant Gokhale  %2 = fmul reassoc double %div, %div
333*3b3590aaSSushant Gokhale  %mul = select i1 %c.not, double %1, double %2
334*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
335*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
336*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
337*3b3590aaSSushant Gokhale  ret void
338*3b3590aaSSushant Gokhale}
339*3b3590aaSSushant Gokhale
340*3b3590aaSSushant Gokhale; multiple instances of multiply ops to optimize. Optimize all.
341*3b3590aaSSushant Gokhaledefine void @mutiple_multiply_instances(double %a, i32 %c) {
342*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @mutiple_multiply_instances(
343*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]], i32 [[C:%.*]]) {
344*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
345*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
346*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
347*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP1]], [[SQRT1]]
348*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
349*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[C_NOT:%.*]] = icmp eq i32 [[C]], 0
350*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP2:%.*]] = fmul double [[A]], [[A]]
351*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP3:%.*]] = fmul double [[A]], [[A]]
352*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL1:%.*]] = select i1 [[C_NOT]], double [[TMP2]], double [[TMP1]]
353*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL2:%.*]] = select i1 [[C_NOT]], double [[TMP1]], double [[TMP3]]
354*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL1]], ptr @r1, align 8
355*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL2]], ptr @r3, align 8
356*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
357*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
358*3b3590aaSSushant Gokhale;
359*3b3590aaSSushant Gokhaleentry:
360*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
361*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
362*3b3590aaSSushant Gokhale  store double %div, ptr @x
363*3b3590aaSSushant Gokhale  %c.not = icmp eq i32 %c, 0
364*3b3590aaSSushant Gokhale  %1 = fmul double %a, %a
365*3b3590aaSSushant Gokhale  %2 = fmul double %a, %a
366*3b3590aaSSushant Gokhale  %3 = fmul reassoc double %div, %div
367*3b3590aaSSushant Gokhale  %4 = fmul reassoc double %div, %div
368*3b3590aaSSushant Gokhale  %mul1 = select i1 %c.not, double %1, double %3
369*3b3590aaSSushant Gokhale  %mul2 = select i1 %c.not, double %4, double %2
370*3b3590aaSSushant Gokhale  store double %mul1, ptr @r1
371*3b3590aaSSushant Gokhale  store double %mul2, ptr @r3
372*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
373*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
374*3b3590aaSSushant Gokhale  ret void
375*3b3590aaSSushant Gokhale}
376*3b3590aaSSushant Gokhale
377*3b3590aaSSushant Gokhale; missing flags for optimization.
378*3b3590aaSSushant Gokhaledefine void @missing_arcp_flag_on_div(double %a) {
379*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_arcp_flag_on_div(
380*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
381*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
382*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
383*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf double 1.000000e+00, [[SQRT]]
384*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
385*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
386*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
387*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
388*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
389*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
390*3b3590aaSSushant Gokhale;
391*3b3590aaSSushant Gokhaleentry:
392*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
393*3b3590aaSSushant Gokhale  %div = fdiv reassoc ninf double 1.000000e+00, %sqrt
394*3b3590aaSSushant Gokhale  store double %div, ptr @x
395*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
396*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
397*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
398*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
399*3b3590aaSSushant Gokhale  ret void
400*3b3590aaSSushant Gokhale}
401*3b3590aaSSushant Gokhale
402*3b3590aaSSushant Gokhale; missing flags for optimization.
403*3b3590aaSSushant Gokhaledefine void @missing_reassoc_flag_on_mul(double %a) {
404*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_reassoc_flag_on_mul(
405*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
406*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
407*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
408*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
409*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
410*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul double [[DIV]], [[DIV]]
411*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
412*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[A]], [[SQRT]]
413*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
414*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
415*3b3590aaSSushant Gokhale;
416*3b3590aaSSushant Gokhaleentry:
417*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
418*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
419*3b3590aaSSushant Gokhale  store double %div, ptr @x
420*3b3590aaSSushant Gokhale  %mul = fmul double %div, %div
421*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
422*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
423*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
424*3b3590aaSSushant Gokhale  ret void
425*3b3590aaSSushant Gokhale}
426*3b3590aaSSushant Gokhale
427*3b3590aaSSushant Gokhale; missing flags for optimization.
428*3b3590aaSSushant Gokhaledefine void @missing_reassoc_flag_on_div1(double %a) {
429*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @missing_reassoc_flag_on_div1(
430*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
431*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
432*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc nnan ninf nsz double @llvm.sqrt.f64(double [[A]])
433*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc ninf arcp double 1.000000e+00, [[SQRT]]
434*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
435*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = fmul reassoc double [[DIV]], [[DIV]]
436*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
437*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV1:%.*]] = fdiv double [[A]], [[SQRT]]
438*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV1]], ptr @r2, align 8
439*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
440*3b3590aaSSushant Gokhale;
441*3b3590aaSSushant Gokhaleentry:
442*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
443*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
444*3b3590aaSSushant Gokhale  store double %div, ptr @x
445*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
446*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
447*3b3590aaSSushant Gokhale  %div1 = fdiv double %a, %sqrt
448*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
449*3b3590aaSSushant Gokhale  ret void
450*3b3590aaSSushant Gokhale}
451*3b3590aaSSushant Gokhale
452*3b3590aaSSushant Gokhale; div = -1/sqrt(a)
453*3b3590aaSSushant Gokhaledefine void @negative_fdiv_val(double %a) {
454*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @negative_fdiv_val(
455*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
456*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
457*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
458*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
459*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP1:%.*]] = fneg reassoc double [[SQRT1]]
460*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[TMP1]]
461*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
462*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
463*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
464*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
465*3b3590aaSSushant Gokhale;
466*3b3590aaSSushant Gokhaleentry:
467*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
468*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double -1.000000e+00, %sqrt
469*3b3590aaSSushant Gokhale  store double %div, ptr @x
470*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
471*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
472*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
473*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
474*3b3590aaSSushant Gokhale  ret void
475*3b3590aaSSushant Gokhale}
476*3b3590aaSSushant Gokhale
477*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_div1(double %a) {
478*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_div1(
479*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
480*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
481*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0:![0-9]+]]
482*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
483*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]
484*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
485*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
486*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
487*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
488*3b3590aaSSushant Gokhale;
489*3b3590aaSSushant Gokhaleentry:
490*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
491*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
492*3b3590aaSSushant Gokhale  store double %div, ptr @x
493*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
494*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
495*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3
496*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
497*3b3590aaSSushant Gokhale  ret void
498*3b3590aaSSushant Gokhale}
499*3b3590aaSSushant Gokhale
500*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_mul(double %a) {
501*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_mul(
502*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
503*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
504*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
505*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1:![0-9]+]]
506*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]]
507*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
508*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
509*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
510*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
511*3b3590aaSSushant Gokhale;
512*3b3590aaSSushant Gokhaleentry:
513*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
514*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt
515*3b3590aaSSushant Gokhale  store double %div, ptr @x
516*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div, !fpmath !2
517*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
518*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
519*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
520*3b3590aaSSushant Gokhale  ret void
521*3b3590aaSSushant Gokhale}
522*3b3590aaSSushant Gokhale
523*3b3590aaSSushant Gokhale; FIXME: DIV in the result should get the fpmath metadata from %div.
524*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_div(double %a) {
525*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_div(
526*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
527*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
528*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]])
529*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]]
530*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2:![0-9]+]]
531*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
532*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
533*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
534*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
535*3b3590aaSSushant Gokhale;
536*3b3590aaSSushant Gokhaleentry:
537*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a)
538*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1
539*3b3590aaSSushant Gokhale  store double %div, ptr @x
540*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div
541*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
542*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt
543*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
544*3b3590aaSSushant Gokhale  ret void
545*3b3590aaSSushant Gokhale}
546*3b3590aaSSushant Gokhale
547*3b3590aaSSushant Gokhaledefine void @fpmath_metadata_on_all(double %a) {
548*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @fpmath_metadata_on_all(
549*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
550*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
551*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc double @llvm.sqrt.f64(double [[A]]), !fpmath [[META0]]
552*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double 1.000000e+00, [[A]], !fpmath [[META1]]
553*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc double [[TMP0]], [[SQRT1]], !fpmath [[META2]]
554*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
555*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[TMP0]], ptr @r1, align 8
556*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[SQRT1]], ptr @r2, align 8
557*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
558*3b3590aaSSushant Gokhale;
559*3b3590aaSSushant Gokhaleentry:
560*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf double @llvm.sqrt.f64(double %a), !fpmath !0
561*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf double 1.000000e+00, %sqrt, !fpmath !1
562*3b3590aaSSushant Gokhale  store double %div, ptr @x
563*3b3590aaSSushant Gokhale  %mul = fmul reassoc double %div, %div, !fpmath !2
564*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
565*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc double %a, %sqrt, !fpmath !3
566*3b3590aaSSushant Gokhale  store double %div1, ptr @r2
567*3b3590aaSSushant Gokhale  ret void
568*3b3590aaSSushant Gokhale}
569*3b3590aaSSushant Gokhale
570*3b3590aaSSushant Gokhaledefine void @vector_input(<2 x double> %a) {
571*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @vector_input(
572*3b3590aaSSushant Gokhale; CHECK-SAME: <2 x double> [[A:%.*]]) {
573*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
574*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[SQRT1:%.*]] = call reassoc <2 x double> @llvm.sqrt.v2f64(<2 x double> [[A]])
575*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc <2 x double> splat (double 1.000000e+00), [[A]]
576*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = fmul reassoc <2 x double> [[TMP0]], [[SQRT1]]
577*3b3590aaSSushant Gokhale; CHECK-NEXT:    store <2 x double> [[DIV]], ptr @v, align 16
578*3b3590aaSSushant Gokhale; CHECK-NEXT:    store <2 x double> [[TMP0]], ptr @v1, align 16
579*3b3590aaSSushant Gokhale; CHECK-NEXT:    store <2 x double> [[SQRT1]], ptr @v2, align 16
580*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
581*3b3590aaSSushant Gokhale;
582*3b3590aaSSushant Gokhaleentry:
583*3b3590aaSSushant Gokhale  %sqrt = call reassoc nnan nsz ninf <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
584*3b3590aaSSushant Gokhale  %div = fdiv reassoc arcp ninf <2 x double><double 1.000000e+00, double 1.000000e+00>, %sqrt
585*3b3590aaSSushant Gokhale  store <2 x double> %div, ptr @v
586*3b3590aaSSushant Gokhale  %mul = fmul reassoc <2 x double> %div, %div
587*3b3590aaSSushant Gokhale  store <2 x double> %mul, ptr @v1
588*3b3590aaSSushant Gokhale  %div1 = fdiv reassoc <2 x double> %a, %sqrt
589*3b3590aaSSushant Gokhale  store <2 x double> %div1, ptr @v2
590*3b3590aaSSushant Gokhale  ret void
591*3b3590aaSSushant Gokhale}
592*3b3590aaSSushant Gokhale
593*3b3590aaSSushant Gokhaledefine void @strict_fp_metadata(double %a) {
594*3b3590aaSSushant Gokhale; CHECK-LABEL: define void @strict_fp_metadata(
595*3b3590aaSSushant Gokhale; CHECK-SAME: double [[A:%.*]]) {
596*3b3590aaSSushant Gokhale; CHECK-NEXT:  entry:
597*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[CONV:%.*]] = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict")
598*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[CALL:%.*]] = call double @llvm.sqrt.f64(double noundef [[A]])
599*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[CONV]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict")
600*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV]], ptr @x, align 8
601*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[MUL:%.*]] = call double @llvm.experimental.constrained.fmul.f64(double [[DIV]], double [[DIV]], metadata !"round.dynamic", metadata !"fpexcept.strict")
602*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[MUL]], ptr @r1, align 8
603*3b3590aaSSushant Gokhale; CHECK-NEXT:    [[DIV2:%.*]] = call double @llvm.experimental.constrained.fdiv.f64(double [[A]], double [[CALL]], metadata !"round.dynamic", metadata !"fpexcept.strict")
604*3b3590aaSSushant Gokhale; CHECK-NEXT:    store double [[DIV2]], ptr @r2, align 8
605*3b3590aaSSushant Gokhale; CHECK-NEXT:    ret void
606*3b3590aaSSushant Gokhale;
607*3b3590aaSSushant Gokhaleentry:
608*3b3590aaSSushant Gokhale  %conv = call double @llvm.experimental.constrained.sitofp.f64.i32(i32 1, metadata !"round.dynamic", metadata !"fpexcept.strict")
609*3b3590aaSSushant Gokhale  %call = call double @llvm.sqrt.f64(double noundef %a)
610*3b3590aaSSushant Gokhale  %div = call double @llvm.experimental.constrained.fdiv.f64(double %conv, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict")
611*3b3590aaSSushant Gokhale  store double %div, ptr @x
612*3b3590aaSSushant Gokhale  %mul = call double @llvm.experimental.constrained.fmul.f64(double %div, double %div, metadata !"round.dynamic", metadata !"fpexcept.strict")
613*3b3590aaSSushant Gokhale  store double %mul, ptr @r1
614*3b3590aaSSushant Gokhale  %div2 = call double @llvm.experimental.constrained.fdiv.f64(double %a, double %call, metadata !"round.dynamic", metadata !"fpexcept.strict")
615*3b3590aaSSushant Gokhale  store double %div2, ptr @r2
616*3b3590aaSSushant Gokhale  ret void
617*3b3590aaSSushant Gokhale}
618*3b3590aaSSushant Gokhale
619*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.sitofp.f64.i32(i32, metadata, metadata)
620*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.fdiv.f64(double, double, metadata, metadata)
621*3b3590aaSSushant Gokhaledeclare double @llvm.experimental.constrained.fmul.f64(double, double, metadata, metadata)
622*3b3590aaSSushant Gokhaledeclare double @llvm.sqrt.f64(double)
623*3b3590aaSSushant Gokhaledeclare <2 x double> @llvm.sqrt.v2f64(<2 x double>)
624*3b3590aaSSushant Gokhale
625*3b3590aaSSushant Gokhale!0 = !{float 2.5}
626*3b3590aaSSushant Gokhale!1 = !{float 3.5}
627*3b3590aaSSushant Gokhale!2 = !{float 4.5}
628*3b3590aaSSushant Gokhale!3 = !{float 5.5}
629*3b3590aaSSushant Gokhale; CHECK: [[META0]] = !{float 5.500000e+00}
630*3b3590aaSSushant Gokhale; CHECK: [[META1]] = !{float 4.500000e+00}
631*3b3590aaSSushant Gokhale; CHECK: [[META2]] = !{float 3.500000e+00}
632