[PATCH] Fix undefined behaviour in msp430 port
authorJeff Law <law@redhat.com>
Tue, 29 Sep 2015 16:25:21 +0000 (10:25 -0600)
committerJeff Law <law@gcc.gnu.org>
Tue, 29 Sep 2015 16:25:21 +0000 (10:25 -0600)
       * config/msp430/msp430.c (msp430_legitimate_constant): Fix undefined
        left shift behaviour.
        * config/msp430/constraints.md ('L' constraint): Similarly.
        ('Ys' constraint): Similarly.

From-SVN: r228251

gcc/ChangeLog
gcc/config/msp430/constraints.md
gcc/config/msp430/msp430.c

index 03f566c2cd96a0fda4f620dc8578dd844f20b8f8..1b9985af4daaefe45bcbed304254e50133d17a3c 100644 (file)
@@ -1,3 +1,10 @@
+2015-09-29  Jeff Law  <law@redhat.com>
+
+       * config/msp430/msp430.c (msp430_legitimate_constant): Fix undefined
+       left shift behaviour.
+       * config/msp430/constraints.md ('L' constraint): Similarly.
+       ('Ys' constraint): Similarly.
+
 2015-09-29  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/67170
index 30f944c790e193998c4d3e3c415cdac8540fa85d..dfda1528a0436d88125c3eb24aaf1e73a5961225 100644 (file)
@@ -32,7 +32,7 @@
 (define_constraint "L"
   "Integer constant -1^20..1^19."
   (and (match_code "const_int")
-       (match_test "IN_RANGE (ival, -1 << 20, 1 << 19)")))
+       (match_test "IN_RANGE (ival, HOST_WIDE_INT_M1U << 20, 1 << 19)")))
 
 (define_constraint "M"
   "Integer constant 1-4."
@@ -77,7 +77,7 @@
        (and (match_code "plus" "0")
             (and (match_code "reg" "00")
                  (match_test ("CONST_INT_P (XEXP (XEXP (op, 0), 1))"))
-                 (match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), -1 << 15, (1 << 15)-1)"))))
+                 (match_test ("IN_RANGE (INTVAL (XEXP (XEXP (op, 0), 1)), HOST_WIDE_INT_M1U << 15, (1 << 15)-1)"))))
        (match_code "reg" "0")
        )))
 
index d2308cb064d1b4dcdcb0be50fb8bf3e0538509bc..ba8d862884604e3d901f7576603bd59b479f44bb 100644 (file)
@@ -998,7 +998,7 @@ msp430_legitimate_constant (machine_mode mode, rtx x)
     /* GCC does not know the width of the PSImode, so make
        sure that it does not try to use a constant value that
        is out of range.  */
-    || (INTVAL (x) < (1 << 20) && INTVAL (x) >= (-1 << 20));
+    || (INTVAL (x) < (1 << 20) && INTVAL (x) >= (HOST_WIDE_INT)(HOST_WIDE_INT_M1U << 20));
 }
 
 \f