From a0f37b26c5b459cc601ad226a6e4a13b45f5e454 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Wed, 18 Jun 2014 10:37:14 +0000 Subject: [PATCH] Use strict_low_part for loading a constant only if it is cheaper PR rtl-optimization/54555 * postreload.c (move2add_use_add2_insn): Substitute STRICT_LOW_PART only if it is cheaper. testsuite/: PR rtl-optimization/54555 * gcc.target/m68k/pr54555.c: New test. From-SVN: r211777 --- gcc/ChangeLog | 6 ++++++ gcc/postreload.c | 12 ++++++++---- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/m68k/pr54555.c | 13 +++++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/m68k/pr54555.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2089dec9e2f7..562aeaecf4f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-06-18 Andreas Schwab + + PR rtl-optimization/54555 + * postreload.c (move2add_use_add2_insn): Substitute + STRICT_LOW_PART only if it is cheaper. + 2014-06-18 Uros Bizjak * config/i386/i386.md (*sibcall_memory): Rename from *sibcall_intern. diff --git a/gcc/postreload.c b/gcc/postreload.c index 9d716498be48..89f0c8460e2c 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1805,10 +1805,14 @@ move2add_use_add2_insn (rtx reg, rtx sym, rtx off, rtx insn) gen_rtx_STRICT_LOW_PART (VOIDmode, narrow_reg), narrow_src); - changed = validate_change (insn, &PATTERN (insn), - new_set, 0); - if (changed) - break; + get_full_set_rtx_cost (new_set, &newcst); + if (costs_lt_p (&newcst, &oldcst, speed)) + { + changed = validate_change (insn, &PATTERN (insn), + new_set, 0); + if (changed) + break; + } } } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c61da63182f7..3be9d2e6860c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-06-18 Andreas Schwab + + PR rtl-optimization/54555 + * gcc.target/m68k/pr54555.c: New test. + 2014-06-18 Olivier Hainque * gnat.dg/blocklocs.adb: New test. diff --git a/gcc/testsuite/gcc.target/m68k/pr54555.c b/gcc/testsuite/gcc.target/m68k/pr54555.c new file mode 100644 index 000000000000..4be704b8f77c --- /dev/null +++ b/gcc/testsuite/gcc.target/m68k/pr54555.c @@ -0,0 +1,13 @@ +/* PR rtl-optimization/54555 + Test that postreload does not shorten the load of small constants to + use move.b instead of moveq. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-not "move\\.?b" } } */ + +void foo (void); +void bar (int a) +{ + if (a == 16 || a == 23) foo (); + if (a == -110 || a == -128) foo (); +} -- 2.47.3