aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-03-18 16:08:31 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-03-18 16:08:31 +0100
commitcbb927448701d9be3470beccedda24379db7faf4 (patch)
treea46abf7ba1f1a7b7d848a84dc7da3dfe4a47cd1f /gcc
parent0f4237c2da717bce4a222c696cb1ba468a3ff550 (diff)
downloadgcc-cbb927448701d9be3470beccedda24379db7faf4.zip
gcc-cbb927448701d9be3470beccedda24379db7faf4.tar.gz
gcc-cbb927448701d9be3470beccedda24379db7faf4.tar.bz2
re PR target/5740 (sparcv9 ICE on complex_value.cc in libstdc++ test suite)
PR target/5740 * expr.c (emit_group_load): Use extract_bit_field if needed for CONCAT arguments. * g++.dg/opt/conj1.C: New test. From-SVN: r50975
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expr.c17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/opt/conj1.C18
4 files changed, 39 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2425ba..e7ff6b2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR target/5740
+ * expr.c (emit_group_load): Use extract_bit_field if
+ needed for CONCAT arguments.
+
2002-03-18 Richard Earnshaw <rearnsha@arm.com>
PR target/4863
diff --git a/gcc/expr.c b/gcc/expr.c
index 5aed1dc..ebe05fc 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -2004,12 +2004,17 @@ emit_group_load (dst, orig_src, ssize)
}
else if (GET_CODE (src) == CONCAT)
{
- if (bytepos == 0
- && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
- tmps[i] = XEXP (src, 0);
- else if (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
- && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1))))
- tmps[i] = XEXP (src, 1);
+ if ((bytepos == 0
+ && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
+ || (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
+ && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1)))))
+ {
+ tmps[i] = XEXP (src, bytepos != 0);
+ if (! CONSTANT_P (tmps[i])
+ && (GET_CODE (tmps[i]) != REG || GET_MODE (tmps[i]) != mode))
+ tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
+ 0, 1, NULL_RTX, mode, mode, ssize);
+ }
else if (bytepos == 0)
{
rtx mem = assign_stack_temp (GET_MODE (src),
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2b1e3dc..c25a2f4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.dg/opt/conj1.C: New test.
+
2002-03-17 Mark Mitchell <mark@codesourcery.com>
* g++.dg/template/qualttp20.C: Revert previous change.
diff --git a/gcc/testsuite/g++.dg/opt/conj1.C b/gcc/testsuite/g++.dg/opt/conj1.C
new file mode 100644
index 0000000..b578abb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/conj1.C
@@ -0,0 +1,18 @@
+// PR target/5740
+// This testcase ICEd on SPARC -m64 because emit_group_load tried
+// to move a DFmode register into DImode register directly.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C
+{
+ C (double y, double z) { __real__ x = y; __imag__ x = z; }
+ double r () const { return __real__ x; }
+ double i () const { return __imag__ x; }
+ __complex__ double x;
+};
+
+C conj (const C& z)
+{
+ return C (z.r (), -z.i ());
+}