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

login
register
mail settings
Submitter Tom de Vries
Date Nov. 2, 2011, 6:02 p.m.
Message ID <4EB185AD.5010402@mentor.com>
Download mbox | patch
Permalink /patch/123308/
State New
Headers show

Comments

Tom de Vries - Nov. 2, 2011, 6:02 p.m.
On 10/26/2011 10:38 AM, Richard Guenther wrote:
> 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.
> 

Committed additional testcase from duplicate PR50854.

Thanks,
- Tom

2011-11-02  Tom de Vries  <tom@codesourcery.com>

	PR tree-optimization/50763
	* g++.dg/pr50763-3.C: New test.

Patch

Index: gcc/testsuite/g++.dg/pr50763-3.C
===================================================================
--- /dev/null (new file)
+++ gcc/testsuite/g++.dg/pr50763-3.C (revision 0)
@@ -0,0 +1,57 @@ 
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -ftree-tail-merge" } */
+
+class v2d {
+public:
+   double x;
+   double y;
+};
+
+class v3d {
+public:
+   double x;
+   v3d() {}
+   v3d(const v2d & cr2Dv) {}
+};
+
+class e2d {
+protected:
+   v2d _Min;
+   v2d _Max;
+public:
+   int cop2d(const v2d & rPnt) const;
+   v2d clp2d(const v2d & rPnt) const;
+};
+
+inline int e2d::cop2d(const v2d & rPnt) const {
+   int bRet = 1;
+   if (rPnt.x < _Min.x) bRet = 0;
+   else if (rPnt.x > _Max.x) bRet = 0;
+   else if (rPnt.y > _Max.y) bRet = 0;
+   return bRet;
+}
+
+inline v2d e2d::clp2d(const v2d & rPnt) const {
+   v2d sRet = rPnt;
+   if (rPnt.x < _Min.x) sRet.x = _Min.x;
+   if (rPnt.y < _Min.y) sRet.y = _Min.y;
+   if (rPnt.x > _Max.x) sRet.x = _Max.x;
+   if (rPnt.y > _Max.y) sRet.y = _Max.y;
+   return sRet;
+}
+
+class sExt {
+protected:
+   e2d _Dom;
+   long eval() const;
+   long evalPoint(const v2d & crUV, v3d & rPnt) const;
+};
+
+long sExt::evalPoint(const v2d & crUV, v3d & rPnt) const {
+   v3d sUV = crUV;
+   if (!_Dom.cop2d(crUV)) {
+      sUV = _Dom.clp2d(crUV);
+   }
+   eval();
+}