diff mbox

Fix undefined behaviour in rx port

Message ID 560ABD0C.1080805@redhat.com
State New
Headers show

Commit Message

Jeff Law Sept. 29, 2015, 4:32 p.m. UTC
And the rx port.  Tested by building the rx targets in config-all.mk.

Installed on the trunk.

Jeff
commit 67dd8bdfba4072f24ea1a2bd07ffacc91185ee89
Author: Jeff Law <law@tor.usersys.redhat.com>
Date:   Mon Sep 28 19:25:14 2015 -0400

    [PATCH] Fix undefined behaviour in rx port
            * config/rx/constraints.md (Int08): Fix undefined left shift
            behaviour.
            (Sint08, Sint16, Sint24): Likewise.
            * config/rx/rx.c (rx_get_stack_layout): Likewise.
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 79dc89f..53a52a6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@ 
 2015-09-29  Jeff Law  <law@redhat.com>
 
+	* config/rx/constraints.md (Int08): Fix undefined left shift
+	behaviour.
+	(Sint08, Sint16, Sint24): Likewise.
+	* config/rx/rx.c (rx_get_stack_layout): Likewise.
+
 	* config/rl78/rl78-expand.md (movqi): Fix undefined left shift
 	behaviour.
 
diff --git a/gcc/config/rx/constraints.md b/gcc/config/rx/constraints.md
index d46f9da..b41c232 100644
--- a/gcc/config/rx/constraints.md
+++ b/gcc/config/rx/constraints.md
@@ -28,28 +28,28 @@ 
 (define_constraint "Int08"
   "@internal A signed or unsigned 8-bit immediate value"
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, (-1 << 8), (1 << 8) - 1)")
+       (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 8), (1 << 8) - 1)")
   )
 )
 
 (define_constraint "Sint08"
   "@internal A signed 8-bit immediate value"
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, (-1 << 7), (1 << 7) - 1)")
+       (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 7), (1 << 7) - 1)")
   )
 )
 
 (define_constraint "Sint16"
   "@internal A signed 16-bit immediate value"
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, (-1 << 15), (1 << 15) - 1)")
+       (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 15), (1 << 15) - 1)")
   )
 )
 
 (define_constraint "Sint24"
   "@internal A signed 24-bit immediate value"
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, (-1 << 23), (1 << 23) - 1)")
+       (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 23), (1 << 23) - 1)")
   )
 )
 
diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c
index c68f29e..6d911d2 100644
--- a/gcc/config/rx/rx.c
+++ b/gcc/config/rx/rx.c
@@ -1561,7 +1561,7 @@  rx_get_stack_layout (unsigned int * lowest,
      PUSHM.
 
      FIXME: Is it worth improving this heuristic ?  */
-  pushed_mask = (-1 << low) & ~(-1 << (high + 1));
+  pushed_mask = (HOST_WIDE_INT_M1U << low) & ~(HOST_WIDE_INT_M1U << (high + 1));
   unneeded_pushes = (pushed_mask & (~ save_mask)) & pushed_mask;
 
   if ((fixed_reg && fixed_reg <= high)
@@ -1667,7 +1667,7 @@  ok_for_max_constant (HOST_WIDE_INT val)
 
   /* rx_max_constant_size specifies the maximum number
      of bytes that can be used to hold a signed value.  */
-  return IN_RANGE (val, (-1 << (rx_max_constant_size * 8)),
+  return IN_RANGE (val, (HOST_WIDE_INT_M1U << (rx_max_constant_size * 8)),
 		        ( 1 << (rx_max_constant_size * 8)));
 }