000-upstream_uclibc_fix.patch 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. --- a/gcc/tree-ssa-tail-merge.c
  2. +++ b/gcc/tree-ssa-tail-merge.c
  3. @@ -1033,7 +1033,7 @@ set_cluster (basic_block bb1, basic_bloc
  4. gimple_bb (s2) are members of SAME_SUCC. */
  5. static bool
  6. -gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
  7. +gimple_equal_p (same_succ same_succ, gimple s1, gimple s2, bool *gvn_used)
  8. {
  9. unsigned int i;
  10. tree lhs1, lhs2;
  11. @@ -1069,7 +1069,10 @@ gimple_equal_p (same_succ same_succ, gim
  12. if (operand_equal_p (t1, t2, 0))
  13. continue;
  14. if (gvn_uses_equal (t1, t2))
  15. - continue;
  16. + {
  17. + *gvn_used = true;
  18. + continue;
  19. + }
  20. equal = false;
  21. break;
  22. }
  23. @@ -1083,12 +1086,16 @@ gimple_equal_p (same_succ same_succ, gim
  24. if (lhs1 == NULL_TREE || lhs2 == NULL_TREE)
  25. return false;
  26. if (TREE_CODE (lhs1) == SSA_NAME && TREE_CODE (lhs2) == SSA_NAME)
  27. - return vn_valueize (lhs1) == vn_valueize (lhs2);
  28. + {
  29. + *gvn_used = true;
  30. + return vn_valueize (lhs1) == vn_valueize (lhs2);
  31. + }
  32. return operand_equal_p (lhs1, lhs2, 0);
  33. case GIMPLE_ASSIGN:
  34. lhs1 = gimple_get_lhs (s1);
  35. lhs2 = gimple_get_lhs (s2);
  36. + *gvn_used = true;
  37. return (TREE_CODE (lhs1) == SSA_NAME
  38. && TREE_CODE (lhs2) == SSA_NAME
  39. && vn_valueize (lhs1) == vn_valueize (lhs2));
  40. @@ -1096,15 +1103,23 @@ gimple_equal_p (same_succ same_succ, gim
  41. case GIMPLE_COND:
  42. t1 = gimple_cond_lhs (s1);
  43. t2 = gimple_cond_lhs (s2);
  44. - if (!operand_equal_p (t1, t2, 0)
  45. - && !gvn_uses_equal (t1, t2))
  46. - return false;
  47. + if (!operand_equal_p (t1, t2, 0))
  48. + {
  49. + if (gvn_uses_equal (t1, t2))
  50. + *gvn_used = true;
  51. + else
  52. + return false;
  53. + }
  54. t1 = gimple_cond_rhs (s1);
  55. t2 = gimple_cond_rhs (s2);
  56. - if (!operand_equal_p (t1, t2, 0)
  57. - && !gvn_uses_equal (t1, t2))
  58. - return false;
  59. + if (!operand_equal_p (t1, t2, 0))
  60. + {
  61. + if (gvn_uses_equal (t1, t2))
  62. + *gvn_used = true;
  63. + else
  64. + return false;
  65. + }
  66. code1 = gimple_expr_code (s1);
  67. code2 = gimple_expr_code (s2);
  68. @@ -1126,18 +1141,25 @@ gimple_equal_p (same_succ same_succ, gim
  69. /* Let GSI skip backwards over local defs. */
  70. static void
  71. -gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi)
  72. +gsi_advance_bw_nondebug_nonlocal (gimple_stmt_iterator *gsi, tree *vuse)
  73. {
  74. gimple stmt;
  75. + tree lvuse;
  76. while (true)
  77. {
  78. if (gsi_end_p (*gsi))
  79. return;
  80. stmt = gsi_stmt (*gsi);
  81. +
  82. + lvuse = gimple_vuse (stmt);
  83. + if (lvuse != NULL_TREE)
  84. + *vuse = lvuse;
  85. +
  86. if (!(is_gimple_assign (stmt) && local_def (gimple_get_lhs (stmt))
  87. && !gimple_has_side_effects (stmt)))
  88. return;
  89. +
  90. gsi_prev_nondebug (gsi);
  91. }
  92. }
  93. @@ -1146,28 +1168,34 @@ gsi_advance_bw_nondebug_nonlocal (gimple
  94. clusters them. */
  95. static void
  96. -find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2)
  97. +find_duplicate (same_succ same_succ, basic_block bb1, basic_block bb2,
  98. + bool gvn_used)
  99. {
  100. gimple_stmt_iterator gsi1 = gsi_last_nondebug_bb (bb1);
  101. gimple_stmt_iterator gsi2 = gsi_last_nondebug_bb (bb2);
  102. + tree vuse1 = NULL_TREE, vuse2 = NULL_TREE;
  103. - gsi_advance_bw_nondebug_nonlocal (&gsi1);
  104. - gsi_advance_bw_nondebug_nonlocal (&gsi2);
  105. + gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1);
  106. + gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2);
  107. while (!gsi_end_p (gsi1) && !gsi_end_p (gsi2))
  108. {
  109. - if (!gimple_equal_p (same_succ, gsi_stmt (gsi1), gsi_stmt (gsi2)))
  110. + if (!gimple_equal_p (same_succ, gsi_stmt (gsi1), gsi_stmt (gsi2),
  111. + &gvn_used))
  112. return;
  113. gsi_prev_nondebug (&gsi1);
  114. gsi_prev_nondebug (&gsi2);
  115. - gsi_advance_bw_nondebug_nonlocal (&gsi1);
  116. - gsi_advance_bw_nondebug_nonlocal (&gsi2);
  117. + gsi_advance_bw_nondebug_nonlocal (&gsi1, &vuse1);
  118. + gsi_advance_bw_nondebug_nonlocal (&gsi2, &vuse2);
  119. }
  120. if (!(gsi_end_p (gsi1) && gsi_end_p (gsi2)))
  121. return;
  122. + if (gvn_used && vuse1 != vuse2)
  123. + return;
  124. +
  125. if (dump_file)
  126. fprintf (dump_file, "find_duplicates: <bb %d> duplicate of <bb %d>\n",
  127. bb1->index, bb2->index);
  128. @@ -1179,7 +1207,7 @@ find_duplicate (same_succ same_succ, bas
  129. E2 are equal. */
  130. static bool
  131. -same_phi_alternatives_1 (basic_block dest, edge e1, edge e2)
  132. +same_phi_alternatives_1 (basic_block dest, edge e1, edge e2, bool *gvn_used)
  133. {
  134. int n1 = e1->dest_idx, n2 = e2->dest_idx;
  135. gimple_stmt_iterator gsi;
  136. @@ -1197,7 +1225,10 @@ same_phi_alternatives_1 (basic_block des
  137. if (operand_equal_for_phi_arg_p (val1, val2))
  138. continue;
  139. if (gvn_uses_equal (val1, val2))
  140. - continue;
  141. + {
  142. + *gvn_used = true;
  143. + continue;
  144. + }
  145. return false;
  146. }
  147. @@ -1209,7 +1240,8 @@ same_phi_alternatives_1 (basic_block des
  148. phi alternatives for BB1 and BB2 are equal. */
  149. static bool
  150. -same_phi_alternatives (same_succ same_succ, basic_block bb1, basic_block bb2)
  151. +same_phi_alternatives (same_succ same_succ, basic_block bb1, basic_block bb2,
  152. + bool *gvn_used)
  153. {
  154. unsigned int s;
  155. bitmap_iterator bs;
  156. @@ -1227,7 +1259,7 @@ same_phi_alternatives (same_succ same_su
  157. /* For all phis in bb, the phi alternatives for e1 and e2 need to have
  158. the same value. */
  159. - if (!same_phi_alternatives_1 (succ, e1, e2))
  160. + if (!same_phi_alternatives_1 (succ, e1, e2, gvn_used))
  161. return false;
  162. }
  163. @@ -1301,6 +1333,7 @@ find_clusters_1 (same_succ same_succ)
  164. bitmap_iterator bi, bj;
  165. int nr_comparisons;
  166. int max_comparisons = PARAM_VALUE (PARAM_MAX_TAIL_MERGE_COMPARISONS);
  167. + bool gvn_used;
  168. EXECUTE_IF_SET_IN_BITMAP (same_succ->bbs, 0, i, bi)
  169. {
  170. @@ -1333,10 +1366,11 @@ find_clusters_1 (same_succ same_succ)
  171. if (!deps_ok_for_redirect (bb1, bb2))
  172. continue;
  173. - if (!(same_phi_alternatives (same_succ, bb1, bb2)))
  174. + gvn_used = false;
  175. + if (!(same_phi_alternatives (same_succ, bb1, bb2, &gvn_used)))
  176. continue;
  177. - find_duplicate (same_succ, bb1, bb2);
  178. + find_duplicate (same_succ, bb1, bb2, gvn_used);
  179. }
  180. }
  181. }
  182. --- /dev/null
  183. +++ b/testsuite/gcc.dg/pr52734.c
  184. @@ -0,0 +1,35 @@
  185. +/* { dg-do run } */
  186. +/* { dg-options "-O2" } */
  187. +
  188. +int bbb = 0;
  189. +
  190. +int __attribute__((noinline,noclone)) aaa(void)
  191. +{
  192. + ++bbb;
  193. + return 0;
  194. +}
  195. +
  196. +int __attribute__((noinline,noclone)) ccc(void)
  197. +{
  198. + int ddd;
  199. + /* bbb == 0 */
  200. + if (aaa())
  201. + return bbb;
  202. +
  203. + /* bbb == 1 */
  204. + ddd = bbb;
  205. + /* bbb == ddd == 1 */
  206. + if (aaa ())
  207. + return 0;
  208. + /* bbb == 2, ddd == 1 */
  209. +
  210. + return ddd;
  211. +}
  212. +
  213. +int main(void)
  214. +{
  215. + if (ccc() != 1)
  216. + __builtin_abort();
  217. + return 0;
  218. +}
  219. +