+2009-12-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/42475
+ * combine.c (make_compound_operation) <case SUBREG>: Use mode of
+ SUBREG_REG (x) instead of tem's mode.
+
2009-12-23 Jakub Jelinek <jakub@redhat.com>
Cary Coutant <ccoutant@google.com>
tem = make_compound_operation (SUBREG_REG (x), in_code);
{
- rtx simplified;
- simplified = simplify_subreg (GET_MODE (x), tem, GET_MODE (tem),
- SUBREG_BYTE (x));
+ rtx simplified = simplify_subreg (mode, tem, GET_MODE (SUBREG_REG (x)),
+ SUBREG_BYTE (x));
if (simplified)
tem = simplified;
if (GET_CODE (tem) != GET_CODE (SUBREG_REG (x))
- && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (tem))
+ && GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))
&& subreg_lowpart_p (x))
{
rtx newer = force_to_mode (tem, mode, ~(HOST_WIDE_INT) 0,
+2009-12-23 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/42475
+ * gcc.dg/pr42475.c: New test.
+
2009-12-23 Jakub Jelinek <jakub@redhat.com>
Cary Coutant <ccoutant@google.com>
--- /dev/null
+/* PR rtl-optimization/42475 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef struct { float x, y; } B;
+typedef struct { float z; } C;
+typedef struct { B b; C c; } D;
+
+B
+foo (float x, float y)
+{
+ B b = { .x = x, .y = y };
+ return b;
+}
+
+B
+bar (B b, B y)
+{
+ return foo (y.x + b.x, b.y);
+}
+
+B
+baz (D p)
+{
+ D d = { };
+ B y = bar (foo (0, (p.c.z) / 2), d.b);
+ return y;
+}