From patchwork Sat Oct 13 09:25:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: PR54915 (ssa-forwprop, vec_perm_expr) From: Marc Glisse X-Patchwork-Id: 191288 Message-Id: To: gcc-patches@gcc.gnu.org Date: Sat, 13 Oct 2012 11:25:37 +0200 (CEST) On Fri, 12 Oct 2012, Marc Glisse wrote: > 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 > > 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. This new version, with a slightly relaxed test, seems preferable and also passes testing. 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; +} Property changes on: testsuite/gcc.dg/tree-ssa/pr54915.c ___________________________________________________________________ Added: svn:eol-style + native Added: svn:keywords + Author Date Id Revision URL Index: tree-ssa-forwprop.c =================================================================== --- tree-ssa-forwprop.c (revision 192420) +++ 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 (!useless_type_conversion_p (type, TREE_TYPE (ref))) + 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;