diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-05-01 18:54:17 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-05-01 18:54:17 +0000 |
commit | 36ff9dfbbec06afc69c642ff460abbd4cbbd78e1 (patch) | |
tree | 3d964bfc9cbd6407c7cc9bddcdd01cfca4d2daf0 /gcc/lra-constraints.c | |
parent | 36054fabf5b7b47ffa8c7c6f93c436dd8e8c807c (diff) | |
download | gcc-36ff9dfbbec06afc69c642ff460abbd4cbbd78e1.zip gcc-36ff9dfbbec06afc69c642ff460abbd4cbbd78e1.tar.gz gcc-36ff9dfbbec06afc69c642ff460abbd4cbbd78e1.tar.bz2 |
re PR target/57091 (ICE: in assign_by_spills, at lra-assigns.c:1268 with -mcmodel=large and indirect call)
2013-05-01 Vladimir Makarov <vmakarov@redhat.com>
PR target/57091
* lra-constraints.c (best_small_class_operands_num): Remove.
(process_alt_operands): Remove small_class_operands_num. Take
small classes operands into losers and only if the operand is not
matched. Modify debugging output.
(curr_insn_transform): Remove best_small_class_operands_num.
Print insn name.
2013-05-01 Vladimir Makarov <vmakarov@redhat.com>
PR target/57091
* gcc.target/i386/pr57091.c: New test.
From-SVN: r198503
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index d9e14dc..94f965bd 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -1048,9 +1048,6 @@ static int goal_alt_number; /* Number of necessary reloads and overall cost reflecting the previous value and other unpleasantness of the best alternative. */ static int best_losers, best_overall; -/* Number of small register classes used for operands of the best - alternative. */ -static int best_small_class_operands_num; /* Overall number hard registers used for reloads. For example, on some targets we need 2 general registers to reload DFmode and only one floating point register. */ @@ -1326,7 +1323,7 @@ static bool process_alt_operands (int only_alternative) { bool ok_p = false; - int nop, small_class_operands_num, overall, nalt; + int nop, overall, nalt; int n_alternatives = curr_static_id->n_alternatives; int n_operands = curr_static_id->n_operands; /* LOSERS counts the operands that don't fit this alternative and @@ -1405,6 +1402,7 @@ process_alt_operands (int only_alternative) if (only_alternative >= 0 && nalt != only_alternative) continue; + overall = losers = reject = reload_nregs = reload_sum = 0; for (nop = 0; nop < n_operands; nop++) reject += (curr_static_id @@ -2006,6 +2004,9 @@ process_alt_operands (int only_alternative) if (! no_regs_p) reload_nregs += ira_reg_class_max_nregs[this_alternative][mode]; + + if (SMALL_REGISTER_CLASS_P (this_alternative)) + reject += LRA_LOSER_COST_FACTOR / 2; } /* We are trying to spill pseudo into memory. It is @@ -2033,6 +2034,7 @@ process_alt_operands (int only_alternative) reloads. */ if (!REG_P (op) || curr_static_id->operand[nop].type != OP_IN) reject++; + } if (early_clobber_p) @@ -2178,15 +2180,9 @@ process_alt_operands (int only_alternative) overall += LRA_LOSER_COST_FACTOR - 1; } } - small_class_operands_num = 0; - for (nop = 0; nop < n_operands; nop++) - small_class_operands_num - += SMALL_REGISTER_CLASS_P (curr_alt[nop]) ? 1 : 0; - if (lra_dump_file != NULL) - fprintf (lra_dump_file, " alt=%d,overall=%d,losers=%d," - "small_class_ops=%d,rld_nregs=%d\n", - nalt, overall, losers, small_class_operands_num, reload_nregs); + fprintf (lra_dump_file, " alt=%d,overall=%d,losers=%d,rld_nregs=%d\n", + nalt, overall, losers, reload_nregs); /* If this alternative can be made to work by reloading, and it needs less reloading than the others checked so far, record @@ -2198,17 +2194,10 @@ process_alt_operands (int only_alternative) || (best_overall == overall /* If the cost of the reloads is the same, prefer alternative which requires minimal - number of small register classes for the - operands. This improves chances of reloads - for insn requiring small register - classes. */ - && (small_class_operands_num - < best_small_class_operands_num - || (small_class_operands_num - == best_small_class_operands_num - && (reload_nregs < best_reload_nregs - || (reload_nregs == best_reload_nregs - && best_reload_sum < reload_sum)))))))) + number of reload regs. */ + && (reload_nregs < best_reload_nregs + || (reload_nregs == best_reload_nregs + && best_reload_sum < reload_sum)))))) { for (nop = 0; nop < n_operands; nop++) { @@ -2224,7 +2213,6 @@ process_alt_operands (int only_alternative) goal_alt_swapped = curr_swapped; best_overall = overall; best_losers = losers; - best_small_class_operands_num = small_class_operands_num; best_reload_nregs = reload_nregs; best_reload_sum = reload_sum; goal_alt_number = nalt; @@ -2826,7 +2814,7 @@ curr_insn_transform (void) operands together against the register constraints. */ best_losers = best_overall = INT_MAX; - best_small_class_operands_num = best_reload_sum = 0; + best_reload_sum = 0; curr_swapped = false; goal_alt_swapped = false; @@ -3033,7 +3021,10 @@ curr_insn_transform (void) for (; *p != '\0' && *p != ',' && *p != '#'; p++) fputc (*p, lra_dump_file); } - fprintf (lra_dump_file, "\n"); + if (INSN_CODE (curr_insn) >= 0 + && (p = get_insn_name (INSN_CODE (curr_insn))) != NULL) + fprintf (lra_dump_file, " {%s}", p); + fprintf (lra_dump_file, "\n"); } /* Right now, for any pair of operands I and J that are required to |