Patchwork [PR50763] Follow-up patch to fix i686 bootstrap failure

login
register
mail settings
Submitter Tom de Vries
Date Oct. 25, 2011, 12:15 p.m.
Message ID <4EA6A861.9090107@mentor.com>
Download mbox | patch
Permalink /patch/121633/
State New
Headers show

Comments

Tom de Vries - Oct. 25, 2011, 12:15 p.m.
Richard,

I have a patch for the i686 bootstrap problem reported in PR50763 comment 10.

pr50763-2.c looks like this before tail_merge_optimize:
...
std_canonical_va_list_type (union tree_node * typeD.1608)
{
  _BoolD.1576 pretmp.6D.2739;
  union tree_node * pretmp.5D.2738;
  _BoolD.1576 pretmp.4D.2737;
  union tree_node * pretmp.3D.2736;
  intD.6 D.2734;
  _BoolD.1576 D.2733;
  union tree_node * D.2725;
  intD.6 D.2722;
  intD.6 D.2717;

  # BLOCK 2 freq:10000
  # PRED: ENTRY [100.0%]  (fallthru,exec)
  # VUSE <.MEMD.2730_12(D)>
  D.2717_4 = typeD.1608_3(D)->baseD.1605.codeD.1597;
  if (D.2717_4 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;
  # SUCC: 3 [50.0%]  (true,exec) 4 [50.0%]  (false,exec)

  # BLOCK 3 freq:5000
  # PRED: 2 [50.0%]  (true,exec)
  # VUSE <.MEMD.2730_12(D)>
  # PT = anything
  typeD.1608_5 = typeD.1608_3(D)->typedD.1606.typeD.1600;
  goto <bb 6>;
  # SUCC: 6 [100.0%]  (fallthru,exec)

  # BLOCK 4 freq:5000
  # PRED: 2 [50.0%]  (false,exec)
  # VUSE <.MEMD.2730_12(D)>
  # PT = anything
  typeD.1608_6 = typeD.1608_3(D)->typedD.1606.typeD.1600;
  # VUSE <.MEMD.2730_12(D)>
  D.2722_7 = typeD.1608_6->baseD.1605.codeD.1597;
  if (D.2722_7 != 0)
    goto <bb 5>;
  else
    goto <bb 7>;
  # SUCC: 5 [50.0%]  (true,exec) 7 [50.0%]  (false,exec)

  # BLOCK 7 freq:2500
  # PRED: 4 [50.0%]  (false,exec)
  goto <bb 6>;
  # SUCC: 6 [100.0%]  (fallthru)

  # BLOCK 5 freq:2500
  # PRED: 4 [50.0%]  (true,exec)
  # SUCC: 6 [100.0%]  (fallthru,exec)

  # BLOCK 6 freq:10000
  # PRED: 3 [100.0%]  (fallthru,exec) 7 [100.0%]  (fallthru) 5 [100.0%]
(fallthru,exec)
  # PT = anything

  # typeD.1608_1 = PHI <typeD.1608_5(3), typeD.1608_3(D)(7), typeD.1608_6(5)>
  # VUSE <.MEMD.2730_12(D)>
  # PT = anything
  D.2725_9 = typeD.1608_1->type_commonD.1607.main_variantD.1604;
  D.2733_15 = D.2725_9 != 0B;
  D.2734_14 = (intD.6) D.2733_15;
  # VUSE <.MEMD.2730_12(D)>
  return D.2734_14;
  # SUCC: EXIT [100.0%]

}
...

tail_merge_optimize discovers that block 3 and 5 are identical, and removes block 5.
In replace_block_by, we end up with phi_vuse1 == NULL_TREE and
phi_vuse2 == .MEMD.2730_12(D).

After the original fix to PR50763, this forces us to update the vuses, while
that is not necessary.

Attached patch fixes this problem by determining more precisely when the vuses
need to be updated.

bootstrapped and reg-tested on x86_64 and i686.

OK for trunk?

Thanks,
- Tom

2011-10-25  Tom de Vries  <tom@codesourcery.com>

	PR tree-optimization/50763
	* tree-ssa-tail-merge.c (replace_block_by): Update vops if phi_vuse1 or
	phi_vuse2 is NULL_TREE only if bb1 dominates or is dominated by bb2.

	* gcc.dg/pr50763-2.c: New test.
H.J. Lu - Oct. 25, 2011, 9:43 p.m.
On Tue, Oct 25, 2011 at 5:15 AM, Tom de Vries <Tom_deVries@mentor.com> wrote:
> Richard,
>
> I have a patch for the i686 bootstrap problem reported in PR50763 comment 10.
>
> pr50763-2.c looks like this before tail_merge_optimize:
> ...
> std_canonical_va_list_type (union tree_node * typeD.1608)
> {
>  _BoolD.1576 pretmp.6D.2739;
>  union tree_node * pretmp.5D.2738;
>  _BoolD.1576 pretmp.4D.2737;
>  union tree_node * pretmp.3D.2736;
>  intD.6 D.2734;
>  _BoolD.1576 D.2733;
>  union tree_node * D.2725;
>  intD.6 D.2722;
>  intD.6 D.2717;
>
>  # BLOCK 2 freq:10000
>  # PRED: ENTRY [100.0%]  (fallthru,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  D.2717_4 = typeD.1608_3(D)->baseD.1605.codeD.1597;
>  if (D.2717_4 != 0)
>    goto <bb 3>;
>  else
>    goto <bb 4>;
>  # SUCC: 3 [50.0%]  (true,exec) 4 [50.0%]  (false,exec)
>
>  # BLOCK 3 freq:5000
>  # PRED: 2 [50.0%]  (true,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  typeD.1608_5 = typeD.1608_3(D)->typedD.1606.typeD.1600;
>  goto <bb 6>;
>  # SUCC: 6 [100.0%]  (fallthru,exec)
>
>  # BLOCK 4 freq:5000
>  # PRED: 2 [50.0%]  (false,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  typeD.1608_6 = typeD.1608_3(D)->typedD.1606.typeD.1600;
>  # VUSE <.MEMD.2730_12(D)>
>  D.2722_7 = typeD.1608_6->baseD.1605.codeD.1597;
>  if (D.2722_7 != 0)
>    goto <bb 5>;
>  else
>    goto <bb 7>;
>  # SUCC: 5 [50.0%]  (true,exec) 7 [50.0%]  (false,exec)
>
>  # BLOCK 7 freq:2500
>  # PRED: 4 [50.0%]  (false,exec)
>  goto <bb 6>;
>  # SUCC: 6 [100.0%]  (fallthru)
>
>  # BLOCK 5 freq:2500
>  # PRED: 4 [50.0%]  (true,exec)
>  # SUCC: 6 [100.0%]  (fallthru,exec)
>
>  # BLOCK 6 freq:10000
>  # PRED: 3 [100.0%]  (fallthru,exec) 7 [100.0%]  (fallthru) 5 [100.0%]
> (fallthru,exec)
>  # PT = anything
>
>  # typeD.1608_1 = PHI <typeD.1608_5(3), typeD.1608_3(D)(7), typeD.1608_6(5)>
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  D.2725_9 = typeD.1608_1->type_commonD.1607.main_variantD.1604;
>  D.2733_15 = D.2725_9 != 0B;
>  D.2734_14 = (intD.6) D.2733_15;
>  # VUSE <.MEMD.2730_12(D)>
>  return D.2734_14;
>  # SUCC: EXIT [100.0%]
>
> }
> ...
>
> tail_merge_optimize discovers that block 3 and 5 are identical, and removes block 5.
> In replace_block_by, we end up with phi_vuse1 == NULL_TREE and
> phi_vuse2 == .MEMD.2730_12(D).
>
> After the original fix to PR50763, this forces us to update the vuses, while
> that is not necessary.
>
> Attached patch fixes this problem by determining more precisely when the vuses
> need to be updated.
>
> bootstrapped and reg-tested on x86_64 and i686.
>
> OK for trunk?
>
> Thanks,
> - Tom
>
> 2011-10-25  Tom de Vries  <tom@codesourcery.com>
>
>        PR tree-optimization/50763
>        * tree-ssa-tail-merge.c (replace_block_by): Update vops if phi_vuse1 or
>        phi_vuse2 is NULL_TREE only if bb1 dominates or is dominated by bb2.
>
>        * gcc.dg/pr50763-2.c: New test.
>

Does this fix

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50867
Richard Guenther - Oct. 26, 2011, 8:38 a.m.
On Tue, Oct 25, 2011 at 2:15 PM, Tom de Vries <Tom_deVries@mentor.com> wrote:
> Richard,
>
> I have a patch for the i686 bootstrap problem reported in PR50763 comment 10.
>
> pr50763-2.c looks like this before tail_merge_optimize:
> ...
> std_canonical_va_list_type (union tree_node * typeD.1608)
> {
>  _BoolD.1576 pretmp.6D.2739;
>  union tree_node * pretmp.5D.2738;
>  _BoolD.1576 pretmp.4D.2737;
>  union tree_node * pretmp.3D.2736;
>  intD.6 D.2734;
>  _BoolD.1576 D.2733;
>  union tree_node * D.2725;
>  intD.6 D.2722;
>  intD.6 D.2717;
>
>  # BLOCK 2 freq:10000
>  # PRED: ENTRY [100.0%]  (fallthru,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  D.2717_4 = typeD.1608_3(D)->baseD.1605.codeD.1597;
>  if (D.2717_4 != 0)
>    goto <bb 3>;
>  else
>    goto <bb 4>;
>  # SUCC: 3 [50.0%]  (true,exec) 4 [50.0%]  (false,exec)
>
>  # BLOCK 3 freq:5000
>  # PRED: 2 [50.0%]  (true,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  typeD.1608_5 = typeD.1608_3(D)->typedD.1606.typeD.1600;
>  goto <bb 6>;
>  # SUCC: 6 [100.0%]  (fallthru,exec)
>
>  # BLOCK 4 freq:5000
>  # PRED: 2 [50.0%]  (false,exec)
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  typeD.1608_6 = typeD.1608_3(D)->typedD.1606.typeD.1600;
>  # VUSE <.MEMD.2730_12(D)>
>  D.2722_7 = typeD.1608_6->baseD.1605.codeD.1597;
>  if (D.2722_7 != 0)
>    goto <bb 5>;
>  else
>    goto <bb 7>;
>  # SUCC: 5 [50.0%]  (true,exec) 7 [50.0%]  (false,exec)
>
>  # BLOCK 7 freq:2500
>  # PRED: 4 [50.0%]  (false,exec)
>  goto <bb 6>;
>  # SUCC: 6 [100.0%]  (fallthru)
>
>  # BLOCK 5 freq:2500
>  # PRED: 4 [50.0%]  (true,exec)
>  # SUCC: 6 [100.0%]  (fallthru,exec)
>
>  # BLOCK 6 freq:10000
>  # PRED: 3 [100.0%]  (fallthru,exec) 7 [100.0%]  (fallthru) 5 [100.0%]
> (fallthru,exec)
>  # PT = anything
>
>  # typeD.1608_1 = PHI <typeD.1608_5(3), typeD.1608_3(D)(7), typeD.1608_6(5)>
>  # VUSE <.MEMD.2730_12(D)>
>  # PT = anything
>  D.2725_9 = typeD.1608_1->type_commonD.1607.main_variantD.1604;
>  D.2733_15 = D.2725_9 != 0B;
>  D.2734_14 = (intD.6) D.2733_15;
>  # VUSE <.MEMD.2730_12(D)>
>  return D.2734_14;
>  # SUCC: EXIT [100.0%]
>
> }
> ...
>
> tail_merge_optimize discovers that block 3 and 5 are identical, and removes block 5.
> In replace_block_by, we end up with phi_vuse1 == NULL_TREE and
> phi_vuse2 == .MEMD.2730_12(D).
>
> After the original fix to PR50763, this forces us to update the vuses, while
> that is not necessary.
>
> Attached patch fixes this problem by determining more precisely when the vuses
> need to be updated.
>
> bootstrapped and reg-tested on x86_64 and i686.
>
> OK for trunk?

Ok.

Thanks,
Richard.

> Thanks,
> - Tom
>
> 2011-10-25  Tom de Vries  <tom@codesourcery.com>
>
>        PR tree-optimization/50763
>        * tree-ssa-tail-merge.c (replace_block_by): Update vops if phi_vuse1 or
>        phi_vuse2 is NULL_TREE only if bb1 dominates or is dominated by bb2.
>
>        * gcc.dg/pr50763-2.c: New test.
>

Patch

Index: gcc/tree-ssa-tail-merge.c
===================================================================
--- gcc/tree-ssa-tail-merge.c (revision 180375)
+++ gcc/tree-ssa-tail-merge.c (working copy)
@@ -1551,7 +1551,12 @@  replace_block_by (basic_block bb1, basic
       phi_vuse1 = vop_at_entry (bb1);
 
       /* If both are not found, it means there's no need to update.  */
-      update_vops = phi_vuse1 != NULL_TREE || phi_vuse2 != NULL_TREE;
+      if (phi_vuse1 == NULL_TREE && phi_vuse2 == NULL_TREE)
+	update_vops = false;
+      else if (phi_vuse1 == NULL_TREE)
+	update_vops = dominated_by_p (CDI_DOMINATORS, bb1, bb2);
+      else if (phi_vuse2 == NULL_TREE)
+	update_vops = dominated_by_p (CDI_DOMINATORS, bb2, bb1);
     }
 
   if (phi_vuse1 && gimple_bb (SSA_NAME_DEF_STMT (phi_vuse1)) == bb1)
Index: gcc/testsuite/gcc.dg/pr50763-2.c
===================================================================
--- /dev/null (new file)
+++ gcc/testsuite/gcc.dg/pr50763-2.c (revision 0)
@@ -0,0 +1,46 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef union tree_node *tree;
+
+struct tree_base
+{
+  int code;
+};
+
+struct tree_typed
+{
+  struct tree_base base;
+  tree type;
+};
+
+struct tree_common
+{
+  struct tree_typed typed;
+};
+
+struct tree_type_common
+{
+  tree main_variant;
+};
+
+union tree_node
+{
+  struct tree_base base;
+  struct tree_typed typed;
+  struct tree_type_common type_common;
+};
+
+int std_canonical_va_list_type (tree type)
+{
+  if (type->base.code)
+    type = type->typed.type;
+  else
+    if (type->typed.type->base.code)
+      type = type->typed.type;
+
+  if (type->type_common.main_variant)
+    return 1;
+
+  return 0;
+}