]> 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 19:50:24 +0000 (19:50 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 30 Dec 2009 19:50:24 +0000 (19:50 +0000)
gcc/:
PR middle-end/42099
* expmed.c (expand_divmod): Don't shift HOST_WIDE_INT value more
than HOST_BITS_PER_WIDE_INT.
gcc/testsuite/:
PR middle-end/42099
* gcc.c-torture/execute/20091229-1.c: New test.

From-SVN: r155525

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

index 298372b8bc188df7995a5276206b18a69c1fbb7e..4d020f8b45254164c84dd6c3d45131afca7a1cfb 100644 (file)
@@ -1,3 +1,9 @@
+2009-12-30  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-30  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/42549
index dc61de73ee29681012307c38a1f7b909f15fe342..c1233aacb5abcb524d8e82771f1b40f726dc0609 100644 (file)
@@ -4136,7 +4136,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 f4182a303be4038bea36c740e6f64e470cb965d0..71954430f73b99b5901b76d1a759c0f26892b56e 100644 (file)
@@ -1,3 +1,8 @@
+2009-12-30  Ian Lance Taylor  <iant@google.com>
+
+       PR middle-end/42099
+       * gcc.c-torture/execute/20091229-1.c: New test.
+
 2009-12-30  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/42549
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); }