+2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
+
+ PR tree-optimization/87672
+ * gimple-fold.c (gimple_fold_builtin_stxcpy_chk): Gimplify.
+ * tree-ssa-strlen.c (handle_builtin_strcat): Adjust object size.
+
2018-11-04 Uros Bizjak <ubizjak@gmail.com>
PR middle-end/58372
return false;
gimple_seq stmts = NULL;
+ len = force_gimple_operand (len, &stmts, true, NULL_TREE);
len = gimple_convert (&stmts, loc, size_type_node, len);
len = gimple_build (&stmts, loc, PLUS_EXPR, size_type_node, len,
build_int_cst (size_type_node, 1));
--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+char buf[40];
+void test (int x)
+{
+ __builtin_strcpy (buf, "test");
+ __builtin___strcat_chk (buf, "postfix" + x, sizeof (buf));
+}
+
+/* { dg-final { scan-tree-dump "memcpy_chk.*, 36\\)" "optimized" } } */
if (endptr)
dst = fold_convert_loc (loc, TREE_TYPE (dst), unshare_expr (endptr));
else
- dst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
- TREE_TYPE (dst), unshare_expr (dst),
+ dst = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dst), dst,
fold_convert_loc (loc, sizetype,
unshare_expr (dstlen)));
dst = force_gimple_operand_gsi (gsi, dst, true, NULL_TREE, true,
GSI_SAME_STMT);
+ if (objsz)
+ {
+ objsz = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (objsz), objsz,
+ fold_convert_loc (loc, TREE_TYPE (objsz),
+ unshare_expr (dstlen)));
+ objsz = force_gimple_operand_gsi (gsi, objsz, true, NULL_TREE, true,
+ GSI_SAME_STMT);
+ }
if (dump_file && (dump_flags & TDF_DETAILS) != 0)
{
fprintf (dump_file, "Optimizing: ");