diff options
author | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-05 07:49:23 +0000 |
---|---|---|
committer | davem <davem@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-05 07:49:23 +0000 |
commit | c69803e943ce6b77ae1b341c127f1ee6b6388ff0 (patch) | |
tree | f6824af2b777762acf22ea8f02eb43aeea4dfccb /gcc/recog.c | |
parent | 52fb230685d611e3117bbf75cad9fa9c0769f5ff (diff) | |
download | gcc-c69803e943ce6b77ae1b341c127f1ee6b6388ff0.tar.gz |
2002-05-04 David S. Miller <davem@redhat.com>
* recog.c (store_data_bypass_p): Handle out_insn being a PARALLEL
of SETs.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53177 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/recog.c')
-rw-r--r-- | gcc/recog.c | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/gcc/recog.c b/gcc/recog.c index 2b85d4b0a25..2fd1126044a 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; } |