> 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