[Patch] Warn and truncate bitsize when partial overflow happen

PR rtl-optimization/64011
  gcc/
    * expmed.c (store_bit_field_using_insv): Warn and truncate bitsize when
    there is partial overflow.

From-SVN: r219717
This commit is contained in:
Jiong Wang 2015-01-16 10:14:51 +00:00 committed by Jiong Wang
parent de37b21e3d
commit 4ae9783ec3
2 changed files with 21 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-01-15 Jiong Wang <jiong.wang@arm.com>
PR rtl-optimization/64011
* expmed.c (store_bit_field_using_insv): Warn and truncate bitsize when
there is partial overflow.
2015-01-16 Chung-Ju Wu <jasonwucj@gmail.com>
* config/nds32/nds32-protos.h (nds32_expand_epilogue): Change

View File

@ -557,6 +557,21 @@ store_bit_field_using_insv (const extraction_insn *insv, rtx op0,
copy_back = true;
}
/* There are similar overflow check at the start of store_bit_field_1,
but that only check the situation where the field lies completely
outside the register, while there do have situation where the field
lies partialy in the register, we need to adjust bitsize for this
partial overflow situation. Without this fix, pr48335-2.c on big-endian
will broken on those arch support bit insert instruction, like arm, aarch64
etc. */
if (bitsize + bitnum > unit && bitnum < unit)
{
warning (OPT_Wextra, "write of "HOST_WIDE_INT_PRINT_UNSIGNED"bit data "
"outside the bound of destination object, data truncated into "
HOST_WIDE_INT_PRINT_UNSIGNED"bit", bitsize, unit - bitnum);
bitsize = unit - bitnum;
}
/* If BITS_BIG_ENDIAN is zero on a BYTES_BIG_ENDIAN machine, we count
"backwards" from the size of the unit we are inserting into.
Otherwise, we count bits from the most significant on a