https://gcc.gnu.org/g:48bbb4d706cdf4ba5c8a7ad053a2843145dc08ed
commit 48bbb4d706cdf4ba5c8a7ad053a2843145dc08ed Author: Mikael Morin <mik...@gcc.gnu.org> Date: Mon Apr 28 17:01:32 2025 +0200 gimple-exec: prise en charge négation fp Diff: --- gcc/cgraphunit.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gcc/cgraphunit.cc b/gcc/cgraphunit.cc index 46747991e83a..8de5d3c1ca8c 100644 --- a/gcc/cgraphunit.cc +++ b/gcc/cgraphunit.cc @@ -4060,13 +4060,12 @@ exec_context::evaluate_unary (enum tree_code code, tree type, tree arg) const default: { gcc_assert (TREE_CODE (type) == INTEGER_TYPE - || TREE_CODE (type) == BOOLEAN_TYPE); + || TREE_CODE (type) == BOOLEAN_TYPE + || TREE_CODE (type) == REAL_TYPE); tree val = evaluate (arg).to_tree (TREE_TYPE (arg)); tree t = fold_unary (code, type, val); gcc_assert (t != NULL_TREE); - data_value result (type); - result.set_cst (wi::to_wide (t)); - return result; + return evaluate (t); } } } @@ -7198,6 +7197,19 @@ exec_context_evaluate_unary_tests () wide_int wi1 = val1.get_cst (); ASSERT_PRED1 (wi::fits_uhwi_p, wi1); ASSERT_EQ (wi1.to_uhwi (), 18); + + + REAL_VALUE_TYPE f25 = REAL_VALUE_ATOF ("2.5", TYPE_MODE (float_type_node)); + tree t25 = build_real (float_type_node, f25); + + data_value valfm25 = ctx1.evaluate_unary (NEGATE_EXPR, float_type_node, t25); + + ASSERT_EQ (valfm25.get_bitwidth (), TYPE_PRECISION (float_type_node)); + ASSERT_EQ (valfm25.classify (), VAL_CONSTANT); + tree tfm25 = valfm25.to_tree (float_type_node); + ASSERT_EQ (TREE_CODE (tfm25), REAL_CST); + REAL_VALUE_TYPE fm25 = REAL_VALUE_ATOF ("-2.5", TYPE_MODE (float_type_node)); + ASSERT_TRUE (real_equal (TREE_REAL_CST_PTR (tfm25), &fm25)); }