aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2014-01-16 19:13:54 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2014-01-16 19:13:54 +0000
commit8f21260c3649b691f7c6d13b8595feccc2824e8d (patch)
tree6d1d09fb1c218eab58b27905131c084e87fa2f3d /gcc
parent1a788c056aa8fde4bfbf28cdd0b710a9b0c10cba (diff)
downloadgcc-8f21260c3649b691f7c6d13b8595feccc2824e8d.zip
gcc-8f21260c3649b691f7c6d13b8595feccc2824e8d.tar.gz
gcc-8f21260c3649b691f7c6d13b8595feccc2824e8d.tar.bz2
re PR middle-end/59609 (LRA generates bad code for libgcc function udivmoddi4 on thumb1 target)
2014-01-16 Vladimir Makarov <vmakarov@redhat.com> PR middle-end/59609 * lra-constraints.c (process_alt_operands): Add printing debug info. Check absence of input/output reloads for matched operands too. From-SVN: r206677
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lra-constraints.c34
2 files changed, 35 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 237720a..ca1f85c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2014-01-16 Vladimir Makarov <vmakarov@redhat.com>
+ PR middle-end/59609
+ * lra-constraints.c (process_alt_operands): Add printing debug
+ info. Check absence of input/output reloads for matched operands
+ too.
+
+2014-01-16 Vladimir Makarov <vmakarov@redhat.com>
+
PR rtl-optimization/59835
* ira.c (ira_init_register_move_cost): Increase cost for
impossible modes.
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index 07815fe..fd4a56a 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -1710,7 +1710,6 @@ process_alt_operands (int only_alternative)
&& MEM_P (*curr_id->operand_loc[m])
&& curr_alt[m] == NO_REGS && ! curr_alt_win[m])
continue;
-
}
else
{
@@ -2082,7 +2081,8 @@ process_alt_operands (int only_alternative)
int i;
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (HARD_REGNO_MODE_OK (i, mode)
- && in_hard_reg_set_p (reg_class_contents[this_alternative], mode, i))
+ && in_hard_reg_set_p (reg_class_contents[this_alternative],
+ mode, i))
break;
if (i == FIRST_PSEUDO_REGISTER)
winreg = false;
@@ -2095,7 +2095,13 @@ process_alt_operands (int only_alternative)
badop = false;
if (badop)
- goto fail;
+ {
+ if (lra_dump_file != NULL)
+ fprintf (lra_dump_file,
+ " alt=%d: Bad operand -- refuse\n",
+ nalt);
+ goto fail;
+ }
this_alternative_offmemok = offmemok;
if (this_costly_alternative != NO_REGS)
@@ -2132,7 +2138,14 @@ process_alt_operands (int only_alternative)
[this_alternative][0],
GET_MODE
(*curr_id->operand_loc[nop])))
- goto fail;
+ {
+ if (lra_dump_file != NULL)
+ fprintf
+ (lra_dump_file,
+ " alt=%d: Strict low subreg reload -- refuse\n",
+ nalt);
+ goto fail;
+ }
losers++;
}
if (operand_reg[nop] != NULL_RTX
@@ -2175,8 +2188,17 @@ process_alt_operands (int only_alternative)
&& no_output_reloads_p
&& ! find_reg_note (curr_insn, REG_UNUSED, op))
|| (curr_static_id->operand[nop].type != OP_OUT
- && no_input_reloads_p && ! const_to_mem))
- goto fail;
+ && no_input_reloads_p && ! const_to_mem)
+ || (this_alternative_matches >= 0
+ && (no_input_reloads_p || no_output_reloads_p)))
+ {
+ if (lra_dump_file != NULL)
+ fprintf
+ (lra_dump_file,
+ " alt=%d: No input/otput reload -- refuse\n",
+ nalt);
+ goto fail;
+ }
/* Check strong discouragement of reload of non-constant
into class THIS_ALTERNATIVE. */