aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2017-03-06 20:23:00 +0000
committerVladimir Makarov <vmakarov@redhat.com>2017-03-06 20:23:00 +0000
commitff8aad8e31ad736b5d2e67ccbd39c54e25dd3957 (patch)
tree8b43ce72fa0d662b665bf884acec21d48d76282a
parentf0c93b32c440404dfa099d15e2fb748851f324cb (diff)
2017-03-06 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/79571 * lra-constraints.c (process_alt_operands): Claculate static reject and subtract it from overal when there will be only address reloads. 2017-03-06 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/79571 * gcc.target/i386/pr79571.c: New. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@245928 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lra-constraints.c23
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr79571.c25
4 files changed, 57 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 05001aa26e8..2ddff45eabd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2017-03-06 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/79571
+ * lra-constraints.c (process_alt_operands): Claculate static
+ reject and subtract it from overal when there will be only address
+ reloads.
+
2017-03-06 Julia Koval <julia.koval@intel.com>
PR target/79793
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index c67bd0633f3..630261a6dfa 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -1867,11 +1867,15 @@ process_alt_operands (int only_alternative)
/* LOSERS counts the operands that don't fit this alternative and
would require loading. */
int losers;
+ int addr_losers;
/* REJECT is a count of how undesirable this alternative says it is
if any reloading is required. If the alternative matches exactly
then REJECT is ignored, but otherwise it gets this much counted
against it in addition to the reloading needed. */
int reject;
+ /* This is defined by '!' or '?' alternative constraint and added to
+ reject. But in some cases it can be ignored. */
+ int static_reject;
int op_reject;
/* The number of elements in the following array. */
int early_clobbered_regs_num;
@@ -1948,7 +1952,8 @@ process_alt_operands (int only_alternative)
if (!TEST_BIT (preferred, nalt))
continue;
- overall = losers = reject = reload_nregs = reload_sum = 0;
+ overall = losers = addr_losers = 0;
+ static_reject = reject = reload_nregs = reload_sum = 0;
for (nop = 0; nop < n_operands; nop++)
{
int inc = (curr_static_id
@@ -1956,8 +1961,9 @@ process_alt_operands (int only_alternative)
if (lra_dump_file != NULL && inc != 0)
fprintf (lra_dump_file,
" Staticly defined alt reject+=%d\n", inc);
- reject += inc;
+ static_reject += inc;
}
+ reject += static_reject;
early_clobbered_regs_num = 0;
for (nop = 0; nop < n_operands; nop++)
@@ -2704,6 +2710,9 @@ process_alt_operands (int only_alternative)
nop);
reject++;
}
+
+ if (MEM_P (op) && offmemok)
+ addr_losers++;
}
if (early_clobber_p && ! scratch_p)
@@ -2718,7 +2727,8 @@ process_alt_operands (int only_alternative)
Should we update the cost (may be approximately) here
because of early clobber register reloads or it is a rare
or non-important thing to be worth to do it. */
- overall = losers * LRA_LOSER_COST_FACTOR + reject;
+ overall = (losers * LRA_LOSER_COST_FACTOR + reject
+ - (addr_losers == losers ? static_reject : 0));
if ((best_losers == 0 || losers != 0) && best_overall < overall)
{
if (lra_dump_file != NULL)
@@ -2742,6 +2752,7 @@ process_alt_operands (int only_alternative)
if (early_clobber_p && operand_reg[nop] != NULL_RTX)
early_clobbered_nops[early_clobbered_regs_num++] = nop;
}
+
if (curr_insn_set != NULL_RTX && n_operands == 2
/* Prevent processing non-move insns. */
&& (GET_CODE (SET_SRC (curr_insn_set)) == SUBREG
@@ -2753,9 +2764,15 @@ process_alt_operands (int only_alternative)
|| reg_in_class_p (no_subreg_reg_operand[1], curr_alt[0])))
|| (! curr_alt_win[0] && curr_alt_win[1]
&& REG_P (no_subreg_reg_operand[1])
+ /* Check that we reload memory not the memory
+ address. */
+ && !curr_alt_offmemok[0]
&& reg_in_class_p (no_subreg_reg_operand[1], curr_alt[0]))
|| (curr_alt_win[0] && ! curr_alt_win[1]
&& REG_P (no_subreg_reg_operand[0])
+ /* Check that we reload memory not the memory
+ address. */
+ && !curr_alt_offmemok[1]
&& reg_in_class_p (no_subreg_reg_operand[0], curr_alt[1])
&& (! CONST_POOL_OK_P (curr_operand_mode[1],
no_subreg_reg_operand[1])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 445e4141408..2f27e4b535c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-06 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR rtl-optimization/79571
+ * gcc.target/i386/pr79571.c: New.
+
2017-03-06 Marek Polacek <polacek@redhat.com>
PR c++/79796 - ICE with NSDMI and this pointer
diff --git a/gcc/testsuite/gcc.target/i386/pr79571.c b/gcc/testsuite/gcc.target/i386/pr79571.c
new file mode 100644
index 00000000000..4595a1a0d82
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr79571.c
@@ -0,0 +1,25 @@
+/* PR rtl-optimization/79571 */
+/* { dg-do compile } */
+/* { dg-options "-O -mno-sse -w" } */
+
+struct a
+{
+ int b;
+ int *c
+} h;
+struct d
+{
+ struct a e
+};
+struct fd
+{
+ struct d *d
+} i;
+g;
+j ()
+{
+ unsigned a = g;
+ i = (struct fd){a & 3};
+ struct fd f = i;
+ h = f.d->e;
+}