105 lines
3.1 KiB
Diff
105 lines
3.1 KiB
Diff
From 1e389ec3bad94888fadd153f191fe8862448f258 Mon Sep 17 00:00:00 2001
|
|
From: Xi Ruoyao <xry111@xry111.site>
|
|
Date: Wed, 27 Dec 2023 04:28:56 +0800
|
|
Subject: [PATCH 089/188] LoongArch: Fix infinite secondary reloading of
|
|
FCCmode [PR113148]
|
|
|
|
The GCC internal doc says:
|
|
|
|
X might be a pseudo-register or a 'subreg' of a pseudo-register,
|
|
which could either be in a hard register or in memory. Use
|
|
'true_regnum' to find out; it will return -1 if the pseudo is in
|
|
memory and the hard register number if it is in a register.
|
|
|
|
So "MEM_P (x)" is not enough for checking if we are reloading from/to
|
|
the memory. This bug has caused reload pass to stall and finally ICE
|
|
complaining with "maximum number of generated reload insns per insn
|
|
achieved", since r14-6814.
|
|
|
|
Check if "true_regnum (x)" is -1 besides "MEM_P (x)" to fix the issue.
|
|
|
|
gcc/ChangeLog:
|
|
|
|
PR target/113148
|
|
* config/loongarch/loongarch.cc (loongarch_secondary_reload):
|
|
Check if regno == -1 besides MEM_P (x) for reloading FCCmode
|
|
from/to FPR to/from memory.
|
|
|
|
gcc/testsuite/ChangeLog:
|
|
|
|
PR target/113148
|
|
* gcc.target/loongarch/pr113148.c: New test.
|
|
---
|
|
gcc/config/loongarch/loongarch.cc | 3 +-
|
|
gcc/testsuite/gcc.target/loongarch/pr113148.c | 44 +++++++++++++++++++
|
|
2 files changed, 46 insertions(+), 1 deletion(-)
|
|
create mode 100644 gcc/testsuite/gcc.target/loongarch/pr113148.c
|
|
|
|
diff --git a/gcc/config/loongarch/loongarch.cc b/gcc/config/loongarch/loongarch.cc
|
|
index 5c278386a..2e305f940 100644
|
|
--- a/gcc/config/loongarch/loongarch.cc
|
|
+++ b/gcc/config/loongarch/loongarch.cc
|
|
@@ -6902,7 +6902,8 @@ loongarch_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x,
|
|
return NO_REGS;
|
|
}
|
|
|
|
- if (reg_class_subset_p (rclass, FP_REGS) && MEM_P (x))
|
|
+ if (reg_class_subset_p (rclass, FP_REGS)
|
|
+ && (regno == -1 || MEM_P (x)))
|
|
return GR_REGS;
|
|
|
|
return NO_REGS;
|
|
diff --git a/gcc/testsuite/gcc.target/loongarch/pr113148.c b/gcc/testsuite/gcc.target/loongarch/pr113148.c
|
|
new file mode 100644
|
|
index 000000000..cf48e5520
|
|
--- /dev/null
|
|
+++ b/gcc/testsuite/gcc.target/loongarch/pr113148.c
|
|
@@ -0,0 +1,44 @@
|
|
+/* PR 113148: ICE caused by infinite reloading */
|
|
+/* { dg-do compile } */
|
|
+/* { dg-options "-O2 -march=la464 -mfpu=64 -mabi=lp64d" } */
|
|
+
|
|
+struct bound
|
|
+{
|
|
+ double max;
|
|
+} drawQuadrant_bound;
|
|
+double w4, innerXfromXY_y, computeBound_right_0;
|
|
+struct arc_def
|
|
+{
|
|
+ double w, h;
|
|
+ double a0, a1;
|
|
+};
|
|
+static void drawQuadrant (struct arc_def *);
|
|
+static void
|
|
+computeBound (struct arc_def *def, struct bound *bound)
|
|
+{
|
|
+ double ellipsex_1, ellipsex_0;
|
|
+ bound->max = def->a1 ?: __builtin_sin (w4) * def->h;
|
|
+ if (def->a0 == 5 && def->w == def->h)
|
|
+ ;
|
|
+ else
|
|
+ ellipsex_0 = def->a0 == 0.0 ?: __builtin_cos (w4);
|
|
+ if (def->a1 == 5 && def->w == def->h)
|
|
+ ellipsex_1 = bound->max;
|
|
+ __builtin_sqrt (ellipsex_1 * innerXfromXY_y * innerXfromXY_y * w4);
|
|
+ computeBound_right_0 = ellipsex_0;
|
|
+}
|
|
+void
|
|
+drawArc ()
|
|
+{
|
|
+ struct arc_def foo;
|
|
+ for (;;)
|
|
+ drawQuadrant (&foo);
|
|
+}
|
|
+void
|
|
+drawQuadrant (struct arc_def *def)
|
|
+{
|
|
+ int y, miny;
|
|
+ computeBound (def, &drawQuadrant_bound);
|
|
+ while (y >= miny)
|
|
+ ;
|
|
+}
|
|
--
|
|
2.43.0
|
|
|