Commit 2e4e39f6 by Andreas Krebbel Committed by Andreas Krebbel

re PR target/35258 (two memcpy calls merged incorrectly with -O1)

2008-02-25  Andreas Krebbel  <krebbel1@de.ibm.com>

	PR target/35258
	* cse.c (cse_insn): Avoid creation of overlapping MEMs.
	* alias.c (nonoverlapping_memrefs_p): Export for use in other modules.
	* alias.h (nonoverlapping_memrefs_p): Likewise.

2008-02-25  Andreas Krebbel  <krebbel1@de.ibm.com>

	PR target/35258
	* gcc.dg/pr35258.c: New testcase.

From-SVN: r132628
parent 891984af
2008-02-25 Andreas Krebbel <krebbel1@de.ibm.com>
PR target/35258
* cse.c (cse_insn): Avoid creation of overlapping MEMs.
* alias.c (nonoverlapping_memrefs_p): Export for use in other modules.
* alias.h (nonoverlapping_memrefs_p): Likewise.
2008-02-25 Jan Beulich <jbeulich@novell.com> 2008-02-25 Jan Beulich <jbeulich@novell.com>
* Makefile.in: Also prefix uses of crt0.o and mcrt0.o with * Makefile.in: Also prefix uses of crt0.o and mcrt0.o with
......
...@@ -164,7 +164,6 @@ static int aliases_everything_p (const_rtx); ...@@ -164,7 +164,6 @@ static int aliases_everything_p (const_rtx);
static bool nonoverlapping_component_refs_p (const_tree, const_tree); static bool nonoverlapping_component_refs_p (const_tree, const_tree);
static tree decl_for_component_ref (tree); static tree decl_for_component_ref (tree);
static rtx adjust_offset_for_component_ref (tree, rtx); static rtx adjust_offset_for_component_ref (tree, rtx);
static int nonoverlapping_memrefs_p (const_rtx, const_rtx);
static int write_dependence_p (const_rtx, const_rtx, int); static int write_dependence_p (const_rtx, const_rtx, int);
static void memory_modified_1 (rtx, const_rtx, void *); static void memory_modified_1 (rtx, const_rtx, void *);
...@@ -1976,7 +1975,7 @@ adjust_offset_for_component_ref (tree x, rtx offset) ...@@ -1976,7 +1975,7 @@ adjust_offset_for_component_ref (tree x, rtx offset)
/* Return nonzero if we can determine the exprs corresponding to memrefs /* Return nonzero if we can determine the exprs corresponding to memrefs
X and Y and they do not overlap. */ X and Y and they do not overlap. */
static int int
nonoverlapping_memrefs_p (const_rtx x, const_rtx y) nonoverlapping_memrefs_p (const_rtx x, const_rtx y)
{ {
tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y); tree exprx = MEM_EXPR (x), expry = MEM_EXPR (y);
......
...@@ -28,6 +28,7 @@ extern alias_set_type get_varargs_alias_set (void); ...@@ -28,6 +28,7 @@ extern alias_set_type get_varargs_alias_set (void);
extern alias_set_type get_frame_alias_set (void); extern alias_set_type get_frame_alias_set (void);
extern bool component_uses_parent_alias_set (const_tree); extern bool component_uses_parent_alias_set (const_tree);
extern bool alias_set_subset_of (alias_set_type, alias_set_type); extern bool alias_set_subset_of (alias_set_type, alias_set_type);
extern int nonoverlapping_memrefs_p (const_rtx, const_rtx);
/* This alias set can be used to force a memory to conflict with all /* This alias set can be used to force a memory to conflict with all
other memories, creating a barrier across which no memory reference other memories, creating a barrier across which no memory reference
......
...@@ -4753,6 +4753,23 @@ cse_insn (rtx insn, rtx libcall_insn) ...@@ -4753,6 +4753,23 @@ cse_insn (rtx insn, rtx libcall_insn)
src_elt_cost = MAX_COST; src_elt_cost = MAX_COST;
} }
/* Avoid creation of overlapping memory moves. */
if (MEM_P (trial) && MEM_P (SET_DEST (sets[i].rtl)))
{
rtx src, dest;
/* BLKmode moves are not handled by cse anyway. */
if (GET_MODE (trial) == BLKmode)
break;
src = canon_rtx (trial);
dest = canon_rtx (SET_DEST (sets[i].rtl));
if (!MEM_P (src) || !MEM_P (dest)
|| !nonoverlapping_memrefs_p (src, dest))
break;
}
/* We don't normally have an insn matching (set (pc) (pc)), so /* We don't normally have an insn matching (set (pc) (pc)), so
check for this separately here. We will delete such an check for this separately here. We will delete such an
insn below. insn below.
......
2008-02-25 Andreas Krebbel <krebbel1@de.ibm.com>
PR target/35258
* gcc.dg/pr35258.c: New testcase.
2008-02-25 Jan Beulich <jbeulich@novell.com> 2008-02-25 Jan Beulich <jbeulich@novell.com>
* gcc.dg/20020426-2.c: Remove bogus workaround. * gcc.dg/20020426-2.c: Remove bogus workaround.
/* { dg-do run } */
/* { dg-options "-O1" } */
extern void *memcpy (void *, const void *, __SIZE_TYPE__);
extern int memcmp (const void *, const void *, __SIZE_TYPE__);
extern void abort(void);
char str[9] = "1234";
void
bar (void)
{
unsigned int temp;
char *p = &str[2];
memcpy (&temp, &str[1], 4);
memcpy (p, &temp, 4);
str[1] = '.';
}
int main()
{
bar();
if (memcmp (str, "1.234", 5) != 0)
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment