diff options
author | Richard Biener <rguenther@suse.de> | 2025-03-31 10:02:27 +0200 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2025-03-31 13:27:28 +0200 |
commit | 95c25cb09f58810bc520c3db469945c6a751aa32 (patch) | |
tree | 882842e641a22dbbf9de3413cd8de586fb1feabc /gcc | |
parent | f30e180194bfbcd7594566ef050534388be31e8d (diff) | |
download | gcc-95c25cb09f58810bc520c3db469945c6a751aa32.zip gcc-95c25cb09f58810bc520c3db469945c6a751aa32.tar.gz gcc-95c25cb09f58810bc520c3db469945c6a751aa32.tar.bz2 |
tree-optimization/119532 - ICE with fixed-point tail recursion
The following disables tail recursion optimization when fixed-point
types are involved as we cannot generate -1 for all fixed-point
types.
PR tree-optimization/119532
* tree-tailcall.cc (process_assignment): FAIL for fixed-point
typed functions.
* gcc.dg/torture/pr119532.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr119532.c | 14 | ||||
-rw-r--r-- | gcc/tree-tailcall.cc | 4 |
2 files changed, 18 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr119532.c b/gcc/testsuite/gcc.dg/torture/pr119532.c new file mode 100644 index 0000000..bba2e45 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr119532.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fixed_point } */ + +extern _Fract sinuhk_deg (unsigned short _Accum); + +_Fract cosuhk_deg (unsigned short _Accum deg) +{ + unsigned short _Accum _90_deg = 90uhk; + __asm ("" : "+r" (_90_deg)); + + return deg <= _90_deg + ? sinuhk_deg (_90_deg - deg) + : -sinuhk_deg (deg - _90_deg); +} diff --git a/gcc/tree-tailcall.cc b/gcc/tree-tailcall.cc index 8ba6752..8ea1c8b 100644 --- a/gcc/tree-tailcall.cc +++ b/gcc/tree-tailcall.cc @@ -361,6 +361,10 @@ process_assignment (gassign *stmt, if (FLOAT_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl)))) return FAIL; + /* We at least cannot build -1 for all fixed point types. */ + if (FIXED_POINT_TYPE_P (TREE_TYPE (DECL_RESULT (current_function_decl)))) + return FAIL; + if (rhs_class == GIMPLE_UNARY_RHS && op0 == *ass_var) ; |