diff options
author | Marc Glisse <marc.glisse@inria.fr> | 2012-10-23 14:51:22 +0200 |
---|---|---|
committer | Marc Glisse <glisse@gcc.gnu.org> | 2012-10-23 12:51:22 +0000 |
commit | a8dcc458896307fb03bb3b8c56c33a1b860837c4 (patch) | |
tree | 9d49e15eb24b4681bee36a4cb27693dddf91dcd8 /gcc/tree-ssa-forwprop.c | |
parent | 053223551fd7253097117744fcafccd28c8941c0 (diff) | |
download | gcc-a8dcc458896307fb03bb3b8c56c33a1b860837c4.zip gcc-a8dcc458896307fb03bb3b8c56c33a1b860837c4.tar.gz gcc-a8dcc458896307fb03bb3b8c56c33a1b860837c4.tar.bz2 |
tree-ssa-forwprop.c (forward_propagate_into_cond): Handle vectors.
2012-10-23 Marc Glisse <marc.glisse@inria.fr>
gcc/
* tree-ssa-forwprop.c (forward_propagate_into_cond): Handle vectors.
* fold-const.c (fold_relational_const): Handle VECTOR_CST.
* doc/generic.texi (VEC_COND_EXPR): Document current policy.
gcc/testsuite/
* gcc.dg/tree-ssa/foldconst-6.c: New testcase.
From-SVN: r192711
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index b6c5654..f193fa9 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -551,6 +551,7 @@ forward_propagate_into_cond (gimple_stmt_iterator *gsi_p) gimple stmt = gsi_stmt (*gsi_p); tree tmp = NULL_TREE; tree cond = gimple_assign_rhs1 (stmt); + enum tree_code code = gimple_assign_rhs_code (stmt); bool swap = false; /* We can do tree combining on SSA_NAME and comparison expressions. */ @@ -561,23 +562,24 @@ forward_propagate_into_cond (gimple_stmt_iterator *gsi_p) TREE_OPERAND (cond, 1)); else if (TREE_CODE (cond) == SSA_NAME) { - enum tree_code code; + enum tree_code def_code; tree name = cond; gimple def_stmt = get_prop_source_stmt (name, true, NULL); if (!def_stmt || !can_propagate_from (def_stmt)) return 0; - code = gimple_assign_rhs_code (def_stmt); - if (TREE_CODE_CLASS (code) == tcc_comparison) + def_code = gimple_assign_rhs_code (def_stmt); + if (TREE_CODE_CLASS (def_code) == tcc_comparison) tmp = fold_build2_loc (gimple_location (def_stmt), - code, + def_code, TREE_TYPE (cond), gimple_assign_rhs1 (def_stmt), gimple_assign_rhs2 (def_stmt)); - else if ((code == BIT_NOT_EXPR - && TYPE_PRECISION (TREE_TYPE (cond)) == 1) - || (code == BIT_XOR_EXPR - && integer_onep (gimple_assign_rhs2 (def_stmt)))) + else if (code == COND_EXPR + && ((def_code == BIT_NOT_EXPR + && TYPE_PRECISION (TREE_TYPE (cond)) == 1) + || (def_code == BIT_XOR_EXPR + && integer_onep (gimple_assign_rhs2 (def_stmt))))) { tmp = gimple_assign_rhs1 (def_stmt); swap = true; @@ -596,7 +598,8 @@ forward_propagate_into_cond (gimple_stmt_iterator *gsi_p) fprintf (dump_file, "'\n"); } - if (integer_onep (tmp)) + if ((code == VEC_COND_EXPR) ? integer_all_onesp (tmp) + : integer_onep (tmp)) gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs2 (stmt)); else if (integer_zerop (tmp)) gimple_assign_set_rhs_from_tree (gsi_p, gimple_assign_rhs3 (stmt)); |