aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/combine.c19
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e23395e..82649c55 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2002-02-14 Alexandre Oliva <aoliva@redhat.com>
+ * combine.c (known_cond): After replacing the REG of a SUBREG, try
+ to simplify it.
+
* function.c (assign_parms): Demote promoted argument passed by
transparent reference.
diff --git a/gcc/combine.c b/gcc/combine.c
index ba0bf35..5abda2e 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -7430,6 +7430,25 @@ known_cond (x, cond, reg, val)
}
}
}
+ else if (code == SUBREG)
+ {
+ enum machine_mode inner_mode = GET_MODE (SUBREG_REG (x));
+ rtx new, r = known_cond (SUBREG_REG (x), cond, reg, val);
+
+ if (SUBREG_REG (x) != r)
+ {
+ /* We must simplify subreg here, before we lose track of the
+ original inner_mode. */
+ new = simplify_subreg (GET_MODE (x), r,
+ inner_mode, SUBREG_BYTE (x));
+ if (new)
+ return new;
+ else
+ SUBST (SUBREG_REG (x), r);
+ }
+
+ return x;
+ }
fmt = GET_RTX_FORMAT (code);
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)