summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-04-11 23:04:09 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2002-04-11 23:04:09 +0200
commit010f87c44f88d3dc30313f1b69f9ed85fe4c6630 (patch)
tree402f6049ff39cd859a6119c0c4355dc42a33f33b
parent578fc63d144bcd49d723090a9c24f4cd69ce621d (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/expr.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020411-1.c25
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);
+}