1 /*
2  * Copyright (c) 2016, Red Hat, Inc. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /**
25  * @test
26  * @bug 8171092
27  * @summary C1's Math.fma() intrinsic doesn't correctly marks its inputs
28  * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestFMABrokenC1RegAlloc
29  *
30  */
31 
32 public class TestFMABrokenC1RegAlloc {
33 
34     double dummy0;
35     double dummy1;
36     double dummy2;
37     double dummy3;
38     double dummy4;
39     double dummy5;
40     double dummy6;
41     double dummy7;
42     double dummy8;
43     double dummy9;
44     double dummy10;
45     double dummy11;
46     double dummy12;
47     double dummy13;
48     double dummy14;
49     double dummy15;
50     double dummy16;
51     double dummy17;
52     double dummy18;
53     double dummy19;
54     double dummy20;
55     double dummy21;
56     double dummy22;
57     double dummy23;
58     double dummy24;
59     double dummy25;
60     double dummy26;
61     double dummy27;
62     double dummy28;
63     double dummy29;
64     double dummy30;
65     double dummy31;
66     double dummy32;
67     double dummy33;
68     double dummy34;
69     double dummy35;
70     double dummy36;
71     double dummy37;
72     double dummy38;
73     double dummy39;
74 
test(double a, double b, double c)75     double test(double a, double b, double c) {
76         double dummy0 = this.dummy0;
77         double dummy1 = this.dummy1;
78         double dummy2 = this.dummy2;
79         double dummy3 = this.dummy3;
80         double dummy4 = this.dummy4;
81         double dummy5 = this.dummy5;
82         double dummy6 = this.dummy6;
83         double dummy7 = this.dummy7;
84         double dummy8 = this.dummy8;
85         double dummy9 = this.dummy9;
86         double dummy10 = this.dummy10;
87         double dummy11 = this.dummy11;
88         double dummy12 = this.dummy12;
89         double dummy13 = this.dummy13;
90         double dummy14 = this.dummy14;
91         double dummy15 = this.dummy15;
92         double dummy16 = this.dummy16;
93         double dummy17 = this.dummy17;
94         double dummy18 = this.dummy18;
95         double dummy19 = this.dummy19;
96         double dummy20 = this.dummy20;
97         double dummy21 = this.dummy21;
98         double dummy22 = this.dummy22;
99         double dummy23 = this.dummy23;
100         double dummy24 = this.dummy24;
101         double dummy25 = this.dummy25;
102         double dummy26 = this.dummy26;
103         double dummy27 = this.dummy27;
104         double dummy28 = this.dummy28;
105         double dummy29 = this.dummy29;
106         double dummy30 = this.dummy30;
107         double dummy31 = this.dummy31;
108         double dummy32 = this.dummy32;
109         double dummy33 = this.dummy33;
110         double dummy34 = this.dummy34;
111         double dummy35 = this.dummy35;
112         double dummy36 = this.dummy36;
113         double dummy37 = this.dummy37;
114         double dummy38 = this.dummy38;
115         double dummy39 = this.dummy39;
116         return Math.fma(a, b, c) +
117             dummy0 +
118             dummy1 +
119             dummy2 +
120             dummy3 +
121             dummy4 +
122             dummy5 +
123             dummy6 +
124             dummy7 +
125             dummy8 +
126             dummy9 +
127             dummy10 +
128             dummy11 +
129             dummy12 +
130             dummy13 +
131             dummy14 +
132             dummy15 +
133             dummy16 +
134             dummy17 +
135             dummy18 +
136             dummy19 +
137             dummy20 +
138             dummy21 +
139             dummy22 +
140             dummy23 +
141             dummy24 +
142             dummy25 +
143             dummy26 +
144             dummy27 +
145             dummy28 +
146             dummy29 +
147             dummy30 +
148             dummy31 +
149             dummy32 +
150             dummy33 +
151             dummy34 +
152             dummy35 +
153             dummy36 +
154             dummy37 +
155             dummy38 +
156             dummy39;
157     }
158 
main(String[] args)159     static public void main(String[] args) {
160         TestFMABrokenC1RegAlloc t = new TestFMABrokenC1RegAlloc();
161         for (int i = 0; i < 5000; i++) {
162             if (t.test(5.0, 10.0, 7.0) != 57.0) {
163                 throw new RuntimeException("Failed");
164             }
165         }
166     }
167 }
168