Patchwork [rs6000,trunk,4.7,4.6,4.5] Fix PR52457, wrong code for -O1 -m32 -mcpu=power7

login
register
mail settings
Submitter Peter Bergner
Date March 2, 2012, 3:57 p.m.
Message ID <1330703856.29904.3.camel@otta>
Download mbox | patch
Permalink /patch/144277/
State New
Headers show

Comments

Peter Bergner - March 2, 2012, 3:57 p.m.
The patch below fixes a typo in the vsx_set_<mode> pattern that causes
wrong code to be generated when using -mcpu=power7.  This passed bootstrap
and regression testing on trunk using powerpc64-linux.  Ok for trunk?

This is also broken on the 4.7, 4.6 and 4.5 branches, is this ok for
those release branches once the branches are open for fixes and my
bootstrapping/regtesting are complete?

Peter

	* gcc/config/rs6000/vsx.md (vsx_set_<mode>): Reorder operands.
	* gcc/testsuite/gcc.target/powerpc/pr52457.c: New test.
David Edelsohn - March 2, 2012, 4:19 p.m.
On Fri, Mar 2, 2012 at 10:57 AM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> The patch below fixes a typo in the vsx_set_<mode> pattern that causes
> wrong code to be generated when using -mcpu=power7.  This passed bootstrap
> and regression testing on trunk using powerpc64-linux.  Ok for trunk?
>
> This is also broken on the 4.7, 4.6 and 4.5 branches, is this ok for
> those release branches once the branches are open for fixes and my
> bootstrapping/regtesting are complete?
>
> Peter
>
>        * gcc/config/rs6000/vsx.md (vsx_set_<mode>): Reorder operands.
>        * gcc/testsuite/gcc.target/powerpc/pr52457.c: New test.

Okay everywhere, but please make sure that Richi and Jakub are okay
with the patch for GCC 4.7.

Thanks, David
Jakub Jelinek - March 2, 2012, 5:15 p.m.
On Fri, Mar 02, 2012 at 11:19:15AM -0500, David Edelsohn wrote:
> On Fri, Mar 2, 2012 at 10:57 AM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> > The patch below fixes a typo in the vsx_set_<mode> pattern that causes
> > wrong code to be generated when using -mcpu=power7.  This passed bootstrap
> > and regression testing on trunk using powerpc64-linux.  Ok for trunk?
> >
> > This is also broken on the 4.7, 4.6 and 4.5 branches, is this ok for
> > those release branches once the branches are open for fixes and my
> > bootstrapping/regtesting are complete?
> >
> > Peter
> >
> >        * gcc/config/rs6000/vsx.md (vsx_set_<mode>): Reorder operands.
> >        * gcc/testsuite/gcc.target/powerpc/pr52457.c: New test.
> 
> Okay everywhere, but please make sure that Richi and Jakub are okay
> with the patch for GCC 4.7.

This is ok for 4.7.0.

	Jakub
Peter Bergner - March 2, 2012, 6:36 p.m.
On Fri, 2012-03-02 at 11:19 -0500, David Edelsohn wrote:
> On Fri, Mar 2, 2012 at 10:57 AM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> > The patch below fixes a typo in the vsx_set_<mode> pattern that causes
> > wrong code to be generated when using -mcpu=power7.  This passed bootstrap
> > and regression testing on trunk using powerpc64-linux.  Ok for trunk?
> >
> > This is also broken on the 4.7, 4.6 and 4.5 branches, is this ok for
> > those release branches once the branches are open for fixes and my
> > bootstrapping/regtesting are complete?
> >
> >        * gcc/config/rs6000/vsx.md (vsx_set_<mode>): Reorder operands.
> >        * gcc/testsuite/gcc.target/powerpc/pr52457.c: New test.
> 
> Okay everywhere, but please make sure that Richi and Jakub are okay
> with the patch for GCC 4.7.

Ok, I have committed the patch to trunk and the 4.7 branch given Jakub's
ok in his email.  I'll commit the patch to the 4.6 and 4.5 branches once
my testing has completed.  Thanks.


Peter

Patch

Index: gcc/config/rs6000/vsx.md
===================================================================
--- gcc/config/rs6000/vsx.md	(revision 184791)
+++ gcc/config/rs6000/vsx.md	(working copy)
@@ -1119,9 +1119,9 @@  (define_insn "vsx_set_<mode>"
   "VECTOR_MEM_VSX_P (<MODE>mode)"
 {
   if (INTVAL (operands[3]) == 0)
-    return \"xxpermdi %x0,%x1,%x2,1\";
+    return \"xxpermdi %x0,%x2,%x1,1\";
   else if (INTVAL (operands[3]) == 1)
-    return \"xxpermdi %x0,%x2,%x1,0\";
+    return \"xxpermdi %x0,%x1,%x2,0\";
   else
     gcc_unreachable ();
 }
Index: gcc/testsuite/gcc.target/powerpc/pr52457.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/pr52457.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/pr52457.c	(revision 0)
@@ -0,0 +1,34 @@ 
+/* { dg-do run { target { powerpc*-*-linux* } } } */
+/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
+/* { dg-skip-if "" { powerpc*-*-*spe* } { "*" } { "" } } */
+/* { dg-require-effective-target vsx_hw } */
+/* { dg-options "-O1 -mcpu=power7" } */
+
+extern void abort (void);
+
+typedef long long T;
+typedef T vl_t __attribute__((vector_size(2 * sizeof (T))));
+
+vl_t
+buggy_func (T x)
+{
+  vl_t w;
+  T *p = (T *)&w;
+  p[0] = p[1] = x;
+  return w;
+}
+
+int
+main(void)
+{
+  vl_t rval;
+  T *pl;
+
+  pl = (T *) &rval;
+  rval = buggy_func (2);
+
+  if (pl[0] != 2 || pl[1] != 2)
+    abort ();
+
+  return 0;
+}