diff options
author | Richard Guenther <rguenther@suse.de> | 2011-07-14 14:21:07 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-07-14 14:21:07 +0000 |
commit | 5fbcc0ed20ecdfd980106ac22607c5baed60d234 (patch) | |
tree | e18b92ce0412ea9f3b2a1a1f187207e97fd6b8ca /gcc/gimple-fold.c | |
parent | fbf3fee2b959926c4df4295eba74ea144f0c6a00 (diff) | |
download | gcc-5fbcc0ed20ecdfd980106ac22607c5baed60d234.zip gcc-5fbcc0ed20ecdfd980106ac22607c5baed60d234.tar.gz gcc-5fbcc0ed20ecdfd980106ac22607c5baed60d234.tar.bz2 |
gimple-fold.c (fold_gimple_assign): Remove operand swapping.
2011-07-14 Richard Guenther <rguenther@suse.de>
* gimple-fold.c (fold_gimple_assign): Remove operand swapping.
(fold_stmt_1): Do it here directly on gimple and as a first thing.
From-SVN: r176273
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 6b3b275..bf00a0f 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -817,26 +817,15 @@ fold_gimple_assign (gimple_stmt_iterator *si) if (!result) result = fold_binary_loc (loc, subcode, - TREE_TYPE (gimple_assign_lhs (stmt)), - gimple_assign_rhs1 (stmt), - gimple_assign_rhs2 (stmt)); + TREE_TYPE (gimple_assign_lhs (stmt)), + gimple_assign_rhs1 (stmt), + gimple_assign_rhs2 (stmt)); if (result) { STRIP_USELESS_TYPE_CONVERSION (result); if (valid_gimple_rhs_p (result)) return result; - - /* Fold might have produced non-GIMPLE, so if we trust it blindly - we lose canonicalization opportunities. Do not go again - through fold here though, or the same non-GIMPLE will be - produced. */ - if (commutative_tree_code (subcode) - && tree_swap_operands_p (gimple_assign_rhs1 (stmt), - gimple_assign_rhs2 (stmt), false)) - return build2 (subcode, TREE_TYPE (gimple_assign_lhs (stmt)), - gimple_assign_rhs2 (stmt), - gimple_assign_rhs1 (stmt)); } break; @@ -852,18 +841,6 @@ fold_gimple_assign (gimple_stmt_iterator *si) STRIP_USELESS_TYPE_CONVERSION (result); if (valid_gimple_rhs_p (result)) return result; - - /* Fold might have produced non-GIMPLE, so if we trust it blindly - we lose canonicalization opportunities. Do not go again - through fold here though, or the same non-GIMPLE will be - produced. */ - if (commutative_ternary_tree_code (subcode) - && tree_swap_operands_p (gimple_assign_rhs1 (stmt), - gimple_assign_rhs2 (stmt), false)) - return build3 (subcode, TREE_TYPE (gimple_assign_lhs (stmt)), - gimple_assign_rhs2 (stmt), - gimple_assign_rhs1 (stmt), - gimple_assign_rhs3 (stmt)); } break; @@ -1576,8 +1553,22 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, bool inplace) case GIMPLE_ASSIGN: { unsigned old_num_ops = gimple_num_ops (stmt); - tree new_rhs = fold_gimple_assign (gsi); + enum tree_code subcode = gimple_assign_rhs_code (stmt); tree lhs = gimple_assign_lhs (stmt); + tree new_rhs; + /* First canonicalize operand order. This avoids building new + trees if this is the only thing fold would later do. */ + if ((commutative_tree_code (subcode) + || commutative_ternary_tree_code (subcode)) + && tree_swap_operands_p (gimple_assign_rhs1 (stmt), + gimple_assign_rhs2 (stmt), false)) + { + tree tem = gimple_assign_rhs1 (stmt); + gimple_assign_set_rhs1 (stmt, gimple_assign_rhs2 (stmt)); + gimple_assign_set_rhs2 (stmt, tem); + changed = true; + } + new_rhs = fold_gimple_assign (gsi); if (new_rhs && !useless_type_conversion_p (TREE_TYPE (lhs), TREE_TYPE (new_rhs))) |