From ab386758ef41dad695ccf25f975ebf12b4afe8c4 Mon Sep 17 00:00:00 2001 From: Bernd Edlinger Date: Fri, 9 Nov 2018 20:38:07 +0000 Subject: [PATCH] re PR tree-optimization/87940 (FAIL: gcc.dg/warn-strlen-no-nul.c) 2018-11-09 Bernd Edlinger PR tree-optimization/87940 * expr.c (string_constant): Don't strip NOPS in subexpressions. Fold PLUS_EXPR correctly. From-SVN: r265992 --- gcc/ChangeLog | 6 ++++++ gcc/expr.c | 25 ++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d1b40d1e946..1535fe51b152 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-11-09 Bernd Edlinger + + PR tree-optimization/87940 + * expr.c (string_constant): Don't strip NOPS in subexpressions. + Fold PLUS_EXPR correctly. + 2018-11-09 Ilya Leoshkevich PR target/87762 diff --git a/gcc/expr.c b/gcc/expr.c index 6341c5a0bdb6..7ae3e37378c5 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -11358,18 +11358,15 @@ string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl) tree arg0 = TREE_OPERAND (arg, 0); tree arg1 = TREE_OPERAND (arg, 1); - STRIP_NOPS (arg0); - STRIP_NOPS (arg1); - - if (TREE_CODE (arg0) == ADDR_EXPR) - ; /* Do nothing. */ - else if (TREE_CODE (arg1) == ADDR_EXPR) - std::swap (arg0, arg1); - else - return NULL_TREE; - tree offset; - if (tree str = string_constant (arg0, &offset, mem_size, decl)) + tree str = string_constant (arg0, &offset, mem_size, decl); + if (!str) + { + str = string_constant (arg1, &offset, mem_size, decl); + arg1 = arg0; + } + + if (str) { /* Avoid pointers to arrays (see bug 86622). */ if (POINTER_TYPE_P (TREE_TYPE (arg)) @@ -11380,7 +11377,8 @@ string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl) && tree_int_cst_equal (*mem_size, DECL_SIZE_UNIT (*decl)))) return NULL_TREE; - tree type = TREE_TYPE (arg1); + tree type = TREE_TYPE (offset); + arg1 = fold_convert (type, arg1); *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, arg1); return str; } @@ -11412,7 +11410,8 @@ string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl) return NULL_TREE; tree rhs2 = gimple_assign_rhs2 (stmt); - tree type = TREE_TYPE (rhs2); + tree type = TREE_TYPE (offset); + rhs2 = fold_convert (type, rhs2); *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, rhs2); return str; } -- 2.47.2