microblaze testing in my tester has occasionally been failing
Warray-bounds-40 and Wstringop-overflow-9. I finally took a little peek
because these occasional failures show up as a regression against the
prior run.
It looks like the microblaze backend is trying to inline a move of
SIZE_MAX bytes. Ugh. Not surprisingly the problem is the target bits
treating the size as a signed integer in a comparison.
Fixing this is pretty simple thankfully. I didn't audit the entire
port, just microblaze_expand_block_move.
Here's what I'm installing on the trunk -- it basically ensures we treat
the size and alignment as unsigned values. It also fixes errors with
string-large-1.c.
Jeff
* config/microblaze/microblaze.c (microblaze_expand_block_move): Treat
size and alignment as unsigned.
diff --git a/gcc/config/microblaze/microblaze.c
b/gcc/config/microblaze/microblaze.c
index 70910fd1dde..55c1becf975 100644
--- a/gcc/config/microblaze/microblaze.c
+++ b/gcc/config/microblaze/microblaze.c
@@ -1258,8 +1258,8 @@ microblaze_expand_block_move (rtx dest, rtx src, rtx
length, rtx align_rtx)
if (GET_CODE (length) == CONST_INT)
{
- HOST_WIDE_INT bytes = INTVAL (length);
- int align = INTVAL (align_rtx);
+ unsigned HOST_WIDE_INT bytes = UINTVAL (length);
+ unsigned int align = UINTVAL (align_rtx);
if (align > UNITS_PER_WORD)
{
@@ -1267,7 +1267,7 @@ microblaze_expand_block_move (rtx dest, rtx src, rtx
length, rtx align_rtx)
}
else if (align < UNITS_PER_WORD)
{
- if (INTVAL (length) <= MAX_MOVE_BYTES)
+ if (UINTVAL (length) <= MAX_MOVE_BYTES)
{
move_by_pieces (dest, src, bytes, align, RETURN_BEGIN);
return true;
@@ -1276,14 +1276,14 @@ microblaze_expand_block_move (rtx dest, rtx src, rtx
length, rtx align_rtx)
return false;
}
- if (INTVAL (length) <= 2 * MAX_MOVE_BYTES)
+ if (UINTVAL (length) <= 2 * MAX_MOVE_BYTES)
{
- microblaze_block_move_straight (dest, src, INTVAL (length));
+ microblaze_block_move_straight (dest, src, UINTVAL (length));
return true;
}
else if (optimize)
{
- microblaze_block_move_loop (dest, src, INTVAL (length));
+ microblaze_block_move_loop (dest, src, UINTVAL (length));
return true;
}
}