The following disables tail recursion optimization when fixed-point types are involved as we cannot generate -1 for all fixed-point types.
Bootstrapped and tested on x86_64-unknown-linux-gnu. OK? Thanks, Richard. PR tree-optimization/119532 * tree-tailcall.cc (process_assignment): FAIL for fixed-point typed functions. * gcc.dg/torture/pr119532.c: New testcase. --- gcc/testsuite/gcc.dg/torture/pr119532.c | 14 ++++++++++++++ gcc/tree-tailcall.cc | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr119532.c diff --git a/gcc/testsuite/gcc.dg/torture/pr119532.c b/gcc/testsuite/gcc.dg/torture/pr119532.c new file mode 100644 index 00000000000..bba2e451d2b --- /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 8ba67522191..8ea1c8b5f99 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) ; -- 2.43.0