]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/42099 (Error in 64-bit division for 32-bit target)
authorIan Lance Taylor <iant@google.com>
Wed, 30 Dec 2009 04:27:55 +0000 (04:27 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
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.

From-SVN: r155516

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

index a1160cfcb7fb2a553c2e70a7ebd58b8633980f3f..6160bfc3520eacf7946f0a1ab12ae6d640189636 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 d51b45426778b34762eca666fff7bc98bd69ba96..d1fea0818c2db417dc2399b7ad6ecf51eb20b802 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 8be8a062c451ad2c56bf47d9c3fa43211e1200c9..9afb291acd5310c46ed7619b49a122de0956b513 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); }