> This is invalid gimple. Right, but nevertheless is_gimple_val.
> Can you figure our why we don't gimplify this to > > tmp_1 = MAX_EXPR <D.738_31, 0>; > tmp_2 = (<unnamed-signed:32>)tmp_1; > tmp_3 = tmp_2 + 1; > &p_name_buffer[tmp3] Because there is no code to do it. If I add it: Index: tree-ssa-pre.c =================================================================== --- tree-ssa-pre.c (revision 126300) +++ tree-ssa-pre.c (working copy) @@ -3682,6 +3682,8 @@ eliminate (void) && (TREE_CODE (*rhs_p) != SSA_NAME || may_propagate_copy (*rhs_p, sprime))) { + tree forced_stmts; + gcc_assert (sprime != *rhs_p); if (dump_file && (dump_flags & TDF_DETAILS)) @@ -3705,7 +3707,24 @@ eliminate (void) sprime = fold_convert (TREE_TYPE (*rhs_p), sprime); pre_stats.eliminations++; + + /* Force the available computation to be a sequence of GIMPLE + statements. + We have to call unshare_expr because force_gimple_operand + may modify the tree we pass to it. */ + sprime = force_gimple_operand (unshare_expr (sprime), + &forced_stmts, false, NULL); propagate_tree_value (rhs_p, sprime); + + if (forced_stmts) + { + tree_stmt_iterator tsi = tsi_start (forced_stmts); + for (; !tsi_end_p (tsi); tsi_next (&tsi)) + mark_symbols_for_renaming (tsi_stmt (tsi)); + + bsi_insert_before (&i, forced_stmts, BSI_SAME_STMT); + } + it doesn't do anything since the expression is_gimple_val. -- Eric Botcazou