aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-03-31 10:02:27 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2025-03-31 13:27:28 +0200
commit95c25cb09f58810bc520c3db469945c6a751aa32 (patch)
tree882842e641a22dbbf9de3413cd8de586fb1feabc /gcc
parentf30e180194bfbcd7594566ef050534388be31e8d (diff)
downloadgcc-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.c14
-rw-r--r--gcc/tree-tailcall.cc4
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)
;