From 3bb19a90c8d642f6659a20cc6d2e51d3de25b0a4 Mon Sep 17 00:00:00 2001 From: Vladimir Makarov Date: Fri, 19 Aug 2011 22:17:26 +0000 Subject: [PATCH] re PR rtl-optimization/49936 (IRA handles CANNOT_CHANGE_MODE_CLASS poorly, + spills to memory on 4.7) 2011-08-19 Vladimir Makarov PR rtl-optimization/49936 * ira.c (ira_init_register_move_cost): Ignore too small subclasses for calculation of max register move costs. From-SVN: r177916 --- gcc/ChangeLog | 6 ++++++ gcc/ira.c | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6457234b573..c4740586d22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-08-19 Vladimir Makarov + + PR rtl-optimization/49936 + * ira.c (ira_init_register_move_cost): Ignore too small subclasses + for calculation of max register move costs. + 2011-08-19 Joseph Myers * c-parser.c (c_parser_postfix_expression): Convert operands of diff --git a/gcc/ira.c b/gcc/ira.c index e4be8b52f71..785478f7457 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -1501,6 +1501,10 @@ ira_init_register_move_cost (enum machine_mode mode) sizeof (move_table) * N_REG_CLASSES); for (cl1 = 0; cl1 < N_REG_CLASSES; cl1++) { + /* Some subclasses are to small to have enough registers to hold + a value of MODE. Just ignore them. */ + if (! contains_reg_of_mode[cl1][mode]) + continue; COPY_HARD_REG_SET (temp_hard_regset, reg_class_contents[cl1]); AND_COMPL_HARD_REG_SET (temp_hard_regset, no_unit_alloc_regs); if (hard_reg_set_empty_p (temp_hard_regset)) -- 2.30.2