diff mbox series

[committed] Fix various microblaze-linux failures

Message ID 2e40b940-62c1-2152-9256-6754a96e3172@redhat.com
State New
Headers show
Series [committed] Fix various microblaze-linux failures | expand

Commit Message

Jeff Law April 15, 2019, 9:20 p.m. UTC
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 mbox series

Patch

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;
 	}
     }