On Thu, 2 Aug 2012, Tom de Vries wrote:

> On 01/08/12 10:47, Richard Guenther wrote:
> >     * tree-ssa-tail-merge.c (release_last_vdef): Remove.
> >     (replace_block_by): Adjust.
> >     (tail_merge_optimize): Use mark_virtual_operands_for_renaming.
> 
> Richard,
> 
> this caused PR50672 to trigger again.

Hmm, indeed.  Reverted as follows.

Richard.

2012-08-02  Richard Guenther  <rguent...@suse.de>

        PR tree-optimization/50672
        Revert
        2012-08-01  Richard Guenther  <rguent...@suse.de>

        * tree-ssa-tail-merge.c (release_last_vdef): Remove.
        (replace_block_by): Adjust.

        * g++.dg/torture/pr50672.C: New testcase.

Index: gcc/tree-ssa-tail-merge.c
===================================================================
*** gcc/tree-ssa-tail-merge.c   (revision 190067)
--- gcc/tree-ssa-tail-merge.c   (working copy)
*************** same_succ_flush_bbs (bitmap bbs)
*** 812,817 ****
--- 812,848 ----
      same_succ_flush_bb (BASIC_BLOCK (i));
  }
  
+ /* Release the last vdef in BB, either normal or phi result.  */
+ 
+ static void
+ release_last_vdef (basic_block bb)
+ {
+   gimple_stmt_iterator i;
+ 
+   for (i = gsi_last_bb (bb); !gsi_end_p (i); gsi_prev_nondebug (&i))
+     {
+       gimple stmt = gsi_stmt (i);
+       if (gimple_vdef (stmt) == NULL_TREE)
+       continue;
+ 
+       mark_virtual_operand_for_renaming (gimple_vdef (stmt));
+       return;
+     }
+ 
+   for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i))
+     {
+       gimple phi = gsi_stmt (i);
+       tree res = gimple_phi_result (phi);
+ 
+       if (is_gimple_reg (res))
+       continue;
+ 
+       mark_virtual_phi_result_for_renaming (phi);
+       return;
+     }
+   
+ }
+ 
  /* For deleted_bb_preds, find bbs with same successors.  */
  
  static void
*************** replace_block_by (basic_block bb1, basic
*** 1446,1451 ****
--- 1477,1483 ----
    bb1->frequency = 0;
  
    /* Do updates that use bb1, before deleting bb1.  */
+   release_last_vdef (bb1);
    same_succ_flush_bb (bb1);
  
    delete_basic_block (bb1);
Index: gcc/testsuite/g++.dg/torture/pr50672.C
===================================================================
*** gcc/testsuite/g++.dg/torture/pr50672.C      (revision 0)
--- gcc/testsuite/g++.dg/torture/pr50672.C      (working copy)
***************
*** 0 ****
--- 1,22 ----
+ // { dg-do compile }
+ 
+ struct A
+ {
+   bool isHint();
+ };
+ class B
+ {
+   void makeLine( int *) const;
+   void drawLine() const; A* to() const;
+   void _print() const;
+ };
+ A a;
+ void  B::makeLine(int *p1) const
+ {
+   if (a.isHint() && to()->isHint()) ;
+   else {
+       if (p1) B::drawLine(); else B::_print();
+       return;
+   }
+   if (p1) B::drawLine(); else B::_print();
+ }

Reply via email to