aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-constraints.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2016-07-08 20:29:12 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2016-07-08 20:29:12 +0000
commitd13835b668ac64ae062fa0c765476d229b6b2c22 (patch)
tree551ccc60f40d8af6047c0898eeac69b17fcdf3b6 /gcc/lra-constraints.c
parent65a550b46e5d9759fae0e5af17a494e1f9f5d821 (diff)
downloadgcc-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.c35
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