diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2006-01-24 14:29:25 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gcc.gnu.org> | 2006-01-24 14:29:25 +0000 |
commit | 81162f97bf4d974352a6eb1b091cd7e25faa751e (patch) | |
tree | ed823d071217156a9e008601bc9ad10e116f16dd /gcc/combine.c | |
parent | 1dc8e905c035ca4dba5a12328ab3a763e6086ec2 (diff) | |
download | gcc-81162f97bf4d974352a6eb1b091cd7e25faa751e.zip gcc-81162f97bf4d974352a6eb1b091cd7e25faa751e.tar.gz gcc-81162f97bf4d974352a6eb1b091cd7e25faa751e.tar.bz2 |
re PR rtl-optimization/25890 (testsuite failure: gcc.c-torture/compile/20051228-1.c)
2006-01-23 Paolo Bonzini <bonzini@gnu.org>
PR rtl-optimization/25890
PR rtl-optimization/25905
* combine.c (expand_compound_operation, expand_field_assignment):
Fail if the bitfield's final position is out of bounds.
From-SVN: r110170
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 55f5723..0ec4580 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -5640,8 +5640,9 @@ expand_compound_operation (rtx x) len = INTVAL (XEXP (x, 1)); pos = INTVAL (XEXP (x, 2)); - /* This should stay within the object being extracted, fail. */ - gcc_assert (len + pos <= GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))); + /* This should stay within the object being extracted, fail otherwise. */ + if (len + pos > GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)))) + return x; if (BITS_BIG_ENDIAN) pos = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0))) - len - pos; @@ -5800,9 +5801,9 @@ expand_field_assignment (rtx x) pos = XEXP (SET_DEST (x), 2); /* A constant position should stay within the width of INNER. */ - if (GET_CODE (pos) == CONST_INT) - gcc_assert (INTVAL (pos) + len - <= GET_MODE_BITSIZE (GET_MODE (inner))); + if (GET_CODE (pos) == CONST_INT + && INTVAL (pos) + len > GET_MODE_BITSIZE (GET_MODE (inner))) + break; if (BITS_BIG_ENDIAN) { |