> Jeff Law wrote:
> OK with the appropropriate ChangeLog entires. THe original for
> ira-costs.c was fine, so you just need the trivial one for the testcase.
ChangeLog below - Jiong, could you commit for me please?
2014-12-02 Wilco Dijkstra <[email protected]>
* gcc/ira-costs.c (scan_one_insn): Improve spill cost adjustment.
* gcc/testsuite/gcc.target/aarch64/remat1.c: New testcase.
---
gcc/ira-costs.c | 5 ++---
gcc/testsuite/gcc.target/aarch64/remat1.c | 20 ++++++++++++++++++++
2 files changed, 22 insertions(+), 3 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/aarch64/remat1.c
diff --git a/gcc/ira-costs.c b/gcc/ira-costs.c
index 122815b..95d266e 100644
--- a/gcc/ira-costs.c
+++ b/gcc/ira-costs.c
@@ -1462,12 +1462,11 @@ scan_one_insn (rtx_insn *insn)
&& ((MEM_P (XEXP (note, 0))
&& !side_effects_p (SET_SRC (set)))
|| (CONSTANT_P (XEXP (note, 0))
- && targetm.legitimate_constant_p (GET_MODE (SET_DEST (set)),
- XEXP (note, 0))
+ && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (XEXP (note, 0)))
&& REG_N_SETS (REGNO (SET_DEST (set))) == 1))
&& general_operand (SET_SRC (set), GET_MODE (SET_SRC (set))))
{
- enum reg_class cl = GENERAL_REGS;
+ enum reg_class cl = ALL_REGS;
rtx reg = SET_DEST (set);
int num = COST_INDEX (REGNO (reg));
diff --git a/gcc/testsuite/gcc.target/aarch64/remat1.c
b/gcc/testsuite/gcc.target/aarch64/remat1.c
new file mode 100644
index 0000000..999577e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/remat1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fomit-frame-pointer -fcaller-saves -ffixed-d8 -ffixed-d9
-ffixed-d10 -ffixed-d11 -ffixed-d12 -ffixed-d13 -ffixed-d14 -ffixed-d15" } */
+
+/* Under high register pressure FP immediates should be rematerialized
+ as literal loads rather than being caller-saved to the stack. */
+
+void
+g (void);
+
+float
+f (float x)
+{
+ x += 3.1f;
+ g ();
+ x *= 3.1f;
+ return x;
+}
+
+/* { dg-final { scan-assembler-times "ldr\ts\[0-9]+, .LC0" 2 } } */
+
--
1.9.1