New patch with your advice, just delete when replace those nodes.

Index: wn_lower.cxx
===================================================================
--- wn_lower.cxx        (revision 3327)
+++ wn_lower.cxx        (working copy)
@@ -2400,8 +2400,6 @@
                   WN_Sqrt(desc, WN_kid0(tree)));

       lower_complex_expr(block, div, actions, realpart, imagpart);
-
-      WN_Delete(tree);
     }
     break;

@@ -2416,7 +2414,6 @@

       *realpart = WN_Paren(type, *realpart);
       *imagpart = WN_Paren(type, *imagpart);
-      WN_Delete(tree);
     }
     break;

@@ -2589,7 +2586,6 @@
        *realpart = WN_LdidPreg(type, realpartN);
        *imagpart = WN_LdidPreg(type, imagpartN);
       }
-      WN_Delete(tree);
     }
     break;

@@ -2817,7 +2813,6 @@
        *realpart = WN_LdidPreg(type, realpartN);
        *imagpart = WN_LdidPreg(type, imagpartN);
       }
-      WN_Delete(tree);
     }
     break;

@@ -2846,8 +2841,6 @@
                             realpart, &iz);

          *imagpart = WN_Neg(type, iz);
-
-         WN_Delete(tree);
        }
         break;
       case INTRN_V16C8MPY_ADDSUB:
@@ -8041,6 +8034,7 @@
       if (imagexp == NULL && realTY == WN_rtype(WN_kid0(tree)))
       {
         imagexp = WN_Floatconst(realTY, 0.0);
+        WN_Delete(WN_kid0(tree));
         WN_kid0(tree) = WN_CreateExp2( OPR_PAIR, WN_desc(tree), MTYPE_V,
                        realexp, imagexp);
       }
@@ -8467,7 +8461,7 @@
     eval = WN_CreateEval(realexp);
     WN_Set_Linenum(eval, current_srcpos);  // Bug 1268
     WN_INSERT_BlockLast(block, eval);
-
+    WN_Delete(child);
     child = imagexp;
   }
   else if (Action(LOWER_QUAD) && MTYPE_is_quad(WN_rtype(child)))

---------
Thanks,
zhuqing

在 2010年8月27日 上午7:33,Mike Murphy <mmur...@nvidia.com>写道:

>  In several places you do
> WN_kid0(tree) ==NULL;
> which is one too many =.
>
> The code around the original problem looks wrong too, as if you move
> lower_complex_expr down, then line 8041 which references imageexp is wrong.
>
> The usual rule is that the when you replace a node you should delete.  To
> always delete the node after every call seems potentially wrong, if the node
> was still referenced (admittedly not the common case).  The code for
> this lower_complex_expr does not seem consistent which is confusing and thus
> is causing the problem you are seeing.  It looks to me like
> lower_complex_expr should not be doing any deletes, but I wouldn't
> automatically do the deletes after every call.  It does look like lines 8044
> and 8088 should be deletes, plus 8465.
>
>  ------------------------------
> *From:* 朱庆 [mailto:zqing1...@gmail.com]
> *Sent:* Wednesday, August 25, 2010 7:38 PM
> *To:* Mike Murphy
> *Cc:* open64-devel@lists.sourceforge.net
> *Subject:* Re: [Open64-devel] Assertion failure in wn_lower phase
>
> Yes, you are right, I 've added the new patch in the attchment to deleted
> all the whirl node after they were lowered. Could you help reviewing it
> again?
>
> Thanks,
> Zhuqing
>
> 在 2010年8月19日 下午1:07,Mike Murphy <mmur...@nvidia.com>写道:
>
>>  Aren't there multiple calls to lower_complex_expr?  In this case maybe
>> only deleting at the caller is right, but if other uses do not do the
>> delete, and you don't delete in the callee, then you will never delete.
>>
>>  ------------------------------
>> *From:* 朱庆 [mailto:zqing1...@gmail.com]
>> *Sent:* Wednesday, August 18, 2010 9:23 PM
>> *To:* open64-devel@lists.sourceforge.net
>> *Subject:* [Open64-devel] Assertion failure in wn_lower phase
>>
>>   Hi, All
>>
>> Can gatekeeper help review this fix?
>>
>> This bug is happens in wn_lower phase, more detailed info please refer to
>> https://bugs.open64.net/show_bug.cgi?id=591.
>> Attached is the patch.
>>
>> The failure is due to one whirl node address attached by two nodes.
>> The main cause is that in wn_lower.cxx:7741:lower_complex_expr(block,
>> WN_kid0(tree), actions, &realexp, &imagexp), WN_kid0(tree) was deleted in
>> the function,
>> , howerver in 7783, the node deleted again , so if there are other new
>> node created between line 7741and 7783, it may reuse the deleted node
>> address, and will be wrongly deleted by line 7783.
>> The fix is modified function lower_complex_expr, delete all
>> "WN_Delete(tree);".
>>
>>    7741       lower_complex_expr(block, WN_kid0(tree), actions, &realexp,
>> &imagexp);
>>    7742        ......
>>    7762           realexpN = AssignExpr(block, realexp, realTY);
>>    7763           realexp_copy = WN_LdidPreg(realTY, realexpN);
>>    7764         .......
>>    7783         WN_Delete(WN_kid0(tree));
>>    7784         WN_kid0(tree) = WN_Ldid(MTYPE_F8, 0, c4temp_st,
>> MTYPE_To_TY(MTYPE_F8));
>>
>>
>> Best Regards,
>> Zhu Qing
>>  ------------------------------
>>  This email message is for the sole use of the intended recipient(s) and
>> may contain confidential information.  Any unauthorized review, use,
>> disclosure or distribution is prohibited.  If you are not the intended
>> recipient, please contact the sender by reply email and destroy all copies
>> of the original message.
>>  ------------------------------
>>
>>
>
------------------------------------------------------------------------------
This SF.net Dev2Dev email is sponsored by:

Show off your parallel programming skills.
Enter the Intel(R) Threading Challenge 2010.
http://p.sf.net/sfu/intel-thread-sfd
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel

Reply via email to