This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] Crossjumping corrupts alias info
- From: Andreas Krebbel <krebbel1 at de dot ibm dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 5 Mar 2004 15:34:28 +0100
- Subject: Re: [patch] Crossjumping corrupts alias info
- Organization: IBM Entwicklung GmbH
- References: <200402201750.05271.krebbel1@de.ibm.com> <20040220230123.GE29641@redhat.com>
Hi,
the included testcase fails without the patch.
Bye,
Andreas
2004-03-05 Andreas Krebbel <krebbel1@de.ibm.com>
* gcc.dg/20040305-1.c: New test.
*** /dev/null Wed Jan 28 15:57:09 2004
--- gcc/testsuite/gcc.dg/20040305-1.c Fri Mar 5 15:04:44 2004
***************
*** 0 ****
--- 1,50 ----
+
+ /* The testcase failed due to corrupted alias information.
+ During the crossjump analyzing step the mem alias info of the
+ st instructions are merged and get copied during basic block
+ reordering which leads to an insn with wrong alias info.
+ The scheduler afterwards exchanges the mvc and st instructions
+ not recognizing the anti dependence. */
+ /* { dg-do run { target s390-*-* } } */
+ /* { dg-options "-O3 -mtune=z990 -fno-inline" } */
+
+ int f;
+ int g;
+ int h;
+
+ int* x = &f;
+ int* p1 = &g;
+ int* p2 = &h;
+
+ int
+ foo(void)
+ {
+
+ if (*x == 0)
+ {
+ x = p1; /* mvc - memory to memory */
+ p1 = (int*)0; /* st - register to memory */
+ return 1;
+ }
+ if (*x == 5)
+ {
+ f = 1;
+ g = 2;
+
+ p2 = (int*)0; /* st */
+ return 1;
+ }
+ }
+
+ int
+ main (int argc, char** argv)
+ {
+ foo ();
+
+ /* If the scheduler has exchanged the mvc and st instructions,
+ x is 0. The expected result is &g. */
+ if (x == &g)
+ exit (0);
+ else
+ abort ();
+ }