aboutsummaryrefslogtreecommitdiff
path: root/gcc/recog.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2002-05-05 00:49:23 -0700
committerDavid S. Miller <davem@gcc.gnu.org>2002-05-05 00:49:23 -0700
commit091fb516144007611bcbd318e8eff9300488353c (patch)
treef6824af2b777762acf22ea8f02eb43aeea4dfccb /gcc/recog.c
parent7750f790618de6377fd65a06b23dfd588d8166d7 (diff)
downloadgcc-091fb516144007611bcbd318e8eff9300488353c.zip
gcc-091fb516144007611bcbd318e8eff9300488353c.tar.gz
gcc-091fb516144007611bcbd318e8eff9300488353c.tar.bz2
recog.c (store_data_bypass_p): Handle out_insn being a PARALLEL of SETs.
2002-05-04 David S. Miller <davem@redhat.com> * recog.c (store_data_bypass_p): Handle out_insn being a PARALLEL of SETs. From-SVN: r53177
Diffstat (limited to 'gcc/recog.c')
-rw-r--r--gcc/recog.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/gcc/recog.c b/gcc/recog.c
index 2b85d4b..2fd1126 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -3279,8 +3279,9 @@ peephole2_optimize (dump_file)
/* Common predicates for use with define_bypass. */
/* True if the dependency between OUT_INSN and IN_INSN is on the store
- data not the address operand(s) of the store. Both OUT_INSN and IN_INSN
- must be single_set. */
+ data not the address operand(s) of the store. IN_INSN must be
+ single_set. OUT_INSN must be either a single_set or a PARALLEL with
+ SETs inside. */
int
store_data_bypass_p (out_insn, in_insn)
@@ -3288,10 +3289,6 @@ store_data_bypass_p (out_insn, in_insn)
{
rtx out_set, in_set;
- out_set = single_set (out_insn);
- if (! out_set)
- abort ();
-
in_set = single_set (in_insn);
if (! in_set)
abort ();
@@ -3299,8 +3296,32 @@ store_data_bypass_p (out_insn, in_insn)
if (GET_CODE (SET_DEST (in_set)) != MEM)
return false;
- if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
- return false;
+ out_set = single_set (out_insn);
+ if (out_set)
+ {
+ if (reg_mentioned_p (SET_DEST (out_set), SET_DEST (in_set)))
+ return false;
+ }
+ else
+ {
+ rtx out_pat;
+ int i;
+
+ out_pat = PATTERN (out_insn);
+ if (GET_CODE (out_pat) != PARALLEL)
+ abort ();
+
+ for (i = 0; i < XVECLEN (out_pat, 0); i++)
+ {
+ rtx exp = XVECEXP (out_pat, 0, i);
+
+ if (GET_CODE (exp) != SET)
+ abort ();
+
+ if (reg_mentioned_p (SET_DEST (exp), SET_DEST (in_set)))
+ return false;
+ }
+ }
return true;
}