aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-12-01 21:24:11 -0800
committerRichard Henderson <rth@gcc.gnu.org>2004-12-01 21:24:11 -0800
commit0becc98698a748a8b28af730ca55986fa02b9811 (patch)
treecb213fe6556612dd6e1bfda35aac8ccf3abaff8e /gcc
parentca3a791a1692d3f0890b647f2b860cfa5e7ea678 (diff)
downloadgcc-0becc98698a748a8b28af730ca55986fa02b9811.zip
gcc-0becc98698a748a8b28af730ca55986fa02b9811.tar.gz
gcc-0becc98698a748a8b28af730ca55986fa02b9811.tar.bz2
expr.c (expand_assignment): Handle CONCAT both as a final destination and as a middle point.
* expr.c (expand_assignment): Handle CONCAT both as a final destination and as a middle point. From-SVN: r91614
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/expr.c12
-rw-r--r--gcc/testsuite/gcc.dg/complex-3.c25
3 files changed, 40 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6c7d2a0..7e4bd4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-12-01 Richard Henderson <rth@redhat.com>
+
+ * expr.c (expand_assignment): Handle CONCAT both as a final
+ destination and as a middle point.
+
2004-12-01 Jeff Law <law@redhat.com>
* tree.h (save_eptr, save_filt): Now file scoped statics.
diff --git a/gcc/expr.c b/gcc/expr.c
index 4616f21..f16f82f 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -3757,8 +3757,16 @@ expand_assignment (tree to, tree from)
/* Handle expand_expr of a complex value returning a CONCAT. */
if (GET_CODE (to_rtx) == CONCAT)
{
- gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1));
- result = store_expr (from, XEXP (to_rtx, bitpos != 0), false);
+ if (TREE_CODE (TREE_TYPE (from)) == COMPLEX_TYPE)
+ {
+ gcc_assert (bitpos == 0);
+ result = store_expr (from, to_rtx, false);
+ }
+ else
+ {
+ gcc_assert (bitpos == 0 || bitpos == GET_MODE_BITSIZE (mode1));
+ result = store_expr (from, XEXP (to_rtx, bitpos != 0), false);
+ }
}
else
{
diff --git a/gcc/testsuite/gcc.dg/complex-3.c b/gcc/testsuite/gcc.dg/complex-3.c
new file mode 100644
index 0000000..54ec82c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/complex-3.c
@@ -0,0 +1,25 @@
+/* Verify that rtl expansion cleanup doesn't get too aggressive about
+ code dealing with complex CONCATs. */
+/* { dg-do run } */
+/* { dg-options "-O -fno-tree-sra" } */
+
+extern void abort (void);
+extern void exit (int);
+
+__complex__ float foo (void)
+{
+ __complex__ float f[1];
+ __real__ f[0] = 1;
+ __imag__ f[0] = 1;
+ f[0] = __builtin_conjf (f[0]);
+ return f[0];
+}
+
+int main (void)
+{
+ __complex__ double d[1];
+ d[0] = foo ();
+ if (__real__ d[0] != 1 || __imag__ d[0] != -1)
+ abort ();
+ exit (0);
+}