* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@52178
138bc75d-0d04-0410-961f-
82ee72b054a4
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.
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
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.
--- /dev/null
+/* 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);
+}