OSDN Git Service

./:
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Dec 2009 04:27:55 +0000 (04:27 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 30 Dec 2009 04:27:55 +0000 (04:27 +0000)
PR middle-end/42099
* expmed.c (expand_divmod): Don't shift HOST_WIDE_INT value more
than HOST_BITS_PER_WIDE_INT.
testsuite/:
PR middle-end/42099
* gcc.c-torture/execute/20091229-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@155516 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/expmed.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20091229-1.c [new file with mode: 0644]

index a1160cf..6160bfc 100644 (file)
@@ -1,3 +1,9 @@
+2009-12-29  Ian Lance Taylor  <iant@google.com>
+
+       PR middle-end/42099
+       * expmed.c (expand_divmod): Don't shift HOST_WIDE_INT value more
+       than HOST_BITS_PER_WIDE_INT.
+
 2009-12-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/i386.c (ix86_expand_int_vcond): Reformat.
index d51b454..d1fea08 100644 (file)
@@ -4194,7 +4194,8 @@ expand_divmod (int rem_flag, enum tree_code code, enum machine_mode mode,
                else if (d == -1)
                  quotient = expand_unop (compute_mode, neg_optab, op0,
                                          tquotient, 0);
-               else if (abs_d == (unsigned HOST_WIDE_INT) 1 << (size - 1))
+               else if (HOST_BITS_PER_WIDE_INT >= size
+                        && abs_d == (unsigned HOST_WIDE_INT) 1 << (size - 1))
                  {
                    /* This case is not handled correctly below.  */
                    quotient = emit_store_flag (tquotient, EQ, op0, op1,
index 8be8a06..9afb291 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-29  Ian Lance Taylor  <iant@google.com>
+
+       PR middle-end/42099
+       * gcc.c-torture/execute/20091229-1.c: New test.
+
 2009-12-29  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/42517
diff --git a/gcc/testsuite/gcc.c-torture/execute/20091229-1.c b/gcc/testsuite/gcc.c-torture/execute/20091229-1.c
new file mode 100644 (file)
index 0000000..08d952f
--- /dev/null
@@ -0,0 +1,2 @@
+long long foo(long long v) { return v / -0x080000000LL; }
+void main() { if (foo(0x080000000LL) != -1) abort(); exit (0); }