aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcse.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2007-04-21 06:48:37 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2007-04-21 06:48:37 +0000
commit1071bcbdf8aae725654a6af0378112c351ee0d71 (patch)
tree453b4b811e202e10cc059d2b5983b89bee93f6fc /gcc/gcse.c
parentc7a2139bef08cdc8fde38d3d59d88fd2c689e681 (diff)
downloadgcc-1071bcbdf8aae725654a6af0378112c351ee0d71.zip
gcc-1071bcbdf8aae725654a6af0378112c351ee0d71.tar.gz
gcc-1071bcbdf8aae725654a6af0378112c351ee0d71.tar.bz2
gcse.c (store_killed_in_insn): Handle PARALLELs.
gcc/ChangeLog: * gcse.c (store_killed_in_insn): Handle PARALLELs. (store_killed_in_pat): New. gcc/testsuite/ChangeLog: * gcc.target/i386/movsi-sm-1.c: New. From-SVN: r124015
Diffstat (limited to 'gcc/gcse.c')
-rw-r--r--gcc/gcse.c69
1 files changed, 45 insertions, 24 deletions
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 36b2c8f9..70c89ef 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -5909,6 +5909,39 @@ find_loads (rtx x, rtx store_pattern, int after)
return ret;
}
+static inline bool
+store_killed_in_pat (rtx x, rtx pat, int after)
+{
+ if (GET_CODE (pat) == SET)
+ {
+ rtx dest = SET_DEST (pat);
+
+ if (GET_CODE (dest) == ZERO_EXTRACT)
+ dest = XEXP (dest, 0);
+
+ /* Check for memory stores to aliased objects. */
+ if (MEM_P (dest)
+ && !expr_equiv_p (dest, x))
+ {
+ if (after)
+ {
+ if (output_dependence (dest, x))
+ return true;
+ }
+ else
+ {
+ if (output_dependence (x, dest))
+ return true;
+ }
+ }
+ }
+
+ if (find_loads (pat, x, after))
+ return true;
+
+ return false;
+}
+
/* Check if INSN kills the store pattern X (is aliased with it).
AFTER is true if we are checking the case when store X occurs
after the insn. Return true if it does. */
@@ -5916,7 +5949,7 @@ find_loads (rtx x, rtx store_pattern, int after)
static bool
store_killed_in_insn (rtx x, rtx x_regs, rtx insn, int after)
{
- rtx reg, base, note;
+ rtx reg, base, note, pat;
if (!INSN_P (insn))
return false;
@@ -5943,32 +5976,20 @@ store_killed_in_insn (rtx x, rtx x_regs, rtx insn, int after)
return false;
}
- if (GET_CODE (PATTERN (insn)) == SET)
+ pat = PATTERN (insn);
+ if (GET_CODE (pat) == SET)
{
- rtx pat = PATTERN (insn);
- rtx dest = SET_DEST (pat);
-
- if (GET_CODE (dest) == ZERO_EXTRACT)
- dest = XEXP (dest, 0);
-
- /* Check for memory stores to aliased objects. */
- if (MEM_P (dest)
- && !expr_equiv_p (dest, x))
- {
- if (after)
- {
- if (output_dependence (dest, x))
- return true;
- }
- else
- {
- if (output_dependence (x, dest))
- return true;
- }
- }
- if (find_loads (SET_SRC (pat), x, after))
+ if (store_killed_in_pat (x, pat, after))
return true;
}
+ else if (GET_CODE (pat) == PARALLEL)
+ {
+ int i;
+
+ for (i = 0; i < XVECLEN (pat, 0); i++)
+ if (store_killed_in_pat (x, XVECEXP (pat, 0, i), after))
+ return true;
+ }
else if (find_loads (PATTERN (insn), x, after))
return true;