From 8f21260c3649b691f7c6d13b8595feccc2824e8d Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Thu, 16 Jan 2014 19:13:54 +0000 Subject: [PATCH] re PR middle-end/59609 (LRA generates bad code for libgcc function udivmoddi4 on thumb1 target) 2014-01-16 Vladimir Makarov 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 --- gcc/ChangeLog | 7 +++++++ gcc/lra-constraints.c | 34 ++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 237720af51ce..ca1f85c8fc5d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-01-16 Vladimir Makarov + + 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 PR rtl-optimization/59835 diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index 07815fe3b1dc..fd4a56a57359 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. */ -- 2.43.5