From e7bcc691204350945d31fcb27b6d421cdf6d8453 Mon Sep 17 00:00:00 2001 From: Jim MacArthur Date: Thu, 24 May 2012 11:07:57 +0000 Subject: [PATCH] recog.c (reg_fits_class_p): Check both regno and regno + offset are hard registers. 2012-05-24 Jim MacArthur * recog.c (reg_fits_class_p): Check both regno and regno + offset are hard registers. * regs.h (in_hard_reg_set_p): Assert that regno is a hard register and check end_regno - 1 is a hard register. From-SVN: r187826 --- gcc/ChangeLog | 7 +++++++ gcc/recog.c | 8 +++++--- gcc/regs.h | 7 +++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5cd15313015..8246ae9a5f7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-05-24 Jim MacArthur + + * recog.c (reg_fits_class_p): Check both regno and regno + offset are + hard registers. + * regs.h (in_hard_reg_set_p): Assert that regno is a hard register and + check end_regno - 1 is a hard register. + 2012-05-24 Richard Guenther * varpool.c (add_new_static_var): Remove call to create_var_ann. diff --git a/gcc/recog.c b/gcc/recog.c index c5725d2abdf..d6645942cc7 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -2792,14 +2792,16 @@ bool reg_fits_class_p (const_rtx operand, reg_class_t cl, int offset, enum machine_mode mode) { - int regno = REGNO (operand); + unsigned int regno = REGNO (operand); if (cl == NO_REGS) return false; + /* Regno must not be a pseudo register. Offset may be negative. */ return (HARD_REGISTER_NUM_P (regno) - && in_hard_reg_set_p (reg_class_contents[(int) cl], - mode, regno + offset)); + && HARD_REGISTER_NUM_P (regno + offset) + && in_hard_reg_set_p (reg_class_contents[(int) cl], mode, + regno + offset)); } /* Split single instruction. Helper function for split_all_insns and diff --git a/gcc/regs.h b/gcc/regs.h index 328b839ffac..d18bf0aa3c1 100644 --- a/gcc/regs.h +++ b/gcc/regs.h @@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see #include "machmode.h" #include "hard-reg-set.h" +#include "rtl.h" #define REG_BYTES(R) mode_size[(int) GET_MODE (R)] @@ -367,10 +368,16 @@ in_hard_reg_set_p (const HARD_REG_SET regs, enum machine_mode mode, { unsigned int end_regno; + gcc_assert (HARD_REGISTER_NUM_P (regno)); + if (!TEST_HARD_REG_BIT (regs, regno)) return false; end_regno = end_hard_regno (mode, regno); + + if (!HARD_REGISTER_NUM_P (end_regno - 1)) + return false; + while (++regno < end_regno) if (!TEST_HARD_REG_BIT (regs, regno)) return false; -- 2.30.2