aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2022-09-12 10:43:19 +0200
committerMartin Liska <mliska@suse.cz>2022-09-12 10:43:19 +0200
commitfdb97cd0b7d15efa39ba79dca44be93debb0ef12 (patch)
tree65a6d95503fb9897bda29c72a629e57bb773d1c1 /gcc/fortran
parent918bc838c2803f08e4d7ccd179396d48cb8ec804 (diff)
parent643ae816f17745a77b62188b6bf169211609a59b (diff)
downloadgcc-fdb97cd0b7d15efa39ba79dca44be93debb0ef12.zip
gcc-fdb97cd0b7d15efa39ba79dca44be93debb0ef12.tar.gz
gcc-fdb97cd0b7d15efa39ba79dca44be93debb0ef12.tar.bz2
Merge branch 'master' into devel/sphinx
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog23
-rw-r--r--gcc/fortran/f95-lang.cc16
-rw-r--r--gcc/fortran/invoke.texi5
-rw-r--r--gcc/fortran/mathbuiltins.def1
-rw-r--r--gcc/fortran/openmp.cc4
-rw-r--r--gcc/fortran/scanner.cc8
-rw-r--r--gcc/fortran/trans-intrinsic.cc51
7 files changed, 100 insertions, 8 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index e20d569..676f89f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,26 @@
+2022-09-10 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
+ PR fortran/95644
+ * f95-lang.cc (gfc_init_builtin_functions): Declare FMA
+ built-ins.
+ * mathbuiltins.def: Declare FMA built-ins.
+ * trans-intrinsic.cc (conv_intrinsic_ieee_fma): New function.
+ (conv_intrinsic_ieee_signbit): New function.
+ (gfc_build_intrinsic_lib_fndecls): Add cases for FMA and
+ SIGNBIT.
+
+2022-09-08 Tobias Burnus <tobias@codesourcery.com>
+
+ PR fortran/106670
+ * scanner.cc (skip_fixed_omp_sentinel): Add -Wsurprising warning
+ for 'omx' sentinels with -fopenmp.
+ * invoke.texi (-Wsurprising): Document additional warning case.
+
+2022-09-06 Tobias Burnus <tobias@codesourcery.com>
+
+ * openmp.cc (resolve_omp_clauses): Remove ordered/linear
+ check as it is handled now in the middle end.
+
2022-09-05 Tobias Burnus <tobias@codesourcery.com>
* dump-parse-tree.cc (show_omp_namelist, show_omp_clauses): Handle
diff --git a/gcc/fortran/f95-lang.cc b/gcc/fortran/f95-lang.cc
index 10ac8a9..ff4bf80 100644
--- a/gcc/fortran/f95-lang.cc
+++ b/gcc/fortran/f95-lang.cc
@@ -1281,6 +1281,22 @@ gfc_init_builtin_functions (void)
"__builtin_assume_aligned",
ATTR_CONST_NOTHROW_LEAF_LIST);
+ ftype = build_function_type_list (long_double_type_node, long_double_type_node,
+ long_double_type_node, long_double_type_node,
+ NULL_TREE);
+ gfc_define_builtin ("__builtin_fmal", ftype, BUILT_IN_FMAL,
+ "fmal", ATTR_CONST_NOTHROW_LEAF_LIST);
+ ftype = build_function_type_list (double_type_node, double_type_node,
+ double_type_node, double_type_node,
+ NULL_TREE);
+ gfc_define_builtin ("__builtin_fma", ftype, BUILT_IN_FMA,
+ "fma", ATTR_CONST_NOTHROW_LEAF_LIST);
+ ftype = build_function_type_list (float_type_node, float_type_node,
+ float_type_node, float_type_node,
+ NULL_TREE);
+ gfc_define_builtin ("__builtin_fmaf", ftype, BUILT_IN_FMAF,
+ "fmaf", ATTR_CONST_NOTHROW_LEAF_LIST);
+
gfc_define_builtin ("__emutls_get_address",
builtin_types[BT_FN_PTR_PTR],
BUILT_IN_EMUTLS_GET_ADDRESS,
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index 0d0343d..ee1bf6c 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -1060,6 +1060,11 @@ The type of a function result is declared more than once with the same type. If
@item
A @code{CHARACTER} variable is declared with negative length.
+
+@item
+With @option{-fopenmp}, for fixed-form source code, when an @code{omx}
+vendor-extension sentinel is encountered. (The equivalent @code{ompx},
+used in free-form source code, is diagnosed by default.)
@end itemize
@item -Wtabs
diff --git a/gcc/fortran/mathbuiltins.def b/gcc/fortran/mathbuiltins.def
index 615214e..9d55c34 100644
--- a/gcc/fortran/mathbuiltins.def
+++ b/gcc/fortran/mathbuiltins.def
@@ -60,6 +60,7 @@ OTHER_BUILTIN (CABS, "cabs", cabs, true)
OTHER_BUILTIN (COPYSIGN, "copysign", 2, true)
OTHER_BUILTIN (CPOW, "cpow", cpow, true)
OTHER_BUILTIN (FABS, "fabs", 1, true)
+OTHER_BUILTIN (FMA, "fma", 3, true)
OTHER_BUILTIN (FMOD, "fmod", 2, true)
OTHER_BUILTIN (FREXP, "frexp", frexp, false)
OTHER_BUILTIN (LOGB, "logb", 1, true)
diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc
index 5142fd7..457e983 100644
--- a/gcc/fortran/openmp.cc
+++ b/gcc/fortran/openmp.cc
@@ -7625,10 +7625,6 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses *omp_clauses,
linear_op = n->u.linear.op;
}
}
- else if (omp_clauses->orderedc)
- gfc_error ("LINEAR clause specified together with "
- "ORDERED clause with argument at %L",
- &n->where);
else if (n->u.linear.op != OMP_LINEAR_REF
&& n->sym->ts.type != BT_INTEGER)
gfc_error ("LINEAR variable %qs must be INTEGER "
diff --git a/gcc/fortran/scanner.cc b/gcc/fortran/scanner.cc
index 2dff251..fa1d9cb 100644
--- a/gcc/fortran/scanner.cc
+++ b/gcc/fortran/scanner.cc
@@ -982,8 +982,9 @@ static bool
skip_fixed_omp_sentinel (locus *start)
{
gfc_char_t c;
- if (((c = next_char ()) == 'm' || c == 'M')
- && ((c = next_char ()) == 'p' || c == 'P'))
+ if ((c = next_char ()) != 'm' && c != 'M')
+ return false;
+ if ((c = next_char ()) == 'p' || c == 'P')
{
c = next_char ();
if (c != '\n'
@@ -1005,6 +1006,9 @@ skip_fixed_omp_sentinel (locus *start)
}
}
}
+ else if (UNLIKELY (c == 'x' || c == 'X'))
+ gfc_warning_now (OPT_Wsurprising,
+ "Ignoring '!$omx' vendor-extension sentinel at %C");
return false;
}
diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index ec116ff..bb93802 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -695,7 +695,7 @@ gfc_build_intrinsic_lib_fndecls (void)
C99-like library functions. For now, we only handle _Float128
q-suffixed or IEC 60559 f128-suffixed functions. */
- tree type, complex_type, func_1, func_2, func_cabs, func_frexp;
+ tree type, complex_type, func_1, func_2, func_3, func_cabs, func_frexp;
tree func_iround, func_lround, func_llround, func_scalbn, func_cpow;
memset (quad_decls, 0, sizeof(tree) * (END_BUILTINS + 1));
@@ -715,6 +715,8 @@ gfc_build_intrinsic_lib_fndecls (void)
type, NULL_TREE);
/* type (*) (type, type) */
func_2 = build_function_type_list (type, type, type, NULL_TREE);
+ /* type (*) (type, type, type) */
+ func_3 = build_function_type_list (type, type, type, type, NULL_TREE);
/* type (*) (type, &int) */
func_frexp
= build_function_type_list (type,
@@ -9781,7 +9783,7 @@ conv_ieee_function_args (gfc_se *se, gfc_expr *expr, tree *argarray,
}
-/* Generate code for intrinsics IEEE_IS_NAN, IEEE_IS_FINITE,
+/* Generate code for intrinsics IEEE_IS_NAN, IEEE_IS_FINITE
and IEEE_UNORDERED, which translate directly to GCC type-generic
built-ins. */
@@ -9801,6 +9803,23 @@ conv_intrinsic_ieee_builtin (gfc_se * se, gfc_expr * expr,
}
+/* Generate code for intrinsics IEEE_SIGNBIT. */
+
+static void
+conv_intrinsic_ieee_signbit (gfc_se * se, gfc_expr * expr)
+{
+ tree arg, signbit;
+
+ conv_ieee_function_args (se, expr, &arg, 1);
+ signbit = build_call_expr_loc (input_location,
+ builtin_decl_explicit (BUILT_IN_SIGNBIT),
+ 1, arg);
+ signbit = fold_build2_loc (input_location, NE_EXPR, logical_type_node,
+ signbit, integer_zero_node);
+ se->expr = fold_convert (gfc_typenode_for_spec (&expr->ts), signbit);
+}
+
+
/* Generate code for IEEE_IS_NORMAL intrinsic:
IEEE_IS_NORMAL(x) --> (__builtin_isnormal(x) || x == 0) */
@@ -10207,6 +10226,30 @@ conv_intrinsic_ieee_value (gfc_se *se, gfc_expr *expr)
}
+/* Generate code for IEEE_FMA. */
+
+static void
+conv_intrinsic_ieee_fma (gfc_se * se, gfc_expr * expr)
+{
+ tree args[3], decl, call;
+ int argprec;
+
+ conv_ieee_function_args (se, expr, args, 3);
+
+ /* All three arguments should have the same type. */
+ gcc_assert (TYPE_PRECISION (TREE_TYPE (args[0])) == TYPE_PRECISION (TREE_TYPE (args[1])));
+ gcc_assert (TYPE_PRECISION (TREE_TYPE (args[0])) == TYPE_PRECISION (TREE_TYPE (args[2])));
+
+ /* Call the type-generic FMA built-in. */
+ argprec = TYPE_PRECISION (TREE_TYPE (args[0]));
+ decl = builtin_decl_for_precision (BUILT_IN_FMA, argprec);
+ call = build_call_expr_loc_array (input_location, decl, 3, args);
+
+ /* Convert to the final type. */
+ se->expr = fold_convert (TREE_TYPE (args[0]), call);
+}
+
+
/* Generate code for an intrinsic function from the IEEE_ARITHMETIC
module. */
@@ -10221,6 +10264,8 @@ gfc_conv_ieee_arithmetic_function (gfc_se * se, gfc_expr * expr)
conv_intrinsic_ieee_builtin (se, expr, BUILT_IN_ISFINITE, 1);
else if (startswith (name, "_gfortran_ieee_unordered"))
conv_intrinsic_ieee_builtin (se, expr, BUILT_IN_ISUNORDERED, 2);
+ else if (startswith (name, "_gfortran_ieee_signbit"))
+ conv_intrinsic_ieee_signbit (se, expr);
else if (startswith (name, "_gfortran_ieee_is_normal"))
conv_intrinsic_ieee_is_normal (se, expr);
else if (startswith (name, "_gfortran_ieee_is_negative"))
@@ -10241,6 +10286,8 @@ gfc_conv_ieee_arithmetic_function (gfc_se * se, gfc_expr * expr)
conv_intrinsic_ieee_class (se, expr);
else if (startswith (name, "ieee_value_") && ISDIGIT (name[11]))
conv_intrinsic_ieee_value (se, expr);
+ else if (startswith (name, "_gfortran_ieee_fma"))
+ conv_intrinsic_ieee_fma (se, expr);
else
/* It is not among the functions we translate directly. We return
false, so a library function call is emitted. */