aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-11-28 09:36:06 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-11-28 09:36:06 +0100
commit79d2e61495d84a2fed4fce6ff7dacfe19a8b99ca (patch)
tree5a5df5a2b8c1b5daafe7aaef4120157ebbce57d9 /gcc/tree-ssa-strlen.c
parent99150b053e1840ffc47704a9188e26c889d07517 (diff)
downloadgcc-79d2e61495d84a2fed4fce6ff7dacfe19a8b99ca.zip
gcc-79d2e61495d84a2fed4fce6ff7dacfe19a8b99ca.tar.gz
gcc-79d2e61495d84a2fed4fce6ff7dacfe19a8b99ca.tar.bz2
re PR tree-optimization/92691 (ICE in strlen_dom_walker::before_dom_children at gcc/tree-ssa-strlen.c:5177 since r274933)
PR tree-optimization/92691 * tree-ssa-strlen.c (handle_store): Clarify return value meaning in function comment. (strlen_check_and_optimize_call): Likewise. For handle_printf_call calls, return !handle_printf_call rather than always returning true. (check_and_optimize_stmt): Describe return value meaning in function comment. Formatting fix. * gcc.dg/tree-ssa/builtin-snprintf-10.c: New test. From-SVN: r278803
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c72
1 files changed, 36 insertions, 36 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 06fa99e..d46586a 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -4300,7 +4300,8 @@ count_nonzero_bytes (tree exp, unsigned lenrange[3], bool *nulterm,
/* Handle a single or multibyte store other than by a built-in function,
either via a single character assignment or by multi-byte assignment
either via MEM_REF or via a type other than char (such as in
- '*(int*)a = 12345'). Return true when handled. */
+ '*(int*)a = 12345'). Return true to let the caller advance *GSI to
+ the next statement in the basic block and false otherwise. */
static bool
handle_store (gimple_stmt_iterator *gsi, bool *zero_write, const vr_values *rvals)
@@ -4728,8 +4729,8 @@ is_char_type (tree type)
}
/* Check the built-in call at GSI for validity and optimize it.
- Return true to let the caller advance *GSI to the statement
- in the CFG and false otherwise. */
+ Return true to let the caller advance *GSI to the next statement
+ in the basic block and false otherwise. */
static bool
strlen_check_and_optimize_call (gimple_stmt_iterator *gsi,
@@ -4738,16 +4739,13 @@ strlen_check_and_optimize_call (gimple_stmt_iterator *gsi,
{
gimple *stmt = gsi_stmt (*gsi);
+ /* When not optimizing we must be checking printf calls which
+ we do even for user-defined functions when they are declared
+ with attribute format. */
if (!flag_optimize_strlen
|| !strlen_optimize
|| !valid_builtin_call (stmt))
- {
- /* When not optimizing we must be checking printf calls which
- we do even for user-defined functions when they are declared
- with attribute format. */
- handle_printf_call (gsi, rvals);
- return true;
- }
+ return !handle_printf_call (gsi, rvals);
tree callee = gimple_call_fndecl (stmt);
switch (DECL_FUNCTION_CODE (callee))
@@ -4806,7 +4804,8 @@ strlen_check_and_optimize_call (gimple_stmt_iterator *gsi,
return false;
break;
default:
- handle_printf_call (gsi, rvals);
+ if (handle_printf_call (gsi, rvals))
+ return false;
break;
}
@@ -4932,7 +4931,8 @@ handle_integral_assign (gimple_stmt_iterator *gsi, bool *cleanup_eh)
/* Attempt to check for validity of the performed access a single statement
at *GSI using string length knowledge, and to optimize it.
If the given basic block needs clean-up of EH, CLEANUP_EH is set to
- true. */
+ true. Return true to let the caller advance *GSI to the next statement
+ in the basic block and false otherwise. */
static bool
check_and_optimize_stmt (gimple_stmt_iterator *gsi, bool *cleanup_eh,
@@ -4973,32 +4973,32 @@ check_and_optimize_stmt (gimple_stmt_iterator *gsi, bool *cleanup_eh,
/* Handle assignment to a character. */
handle_integral_assign (gsi, cleanup_eh);
else if (TREE_CODE (lhs) != SSA_NAME && !TREE_SIDE_EFFECTS (lhs))
- {
- tree type = TREE_TYPE (lhs);
- if (TREE_CODE (type) == ARRAY_TYPE)
- type = TREE_TYPE (type);
+ {
+ tree type = TREE_TYPE (lhs);
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ type = TREE_TYPE (type);
- bool is_char_store = is_char_type (type);
- if (!is_char_store && TREE_CODE (lhs) == MEM_REF)
- {
- /* To consider stores into char objects via integer types
- other than char but not those to non-character objects,
- determine the type of the destination rather than just
- the type of the access. */
- tree ref = TREE_OPERAND (lhs, 0);
- type = TREE_TYPE (ref);
- if (TREE_CODE (type) == POINTER_TYPE)
- type = TREE_TYPE (type);
- if (TREE_CODE (type) == ARRAY_TYPE)
- type = TREE_TYPE (type);
- if (is_char_type (type))
- is_char_store = true;
- }
+ bool is_char_store = is_char_type (type);
+ if (!is_char_store && TREE_CODE (lhs) == MEM_REF)
+ {
+ /* To consider stores into char objects via integer types
+ other than char but not those to non-character objects,
+ determine the type of the destination rather than just
+ the type of the access. */
+ tree ref = TREE_OPERAND (lhs, 0);
+ type = TREE_TYPE (ref);
+ if (TREE_CODE (type) == POINTER_TYPE)
+ type = TREE_TYPE (type);
+ if (TREE_CODE (type) == ARRAY_TYPE)
+ type = TREE_TYPE (type);
+ if (is_char_type (type))
+ is_char_store = true;
+ }
- /* Handle a single or multibyte assignment. */
- if (is_char_store && !handle_store (gsi, &zero_write, rvals))
- return false;
- }
+ /* Handle a single or multibyte assignment. */
+ if (is_char_store && !handle_store (gsi, &zero_write, rvals))
+ return false;
+ }
}
else if (gcond *cond = dyn_cast<gcond *> (stmt))
{