diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-04-11 23:04:09 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-04-11 23:04:09 +0200 |
commit | 010f87c44f88d3dc30313f1b69f9ed85fe4c6630 (patch) | |
tree | 402f6049ff39cd859a6119c0c4355dc42a33f33b | |
parent | 578fc63d144bcd49d723090a9c24f4cd69ce621d (diff) | |
download | gcc-010f87c44f88d3dc30313f1b69f9ed85fe4c6630.tar.gz |
re PR rtl-optimization/6177 (ia64 ICE with single-element complex array in LAPACK)
PR optimization/6177
* expr.c (expand_expr) [COMPONENT_REF]: Handle op0 CONCAT if
bitpos is 0 and bitsize CONCAT size.
* gcc.c-torture/execute/20020411-1.c: New test.
From-SVN: r52178
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expr.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20020411-1.c | 25 |
4 files changed, 43 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 34c0f0faef5..58f921dec24 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2002-04-11 Jakub Jelinek <jakub@redhat.com> + PR optimization/6177 + * expr.c (expand_expr) [COMPONENT_REF]: Handle op0 CONCAT if + bitpos is 0 and bitsize CONCAT size. + +2002-04-11 Jakub Jelinek <jakub@redhat.com> + PR c/6223 * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz. diff --git a/gcc/expr.c b/gcc/expr.c index 3e0add257f7..a9ca3f6613b 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6954,6 +6954,16 @@ expand_expr (exp, target, tmode, modifier) MEM_VOLATILE_P (op0) = 1; } + /* The following code doesn't handle CONCAT. + Assume only bitpos == 0 can be used for CONCAT, due to + one element arrays having the same mode as its element. */ + if (GET_CODE (op0) == CONCAT) + { + if (bitpos != 0 || bitsize != GET_MODE_BITSIZE (GET_MODE (op0))) + abort (); + return op0; + } + /* In cases where an aligned union has an unaligned object as a field, we might be extracting a BLKmode value from an integer-mode (e.g., SImode) object. Handle this case diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index df40cb497fc..ccabe18f899 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,10 +1,9 @@ 2002-04-11 Jakub Jelinek <jakub@redhat.com> - PR c/6223 - * combine.c (if_then_else_cond): Use trunc_int_for_mode on nz. - * gcc.dg/20020411-1.c: New test. + * gcc.c-torture/execute/20020411-1.c: New test. + 2002-04-10 Janis Johnson <janis187@us.ibm.com> * g77.f-torture/execute/6177.f: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/20020411-1.c b/gcc/testsuite/gcc.c-torture/execute/20020411-1.c new file mode 100644 index 00000000000..89e2bae703b --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20020411-1.c @@ -0,0 +1,25 @@ +/* PR optimization/6177 + This testcase ICEd because expr.c did not expect to see a CONCAT + as array rtl. */ + +extern void abort (void); +extern void exit (int); + +__complex__ float foo (void) +{ + __complex__ float f[1]; + __real__ f[0] = 1.0; + __imag__ f[0] = 1.0; + f[0] = __builtin_conjf (f[0]); + return f[0]; +} + +int main (void) +{ + __complex__ double d[1]; + d[0] = foo (); + if (__real__ d[0] != 1.0 + || __imag__ d[0] != -1.0) + abort (); + exit (0); +} |