[PATCH] Fix undefined behaviour in arc port
authorJeff Law <law@redhat.com>
Sat, 26 Sep 2015 07:48:10 +0000 (01:48 -0600)
committerJeff Law <law@gcc.gnu.org>
Sat, 26 Sep 2015 07:48:10 +0000 (01:48 -0600)
* config/arc/arc.c (arc_output_addsi): Fix left shift undefined
behaviour.
* config/arc/constraints.md (Cca, C2a): Fix left shift undefined
behaviour.

From-SVN: r228166

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

index 28c6bf7fcc93b1f5e542bca050b9dba58d644873..01fac466660956b2f86875e297fc2da4476154a5 100644 (file)
@@ -1,5 +1,10 @@
 2015-09-26  Jeff Law  <law@redhat.com>
 
+       * config/arc/arc.c (arc_output_addsi): Fix left shift undefined
+       behaviour.
+       * config/arc/constraints.md (Cca, C2a): Fix left shift undefined
+       behaviour.
+
        * config/sh/sh.h (CONST_OK_FOR_J16): Fix left shift undefined
        behaviour
 
index e9ecc908cb8134e13731c9bf459925840a5c0c94..4d731b53f6c5e0775fabd6905ee1c39071d36185 100644 (file)
@@ -7393,7 +7393,7 @@ arc_output_addsi (rtx *operands, bool cond_p, bool output_p)
       int range_factor = neg_intval & intval;
       int shift;
 
-      if (intval == -1 << 31)
+      if (intval == (HOST_WIDE_INT) (HOST_WIDE_INT_M1U << 31))
        ADDSI_OUTPUT1 ("bxor%? %0,%1,31");
 
       /* If we can use a straight add / sub instead of a {add,sub}[123] of
@@ -9320,7 +9320,9 @@ arc_legitimize_reload_address (rtx *p, machine_mode mode, int opnum,
       if ((scale-1) & offset)
        scale = 1;
       shift = scale >> 1;
-      offset_base = (offset + (256 << shift)) & (-512 << shift);
+      offset_base
+       = ((offset + (256 << shift))
+          & ((HOST_WIDE_INT)(-512U << shift)));
       /* Sometimes the normal form does not suit DImode.  We
         could avoid that by using smaller ranges, but that
         would give less optimized code when SImode is
index 8902246ff21d3c88c01bce175e901d6ca97d18eb..b3ea115fc03496b5cb5c32f373e1f9089a832185 100644 (file)
   "@internal
    Conditional or three-address add / sub constant"
   (and (match_code "const_int")
-       (match_test "ival == -1 << 31
+       (match_test "ival == (HOST_WIDE_INT)(HOST_WIDE_INT_M1U << 31)
                    || (ival >= -0x1f8 && ival <= 0x1f8
                        && ((ival >= 0 ? ival : -ival)
                            <= 0x3f * (ival & -ival)))")))
   "@internal
    Unconditional two-address add / sub constant"
   (and (match_code "const_int")
-       (match_test "ival == -1 << 31
+       (match_test "ival == HOST_WIDE_INT (HOST_WIDE_INT_M1U << 31)
                    || (ival >= -0x4000 && ival <= 0x4000
                        && ((ival >= 0 ? ival : -ival)
                            <= 0x7ff * (ival & -ival)))")))