diff options
author | glisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-24 12:43:43 +0000 |
---|---|---|
committer | glisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-09-24 12:43:43 +0000 |
commit | 58bf5219edd00f3fa401e2fe8a8048820a7ac96a (patch) | |
tree | 1199cba964f76d18f232e5f2c45e54109fd0f5ba /gcc/tree-ssa-forwprop.c | |
parent | 2eeea804bbac149f61f0d73d3d47526b4a08052e (diff) | |
download | gcc-58bf5219edd00f3fa401e2fe8a8048820a7ac96a.tar.gz |
2012-09-24 Marc Glisse <marc.glisse@inria.fr>
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
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 29 |
1 files changed, 20 insertions, 9 deletions
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; |