Skip to content

Commit 916be92

Browse files
committedNov 16, 2015
Make FP_CONTRACT ON the default.
Differential Revision: D14200 llvm-svn: 253269
1 parent 13d3a20 commit 916be92

File tree

6 files changed

+192
-15
lines changed

6 files changed

+192
-15
lines changed
 

Diff for: ‎clang/include/clang/Basic/LangOptions.def

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ BENIGN_LANGOPT(DebuggerObjCLiteral , 1, 0, "debugger Objective-C literals and su
187187
BENIGN_LANGOPT(SpellChecking , 1, 1, "spell-checking")
188188
LANGOPT(SinglePrecisionConstants , 1, 0, "treating double-precision floating point constants as single precision constants")
189189
LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math")
190-
LANGOPT(DefaultFPContract , 1, 0, "FP_CONTRACT")
190+
LANGOPT(DefaultFPContract , 1, 1, "FP_CONTRACT")
191191
LANGOPT(NoBitFieldTypeAlign , 1, 0, "bit-field type alignment")
192192
LANGOPT(HexagonQdsp6Compat , 1, 0, "hexagon-qdsp6 backward compatibility")
193193
LANGOPT(ObjCAutoRefCount , 1, 0, "Objective-C automated reference counting")

Diff for: ‎clang/lib/Frontend/CompilerInvocation.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -1336,7 +1336,6 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
13361336
Opts.ZVector = 0;
13371337
Opts.CXXOperatorNames = 1;
13381338
Opts.LaxVectorConversions = 0;
1339-
Opts.DefaultFPContract = 1;
13401339
Opts.NativeHalfType = 1;
13411340
}
13421341

Diff for: ‎clang/test/CodeGen/aarch64-neon-fma.c

+10-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
// REQUIRES: aarch64-registered-target
2-
// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 -o - %s | FileCheck %s
2+
// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 \
3+
// RUN: -ffp-contract=off -o - %s | FileCheck %s
4+
// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon -S -O3 \
5+
// RUN: -o - %s | FileCheck -check-prefix=CHECK-FMA %s
36

47
// Test new aarch64 intrinsics and types
58

@@ -10,53 +13,47 @@ float32x2_t test_vmla_n_f32(float32x2_t a, float32x2_t b, float32_t c) {
1013
return vmla_n_f32(a, b, c);
1114
// CHECK: fmul {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
1215
// CHECK: fadd {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
13-
// CHECK-FMA: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
14-
// CHECK-FMA: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
16+
// CHECK-FMA: fmla {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
1517
}
1618

1719
float32x4_t test_vmlaq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
1820
// CHECK-LABEL: test_vmlaq_n_f32
1921
return vmlaq_n_f32(a, b, c);
2022
// CHECK: fmul {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
2123
// CHECK: fadd {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
22-
// CHECK-FMA: dup {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
23-
// CHECK-FMA: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
24+
// CHECK-FMA: fmla {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
2425
}
2526

2627
float64x2_t test_vmlaq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
2728
// CHECK-LABEL: test_vmlaq_n_f64
2829
return vmlaq_n_f64(a, b, c);
2930
// CHECK: fmul {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
3031
// CHECK: fadd {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
31-
// CHECK-FMA: dup {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
32-
// CHECK-FMA: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
32+
// CHECK-FMA: fmla {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
3333
}
3434

3535
float32x4_t test_vmlsq_n_f32(float32x4_t a, float32x4_t b, float32_t c) {
3636
// CHECK-LABEL: test_vmlsq_n_f32
3737
return vmlsq_n_f32(a, b, c);
3838
// CHECK: fmul {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
3939
// CHECK: fsub {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
40-
// CHECK-FMA: dup {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
41-
// CHECK-FMA: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s
40+
// CHECK-FMA: fmls {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.s[0]
4241
}
4342

4443
float32x2_t test_vmls_n_f32(float32x2_t a, float32x2_t b, float32_t c) {
4544
// CHECK-LABEL: test_vmls_n_f32
4645
return vmls_n_f32(a, b, c);
4746
// CHECK: fmul {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
4847
// CHECK: fsub {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
49-
// CHECK-FMA: dup {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
50-
// CHECK-FMA: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s
48+
// CHECK-FMA: fmls {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.s[0]
5149
}
5250

5351
float64x2_t test_vmlsq_n_f64(float64x2_t a, float64x2_t b, float64_t c) {
5452
// CHECK-LABEL: test_vmlsq_n_f64
5553
return vmlsq_n_f64(a, b, c);
5654
// CHECK: fmul {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
5755
// CHECK: fsub {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
58-
// CHECK-FMA: dup {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
59-
// CHECK-FMA: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d
56+
// CHECK-FMA: fmls {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.d[0]
6057
}
6158

6259
float32x2_t test_vmla_lane_f32_0(float32x2_t a, float32x2_t b, float32x2_t v) {

Diff for: ‎clang/test/CodeGen/aarch64-scalar-fma.c

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=fast -S -o - %s | FileCheck -check-prefix=CHECK-FAST -check-prefix=CHECK-ALL %s
2+
// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=on -S -o - %s | FileCheck -check-prefix=CHECK-ON -check-prefix=CHECK-ALL %s
3+
// RUN: %clang_cc1 -triple=aarch64-unknown -Os -ffp-contract=off -S -o - %s | FileCheck -check-prefix=CHECK-OFF -check-prefix=CHECK-ALL %s
4+
// RUN: %clang_cc1 -triple=aarch64-unknown -Os -S -o - %s | FileCheck -check-prefix=CHECK-ON -check-prefix=CHECK-ALL %s
5+
// REQUIRES: aarch64-registered-target
6+
7+
float test1(float x, float y, float z) {
8+
return x*y + z;
9+
// CHECK-ALL-LABEL: test1:
10+
// CHECK-FAST: fmadd
11+
// CHECK-ON: fmadd
12+
// CHECK-OFF: fmul
13+
// CHECK-OFF-NEXT: fadd
14+
}
15+
16+
double test2(double x, double y, double z) {
17+
z -= x*y;
18+
return z;
19+
// CHECK-ALL-LABEL: test2:
20+
// CHECK-FAST: fmsub
21+
// CHECK-ON: fmsub
22+
// CHECK-OFF: fmul
23+
// CHECK-OFF-NEXT: fsub
24+
}
25+
26+
float test3(float x, float y, float z) {
27+
float tmp = x*y;
28+
return tmp + z;
29+
// CHECK-ALL-LABEL: test3:
30+
// CHECK-FAST: fmadd
31+
// CHECK-ON: fmul
32+
// CHECK-ON-NEXT: fadd
33+
// CHECK-OFF: fmul
34+
// CHECK-OFF-NEXT: fadd
35+
}
36+
37+
double test4(double x, double y, double z) {
38+
double tmp = x*y;
39+
return tmp - z;
40+
// CHECK-ALL-LABEL: test4:
41+
// CHECK-FAST: fnmsub
42+
// CHECK-ON: fmul
43+
// CHECK-ON-NEXT: fsub
44+
// CHECK-OFF: fmul
45+
// CHECK-OFF-NEXT: fsub
46+
}
47+
48+
#pragma STDC FP_CONTRACT ON
49+
50+
float test5(float x, float y, float z) {
51+
return x*y + z;
52+
// CHECK-ALL-LABEL: test5:
53+
// CHECK-FAST: fmadd
54+
// CHECK-ON: fmadd
55+
// CHECK-OFF: fmul
56+
// CHECK-OFF-NEXT: fadd
57+
}
58+
59+
double test6(double x, double y, double z) {
60+
z -= x*y;
61+
return z;
62+
// CHECK-ALL-LABEL: test6:
63+
// CHECK-FAST: fmsub
64+
// CHECK-ON: fmsub
65+
// CHECK-OFF: fmul
66+
// CHECK-OFF-NEXT: fsub
67+
}
68+
69+
float test7(float x, float y, float z) {
70+
float tmp = x*y;
71+
return tmp + z;
72+
// CHECK-ALL-LABEL: test7:
73+
// CHECK-FAST: fmadd
74+
// CHECK-ON: fmul
75+
// CHECK-ON-NEXT: fadd
76+
// CHECK-OFF: fmul
77+
// CHECK-OFF-NEXT: fadd
78+
}
79+
80+
double test8(double x, double y, double z) {
81+
double tmp = x*y;
82+
return tmp - z;
83+
// CHECK-ALL-LABEL: test8:
84+
// CHECK-FAST: fnmsub
85+
// CHECK-ON: fmul
86+
// CHECK-ON-NEXT: fsub
87+
// CHECK-OFF: fmul
88+
// CHECK-OFF-NEXT: fsub
89+
}
90+
91+
#pragma STDC FP_CONTRACT OFF
92+
93+
float test9(float x, float y, float z) {
94+
return x*y + z;
95+
// CHECK-ALL-LABEL: test9:
96+
// CHECK-FAST: fmadd
97+
// CHECK-ON: fmul
98+
// CHECK-ON-NEXT: fadd
99+
// CHECK-OFF: fmul
100+
// CHECK-OFF-NEXT: fadd
101+
}
102+
103+
double test10(double x, double y, double z) {
104+
z -= x*y;
105+
return z;
106+
// CHECK-ALL-LABEL: test10:
107+
// CHECK-FAST: fmsub
108+
// CHECK-ON: fmul
109+
// CHECK-ON-NEXT: fsub
110+
// CHECK-OFF: fmul
111+
// CHECK-OFF-NEXT: fsub
112+
}
113+
114+
float test11(float x, float y, float z) {
115+
float tmp = x*y;
116+
return tmp + z;
117+
// CHECK-ALL-LABEL: test11:
118+
// CHECK-FAST: fmadd
119+
// CHECK-ON: fmul
120+
// CHECK-ON-NEXT: fadd
121+
// CHECK-OFF: fmul
122+
// CHECK-OFF-NEXT: fadd
123+
}
124+
125+
double test12(double x, double y, double z) {
126+
double tmp = x*y;
127+
return tmp - z;
128+
// CHECK-ALL-LABEL: test12:
129+
// CHECK-FAST: fnmsub
130+
// CHECK-ON: fmul
131+
// CHECK-ON-NEXT: fsub
132+
// CHECK-OFF: fmul
133+
// CHECK-OFF-NEXT: fsub
134+
}
135+
136+
#pragma STDC FP_CONTRACT DEFAULT
137+
138+
float test17(float x, float y, float z) {
139+
return x*y + z;
140+
// CHECK-ALL-LABEL: test17:
141+
// CHECK-FAST: fmadd
142+
// CHECK-ON: fmadd
143+
// CHECK-OFF: fmul
144+
// CHECK-OFF-NEXT: fadd
145+
}
146+
147+
double test18(double x, double y, double z) {
148+
z -= x*y;
149+
return z;
150+
// CHECK-ALL-LABEL: test18:
151+
// CHECK-FAST: fmsub
152+
// CHECK-ON: fmsub
153+
// CHECK-OFF: fmul
154+
// CHECK-OFF-NEXT: fsub
155+
}
156+
157+
float test19(float x, float y, float z) {
158+
float tmp = x*y;
159+
return tmp + z;
160+
// CHECK-ALL-LABEL: test19:
161+
// CHECK-FAST: fmadd
162+
// CHECK-ON: fmul
163+
// CHECK-ON-NEXT: fadd
164+
// CHECK-OFF: fmul
165+
// CHECK-OFF-NEXT: fadd
166+
}
167+
168+
double test20(double x, double y, double z) {
169+
double tmp = x*y;
170+
return tmp - z;
171+
// CHECK-ALL-LABEL: test20:
172+
// CHECK-FAST: fnmsub
173+
// CHECK-ON: fmul
174+
// CHECK-ON-NEXT: fsub
175+
// CHECK-OFF: fmul
176+
// CHECK-OFF-NEXT: fsub
177+
}

Diff for: ‎clang/test/CodeGen/fp-contract-pragma.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// RUN: %clang_cc1 -O3 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
22

3+
#pragma STDC FP_CONTRACT OFF
4+
35
// Is FP_CONTRACT is honored in a simple case?
46
float fp_contract_1(float a, float b, float c) {
57
// CHECK: _Z13fp_contract_1fff

Diff for: ‎clang/test/Driver/clang_f_opts.c

+2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@
3636
// RUN: %clang -### -S -ffp-contract=fast %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-FAST-CHECK %s
3737
// RUN: %clang -### -S -ffast-math %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-FAST-CHECK %s
3838
// RUN: %clang -### -S -ffp-contract=off %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-OFF-CHECK %s
39+
// RUN: %clang -### -S -ffp-contract=on %s 2>&1 | FileCheck -check-prefix=FP-CONTRACT-ON-CHECK %s
3940
// FP-CONTRACT-FAST-CHECK: -ffp-contract=fast
4041
// FP-CONTRACT-OFF-CHECK: -ffp-contract=off
42+
// FP-CONTRACT-ON-CHECK: -ffp-contract=on
4143

4244
// RUN: %clang -### -S -funroll-loops %s 2>&1 | FileCheck -check-prefix=CHECK-UNROLL-LOOPS %s
4345
// RUN: %clang -### -S -fno-unroll-loops %s 2>&1 | FileCheck -check-prefix=CHECK-NO-UNROLL-LOOPS %s

0 commit comments

Comments
 (0)
Please sign in to comment.