Patchwork PR54915 (ssa-forwprop, vec_perm_expr)

login
register
mail settings
Submitter Marc Glisse
Date Oct. 12, 2012, 9:19 p.m.
Message ID <alpine.DEB.2.02.1210122259540.19126@stedding.saclay.inria.fr>
Download mbox | patch
Permalink /patch/191220/
State New
Headers show

Comments

Marc Glisse - Oct. 12, 2012, 9:19 p.m.
Hello,

apparently, in the optimization that recognizes that {v[1],v[0]} is a 
VEC_PERM_EXPR, I forgot to check that v is a 2-element vector... (not that 
there aren't things that could be done if v has a different size, just not 
directly a VEC_PERM_EXPR, and not right now, priority is to fix the bug)

Checking that v has the same type as the result seemed like the easiest 
way, but there are many variations that could be slightly better or worse.

bootstrap+testsuite ok.

2012-10-02  Marc Glisse  <marc.glisse@inria.fr>

 	PR tree-optimization/54915

gcc/
 	* tree-ssa-forwprop.c (simplify_vector_constructor): Check
 	argument's type.

gcc/testsuite/
 	* gcc.dg/tree-ssa/pr54915.c: New testcase.

Patch

Index: tree-ssa-forwprop.c

===================================================================
--- tree-ssa-forwprop.c	(revision 192408)

+++ tree-ssa-forwprop.c	(working copy)

@@ -2833,20 +2833,22 @@  simplify_vector_constructor (gimple_stmt

       ref = TREE_OPERAND (op1, 0);
       if (orig)
 	{
 	  if (ref != orig)
 	    return false;
 	}
       else
 	{
 	  if (TREE_CODE (ref) != SSA_NAME)
 	    return false;
+	  if (TREE_TYPE (ref) != type)

+	    return false;

 	  orig = ref;
 	}
       if (TREE_INT_CST_LOW (TREE_OPERAND (op1, 1)) != elem_size)
 	return false;
       sel[i] = TREE_INT_CST_LOW (TREE_OPERAND (op1, 2)) / elem_size;
       if (sel[i] != i) maybe_ident = false;
     }
   if (i < nelts)
     return false;
 
Index: testsuite/gcc.dg/tree-ssa/pr54915.c

===================================================================
--- testsuite/gcc.dg/tree-ssa/pr54915.c	(revision 0)

+++ testsuite/gcc.dg/tree-ssa/pr54915.c	(revision 0)

@@ -0,0 +1,12 @@ 

+/* { dg-do compile } */

+/* { dg-options "-O2" } */

+

+typedef double v2df __attribute__ ((__vector_size__ (16)));

+typedef double v4df __attribute__ ((__vector_size__ (32)));

+

+void f (v2df *ret, v4df* xp)

+{

+  v4df x = *xp;

+  v2df xx = { x[2], x[3] };

+  *ret = xx;

+}