diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2016-07-08 20:29:12 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2016-07-08 20:29:12 +0000 |
commit | d13835b668ac64ae062fa0c765476d229b6b2c22 (patch) | |
tree | 551ccc60f40d8af6047c0898eeac69b17fcdf3b6 /gcc/lra-constraints.c | |
parent | 65a550b46e5d9759fae0e5af17a494e1f9f5d821 (diff) | |
download | gcc-d13835b668ac64ae062fa0c765476d229b6b2c22.zip gcc-d13835b668ac64ae062fa0c765476d229b6b2c22.tar.gz gcc-d13835b668ac64ae062fa0c765476d229b6b2c22.tar.bz2 |
re PR rtl-optimization/71621 (ICE in assign_by_spills, at lra-assigns.c:1417 (error: unable to find a register to spill) w/ -O2 -mavx2 -ftree-vectorize)
2016-07-08 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/71621
* lra-constraints.c (process_alt_operands): Check combination of
reg class and mode.
2016-07-08 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/71621
* gcc.target/i386/pr71621-1.c: New.
* gcc.target/i386/pr71621-2.c: New.
From-SVN: r238178
Diffstat (limited to 'gcc/lra-constraints.c')
-rw-r--r-- | gcc/lra-constraints.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index e9d3e43..a1119ac 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -2261,6 +2261,41 @@ process_alt_operands (int only_alternative) goto fail; } + if (this_alternative != NO_REGS) + { + HARD_REG_SET available_regs; + + COPY_HARD_REG_SET (available_regs, + reg_class_contents[this_alternative]); + AND_COMPL_HARD_REG_SET + (available_regs, + ira_prohibited_class_mode_regs[this_alternative][mode]); + AND_COMPL_HARD_REG_SET (available_regs, lra_no_alloc_regs); + if (hard_reg_set_empty_p (available_regs)) + { + /* There are no hard regs holding a value of given + mode. */ + if (offmemok) + { + this_alternative = NO_REGS; + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + " %d Using memory because of" + " a bad mode: reject+=2\n", + nop); + reject += 2; + } + else + { + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + " alt=%d: Wrong mode -- refuse\n", + nalt); + goto fail; + } + } + } + /* If not assigned pseudo has a class which a subset of required reg class, it is a less costly alternative as the pseudo still can get a hard reg of necessary |