aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2018-11-04 19:46:08 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2018-11-04 19:46:08 +0000
commit770fe3a36400fb03d0936cff86ffb76a136d5674 (patch)
tree2cfa74f84366dc63ad9ff43c84f8575fd561af72 /gcc/tree-ssa-strlen.c
parente237f9f31d463d7a4616b70519f5bc6eb38750e5 (diff)
downloadgcc-770fe3a36400fb03d0936cff86ffb76a136d5674.zip
gcc-770fe3a36400fb03d0936cff86ffb76a136d5674.tar.gz
gcc-770fe3a36400fb03d0936cff86ffb76a136d5674.tar.bz2
re PR tree-optimization/87672 (81512c36 causes ICE in bootstrap stage 3 using "-D_FORTIFY_SOURCE=2" (invalid operand in unary operation, incorrect sharing of tree nodes, verify_gimple failed))
gcc: 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. testsuite: 2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de> PR tree-optimization/87672 * gcc.dg/pr87672.c: New test. From-SVN: r265777
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index d508d36..669c315 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -2605,12 +2605,19 @@ handle_builtin_strcat (enum built_in_function bcode, gimple_stmt_iterator *gsi)
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: ");