After Index: gcc/gimple-fold.c =================================================================== --- gcc/gimple-fold.c (revision 229518) +++ gcc/gimple-fold.c (working copy) @@ -398,7 +398,10 @@ fold_gimple_assign (gimple_stmt_iterator /* If we couldn't fold the RHS, hand over to the generic fold routines. */ if (result == NULL_TREE) - result = fold (rhs); + { + result = fold (rhs); + gcc_assert (result == rhs); + } /* Strip away useless type conversions. Both the NON_LVALUE_EXPR that may have been added by fold, and "useless" type
passed bootstrap and regtest on x86_64-unknown-linux-gnu I am now testing the following. There is still GIMPLE_TERNARY_RHS handling going via fold_ternary, mostly for [VEC_]COND_EXPR handling not moved to match.pd (and some others). Richard. 2015-10-29 Richard Biener <rguent...@suse.de> * gimple-fold.c (fold_gimple_assign): Do not dispatch to fold () on single RHSs. Index: gcc/gimple-fold.c =================================================================== --- gcc/gimple-fold.c (revision 229520) +++ gcc/gimple-fold.c (working copy) @@ -355,8 +355,8 @@ fold_gimple_assign (gimple_stmt_iterator return val; } } - } + else if (TREE_CODE (rhs) == ADDR_EXPR) { tree ref = TREE_OPERAND (rhs, 0); @@ -371,6 +371,18 @@ fold_gimple_assign (gimple_stmt_iterator else if (TREE_CODE (ref) == MEM_REF && integer_zerop (TREE_OPERAND (ref, 1))) result = fold_convert (TREE_TYPE (rhs), TREE_OPERAND (ref, 0)); + + if (result) + { + /* Strip away useless type conversions. Both the + NON_LVALUE_EXPR that may have been added by fold, and + "useless" type conversions that might now be apparent + due to propagation. */ + STRIP_USELESS_TYPE_CONVERSION (result); + + if (result != rhs && valid_gimple_rhs_p (result)) + return result; + } } else if (TREE_CODE (rhs) == CONSTRUCTOR @@ -394,21 +406,6 @@ fold_gimple_assign (gimple_stmt_iterator else if (DECL_P (rhs)) return get_symbol_constant_value (rhs); - - /* If we couldn't fold the RHS, hand over to the generic - fold routines. */ - if (result == NULL_TREE) - result = fold (rhs); - - /* Strip away useless type conversions. Both the NON_LVALUE_EXPR - that may have been added by fold, and "useless" type - conversions that might now be apparent due to propagation. */ - STRIP_USELESS_TYPE_CONVERSION (result); - - if (result != rhs && valid_gimple_rhs_p (result)) - return result; - - return NULL_TREE; } break;