diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/uninit-pr40635.c | 33 | ||||
-rw-r--r-- | gcc/tree-into-ssa.cc | 11 |
2 files changed, 40 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.dg/uninit-pr40635.c b/gcc/testsuite/gcc.dg/uninit-pr40635.c new file mode 100644 index 0000000..fab7c3d4 --- /dev/null +++ b/gcc/testsuite/gcc.dg/uninit-pr40635.c @@ -0,0 +1,33 @@ +/* { dg-do compile } */ +/* { dg-options "-O -Wuninitialized" } */ + +struct hostent { + char **h_addr_list; +}; +struct hostent *gethostbyname(const char*); +int socket(void); +int close(int); +int connect(int, const char*); + +int get_tcp_socket(const char *machine) +{ + struct hostent *hp; + int s42, x; + char **addr; + + hp = gethostbyname(machine); + x = 0; + for (addr = hp->h_addr_list; *addr; addr++) + { + s42 = socket(); + if (s42 < 0) + return -1; + x = connect(s42, *addr); + if (x == 0) + break; + close(s42); + } + if (x < 0) + return -1; + return s42; /* { dg-warning "uninitialized" } */ +} diff --git a/gcc/tree-into-ssa.cc b/gcc/tree-into-ssa.cc index dd41b1b..fa53bee 100644 --- a/gcc/tree-into-ssa.cc +++ b/gcc/tree-into-ssa.cc @@ -2107,7 +2107,6 @@ rewrite_update_phi_arguments (basic_block bb) symbol we may find NULL arguments. That's why we take the symbol from the LHS of the PHI node. */ reaching_def = get_reaching_def (lhs_sym); - } else { @@ -2119,8 +2118,9 @@ rewrite_update_phi_arguments (basic_block bb) reaching_def = get_reaching_def (arg); } - /* Update the argument if there is a reaching def. */ - if (reaching_def) + /* Update the argument if there is a reaching def different + from arg. */ + if (reaching_def && reaching_def != arg) { location_t locus; int arg_i = PHI_ARG_INDEX_FROM_USE (arg_p); @@ -2130,6 +2130,10 @@ rewrite_update_phi_arguments (basic_block bb) /* Virtual operands do not need a location. */ if (virtual_operand_p (reaching_def)) locus = UNKNOWN_LOCATION; + /* If SSA update didn't insert this PHI the argument + might have a location already, keep that. */ + else if (gimple_phi_arg_has_location (phi, arg_i)) + locus = gimple_phi_arg_location (phi, arg_i); else { gimple *stmt = SSA_NAME_DEF_STMT (reaching_def); @@ -2147,7 +2151,6 @@ rewrite_update_phi_arguments (basic_block bb) gimple_phi_arg_set_location (phi, arg_i, locus); } - if (e->flags & EDGE_ABNORMAL) SSA_NAME_OCCURS_IN_ABNORMAL_PHI (USE_FROM_PTR (arg_p)) = 1; } |