diff options
author | Richard Henderson <rth@redhat.com> | 2004-12-01 21:24:11 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-12-01 21:24:11 -0800 |
commit | 0becc98698a748a8b28af730ca55986fa02b9811 (patch) | |
tree | cb213fe6556612dd6e1bfda35aac8ccf3abaff8e /gcc | |
parent | ca3a791a1692d3f0890b647f2b860cfa5e7ea678 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/complex-3.c | 25 |
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. @@ -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); +} |