aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gcc.dg/uninit-pr40635.c33
-rw-r--r--gcc/tree-into-ssa.cc11
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;
}