diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5f7c6214a3e928598aead998f36c3eb4ed99e364..2791de6c4f86919ec512e12431b5c7b5c8b64ebd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-08  Jan Hubicka  <hubicka@ucw.cz>
+
+	PR ipa/61548
+	* tree-emutls.c (ipa_lower_emutls): Avoid duplicates in TLS_VARS.
+
 2015-02-08  Jan Hubicka  <hubicka@ucw.cz>
 
 	PR ipa/63566 
diff --git a/gcc/tree-emutls.c b/gcc/tree-emutls.c
index 68b2aae5e702001d4a1d62e7dd913237c3aec387..b4711a59c6b01bb300488698a150139508fe3196 100644
--- a/gcc/tree-emutls.c
+++ b/gcc/tree-emutls.c
@@ -753,17 +753,19 @@ ipa_lower_emutls (void)
   cgraph_node *func;
   bool any_aliases = false;
   tree ctor_body = NULL;
-
+  hash_set <varpool_node *> visited;
   auto_vec <varpool_node *> tls_vars;
 
   /* Examine all global variables for TLS variables.  */
   FOR_EACH_VARIABLE (var)
-    if (DECL_THREAD_LOCAL_P (var->decl))
+    if (DECL_THREAD_LOCAL_P (var->decl)
+	&& !visited.add (var))
       {
 	gcc_checking_assert (TREE_STATIC (var->decl)
 			     || DECL_EXTERNAL (var->decl));
 	tls_vars.safe_push (var);
-	if (var->alias && var->definition)
+	if (var->alias && var->definition
+	    && !visited.add (var->ultimate_alias_target ()))
 	  tls_vars.safe_push (var->ultimate_alias_target ());
       }