diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-11-28 09:36:06 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-11-28 09:36:06 +0100 |
commit | 79d2e61495d84a2fed4fce6ff7dacfe19a8b99ca (patch) | |
tree | 5a5df5a2b8c1b5daafe7aaef4120157ebbce57d9 /gcc/tree-ssa-strlen.c | |
parent | 99150b053e1840ffc47704a9188e26c889d07517 (diff) | |
download | gcc-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.c | 72 |
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)) { |