From 58bf5219edd00f3fa401e2fe8a8048820a7ac96a Mon Sep 17 00:00:00 2001 From: glisse Date: Mon, 24 Sep 2012 12:43:43 +0000 Subject: 2012-09-24 Marc Glisse gcc/ * tree-ssa-forwprop.c: Include tree-ssa-propagate.h. (simplify_bitfield_ref): Handle constructors. * Makefile.in (tree-ssa-forwprop.o): Depend on tree-ssa-propagate.h. gcc/testsuite/ * gcc.dg/tree-ssa/forwprop-23.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@191665 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/tree-ssa-forwprop.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) (limited to 'gcc/tree-ssa-forwprop.c') diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 3b7991f8a1d..cd8f092915b 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -34,6 +34,7 @@ along with GCC; see the file COPYING3. If not see #include "expr.h" #include "cfgloop.h" #include "optabs.h" +#include "tree-ssa-propagate.h" /* This pass propagates the RHS of assignment statements into use sites of the LHS of the assignment. It's basically a specialized @@ -2582,25 +2583,35 @@ simplify_bitfield_ref (gimple_stmt_iterator *gsi) || TREE_CODE (TREE_TYPE (op0)) != VECTOR_TYPE) return false; + def_stmt = get_prop_source_stmt (op0, false, NULL); + if (!def_stmt || !can_propagate_from (def_stmt)) + return false; + + op1 = TREE_OPERAND (op, 1); + op2 = TREE_OPERAND (op, 2); + code = gimple_assign_rhs_code (def_stmt); + + if (code == CONSTRUCTOR) + { + tree tem = fold_ternary (BIT_FIELD_REF, TREE_TYPE (op), + gimple_assign_rhs1 (def_stmt), op1, op2); + if (!tem || !valid_gimple_rhs_p (tem)) + return false; + gimple_assign_set_rhs_from_tree (gsi, tem); + update_stmt (gsi_stmt (*gsi)); + return true; + } + elem_type = TREE_TYPE (TREE_TYPE (op0)); if (TREE_TYPE (op) != elem_type) return false; size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type)); - op1 = TREE_OPERAND (op, 1); n = TREE_INT_CST_LOW (op1) / size; if (n != 1) return false; - - def_stmt = get_prop_source_stmt (op0, false, NULL); - if (!def_stmt || !can_propagate_from (def_stmt)) - return false; - - op2 = TREE_OPERAND (op, 2); idx = TREE_INT_CST_LOW (op2) / size; - code = gimple_assign_rhs_code (def_stmt); - if (code == VEC_PERM_EXPR) { tree p, m, index, tem; -- cgit v1.2.1