+2010-04-20 Richard Guenther <rguenther@suse.de>
+
+ Backport from mainline:
+ 2010-03-01 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/43220
+ * tree-ssa-ccp.c (optimize_stack_restore): Do not optimize
+ BUILT_IN_STACK_{SAVE,RESTORE} around alloca.
+
+ 2008-12-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/38360
+ * tree-ssa-ccp.c (ccp_fold_builtin): Bail out if the builtin doesn't
+ have the right number of arguments.
+
2010-04-20 Richard Guenther <rguenther@suse.de>
Backport from mainline
}
else if (TREE_CODE (stmt) == CALL_EXPR)
{
- unsigned i;
+ int i;
for (i = 0; i < call_expr_nargs (stmt); ++i)
if (is_gimple_min_invariant (CALL_EXPR_ARG (stmt, i)))
has_constant_operand = true;
switch (DECL_FUNCTION_CODE (callee))
{
case BUILT_IN_STRLEN:
- if (val[0])
+ if (val[0] && nargs == 1)
{
tree new_val = fold_convert (TREE_TYPE (fn), val[0]);
break;
case BUILT_IN_FPUTS:
- result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
- CALL_EXPR_ARG (fn, 1),
- TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 0,
- val[0]);
+ if (nargs == 2)
+ result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
+ CALL_EXPR_ARG (fn, 1),
+ TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 0,
+ val[0]);
break;
case BUILT_IN_FPUTS_UNLOCKED:
- result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
- CALL_EXPR_ARG (fn, 1),
- TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 1,
- val[0]);
+ if (nargs == 2)
+ result = fold_builtin_fputs (CALL_EXPR_ARG (fn, 0),
+ CALL_EXPR_ARG (fn, 1),
+ TREE_CODE (stmt) != GIMPLE_MODIFY_STMT, 1,
+ val[0]);
break;
case BUILT_IN_MEMCPY_CHK:
case BUILT_IN_MEMPCPY_CHK:
case BUILT_IN_MEMMOVE_CHK:
case BUILT_IN_MEMSET_CHK:
- if (val[2] && is_gimple_val (val[2]))
+ if (val[2] && is_gimple_val (val[2]) && nargs == 4)
result = fold_builtin_memory_chk (callee,
CALL_EXPR_ARG (fn, 0),
CALL_EXPR_ARG (fn, 1),
case BUILT_IN_STRCPY_CHK:
case BUILT_IN_STPCPY_CHK:
- if (val[1] && is_gimple_val (val[1]))
+ if (val[1] && is_gimple_val (val[1]) && nargs == 3)
result = fold_builtin_stxcpy_chk (callee,
CALL_EXPR_ARG (fn, 0),
CALL_EXPR_ARG (fn, 1),
break;
case BUILT_IN_STRNCPY_CHK:
- if (val[2] && is_gimple_val (val[2]))
+ if (val[2] && is_gimple_val (val[2]) && nargs == 4)
result = fold_builtin_strncpy_chk (CALL_EXPR_ARG (fn, 0),
CALL_EXPR_ARG (fn, 1),
CALL_EXPR_ARG (fn, 2),
continue;
callee = get_callee_fndecl (call);
- if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
+ if (!callee
+ || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
+ /* All regular builtins are ok, just obviously not alloca. */
+ || DECL_FUNCTION_CODE (callee) == BUILT_IN_ALLOCA)
return NULL_TREE;
if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)