aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2009-12-30 04:27:55 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2009-12-30 04:27:55 +0000
commitf6c1336cbe8141888509784439820059577d71e6 (patch)
tree03d1858f5536ff744bb7faa4ecf0079b08f752d4
parent53bc54ecc08c35b05c33cf3493c90af73bcc6478 (diff)
downloadgcc-f6c1336cbe8141888509784439820059577d71e6.zip
gcc-f6c1336cbe8141888509784439820059577d71e6.tar.gz
gcc-f6c1336cbe8141888509784439820059577d71e6.tar.bz2
re PR middle-end/42099 (Error in 64-bit division for 32-bit target)
./: 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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20091229-1.c2
4 files changed, 15 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a1160cf..6160bfc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/expmed.c b/gcc/expmed.c
index d51b454..d1fea08 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -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,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8be8a06..9afb291 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..08d952f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20091229-1.c
@@ -0,0 +1,2 @@
+long long foo(long long v) { return v / -0x080000000LL; }
+void main() { if (foo(0x080000000LL) != -1) abort(); exit (0); }