new file mode 100644
@@ -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" } */
+}
@@ -2110,7 +2110,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
{
@@ -2122,8 +2121,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);
@@ -2133,6 +2133,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);
@@ -2150,7 +2154,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;
}