summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-24 12:43:43 +0000
committerglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2012-09-24 12:43:43 +0000
commit58bf5219edd00f3fa401e2fe8a8048820a7ac96a (patch)
tree1199cba964f76d18f232e5f2c45e54109fd0f5ba /gcc/tree-ssa-forwprop.c
parent2eeea804bbac149f61f0d73d3d47526b4a08052e (diff)
downloadgcc-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.c29
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;