diff mbox

Improve spillcost of literal pool loads

Message ID 000301d00e23$eadbc520$c0934f60$@com
State New
Headers show

Commit Message

Wilco Dec. 2, 2014, 11:34 a.m. UTC
> 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  <wdijkstr@arm.com>

	* 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

Comments

H.J. Lu Dec. 2, 2014, 1:51 p.m. UTC | #1
On Tue, Dec 2, 2014 at 3:34 AM, Wilco Dijkstra <wdijkstr@arm.com> wrote:
>> 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  <wdijkstr@arm.com>
>
>         * gcc/ira-costs.c (scan_one_insn): Improve spill cost adjustment.
>         * gcc/testsuite/gcc.target/aarch64/remat1.c: New testcase.

How did you test on Linux/ia32?  It introduced many regressions:

FAIL: gcc.dg/hoist-register-pressure-3.c scan-rtl-dump hoist
"PRE/HOIST: end of bb .* copying expression"
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O1 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O1 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -mforce-drap -fpic execution
test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-funroll-loops -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-funroll-loops -mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
-mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -g -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -g -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -Os -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -Os -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O1 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O1 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -mforce-drap -fpic execution
test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-funroll-loops -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-funroll-loops -mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
-mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -g -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -g -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -Os -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -Os -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O1 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O1 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -flto
-fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-funroll-all-loops -finline-functions -mforce-drap -fpic execution
test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-funroll-loops -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-funroll-loops -mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
-mforce-drap -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -g -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -g -mforce-drap -fpic
execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -Os -fpic execution test
FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -Os -mforce-drap -fpic
execution test
FAIL: gcc.target/i386/ifcvt-onecmpl-abs-1.c scan-assembler cltd
FAIL: gcc.target/i386/pr63527.c scan-assembler-not movl[ \t]%[^,]+, %ebx
FAIL: g++.dg/asan/asan_test.C   -O2
AddressSanitizer_BuiltinLongJmpTest execution test
H.J. Lu Dec. 2, 2014, 1:55 p.m. UTC | #2
On Tue, Dec 2, 2014 at 5:51 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, Dec 2, 2014 at 3:34 AM, Wilco Dijkstra <wdijkstr@arm.com> wrote:
>>> 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  <wdijkstr@arm.com>
>>
>>         * gcc/ira-costs.c (scan_one_insn): Improve spill cost adjustment.
>>         * gcc/testsuite/gcc.target/aarch64/remat1.c: New testcase.
>
> How did you test on Linux/ia32?  It introduced many regressions:
>
> FAIL: gcc.dg/hoist-register-pressure-3.c scan-rtl-dump hoist
> "PRE/HOIST: end of bb .* copying expression"
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O1 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O1 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O2 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -mforce-drap -fpic execution
> test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -funroll-loops -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -funroll-loops -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -fomit-frame-pointer
> -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -g -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -O3 -g -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -Os -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-1.c   -Os -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O1 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O1 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O2 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -mforce-drap -fpic execution
> test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -funroll-loops -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -funroll-loops -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -fomit-frame-pointer
> -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -g -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -O3 -g -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -Os -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-3.c   -Os -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O1 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O1 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -flto
> -fno-use-linker-plugin -flto-partition=none -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O2 -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -funroll-all-loops -finline-functions -mforce-drap -fpic execution
> test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -funroll-loops -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -funroll-loops -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -fomit-frame-pointer
> -mforce-drap -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -g -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -O3 -g -mforce-drap -fpic
> execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -Os -fpic execution test
> FAIL: gcc.dg/torture/stackalign/setjmp-4.c   -Os -mforce-drap -fpic
> execution test
> FAIL: gcc.target/i386/ifcvt-onecmpl-abs-1.c scan-assembler cltd
> FAIL: gcc.target/i386/pr63527.c scan-assembler-not movl[ \t]%[^,]+, %ebx
> FAIL: g++.dg/asan/asan_test.C   -O2
> AddressSanitizer_BuiltinLongJmpTest execution test
>

I opened:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64151
diff mbox

Patch

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 } } */
+