<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div>Hello Hal:</div><div><br></div><div>There is memory leak in method ContractNodes (below code is from trunk):</div><div><br></div><div><div>26<span class="Apple-tab-span" style="white-space:pre">      </span>static void ContractNodes(std::unique_ptr<Matcher> &MatcherPtr,</div><div>27<span class="Apple-tab-span" style="white-space:pre">  </span>                          const CodeGenDAGPatterns &CGP) {</div><div>...</div><div>43<span class="Apple-tab-span" style="white-space:pre">  </span>  // transform it.</div><div>44<span class="Apple-tab-span" style="white-space:pre">    </span>  if (MoveChildMatcher *MC = dyn_cast<MoveChildMatcher>(N)) {</div><div>45<span class="Apple-tab-span" style="white-space:pre">   </span>    Matcher *New = nullptr;</div><div>46<span class="Apple-tab-span" style="white-space:pre">      </span>    if (RecordMatcher *RM = dyn_cast<RecordMatcher>(MC->getNext()))</div><div>47<span class="Apple-tab-span" style="white-space:pre">     </span>      if (MC->getChildNo() < 8)  // Only have RecordChild0...7</div><div>48<span class="Apple-tab-span" style="white-space:pre">   </span>        New = new RecordChildMatcher(MC->getChildNo(), RM->getWhatFor(),</div><div>49<span class="Apple-tab-span" style="white-space:pre"> </span>                                     RM->getResultNo());</div><div>50<span class="Apple-tab-span" style="white-space:pre">      </span></div><div>51<span class="Apple-tab-span" style="white-space:pre">   </span>    if (CheckTypeMatcher *CT = dyn_cast<CheckTypeMatcher>(MC->getNext()))</div><div>52<span class="Apple-tab-span" style="white-space:pre">       </span>      if (MC->getChildNo() < 8 &&  // Only have CheckChildType0...7</div><div>53<span class="Apple-tab-span" style="white-space:pre">      </span>          CT->getResNo() == 0)     // CheckChildType checks res #0</div><div>---> We should delete previous allocated New here!</div><div>54<span class="Apple-tab-span" style="white-space:pre">       </span>        New = new CheckChildTypeMatcher(MC->getChildNo(), CT->getType());</div><div>55<span class="Apple-tab-span" style="white-space:pre">        </span></div><div>56<span class="Apple-tab-span" style="white-space:pre">   </span>    if (CheckSameMatcher *CS = dyn_cast<CheckSameMatcher>(MC->getNext()))</div><div>57<span class="Apple-tab-span" style="white-space:pre">       </span>      if (MC->getChildNo() < 4)  // Only have CheckChildSame0...3</div><div><span style="line-height: 23.7999992370605px;">---> We should delete </span>previous<span style="line-height: 23.7999992370605px;"> allocated New here!</span></div><div>58<span class="Apple-tab-span" style="white-space:pre">  </span>        New = new CheckChildSameMatcher(MC->getChildNo(), CS->getMatchNumber());</div><div>59<span class="Apple-tab-span" style="white-space:pre"> </span></div><div>60<span class="Apple-tab-span" style="white-space:pre">   </span>    if (CheckIntegerMatcher *CS = dyn_cast<CheckIntegerMatcher>(MC->getNext()))</div><div>61<span class="Apple-tab-span" style="white-space:pre"> </span>      if (MC->getChildNo() < 5)  // Only have CheckChildInteger0...4</div><div><span style="line-height: 23.7999992370605px;">---> We should delete </span>previous<span style="line-height: 23.7999992370605px;"> allocated New here!</span></div><div>62<span class="Apple-tab-span" style="white-space:pre">       </span>        New = new CheckChildIntegerMatcher(MC->getChildNo(), CS->getValue());</div><div>63<span class="Apple-tab-span" style="white-space:pre">    </span></div><div>64<span class="Apple-tab-span" style="white-space:pre">   </span>    if (New) {</div><div>65<span class="Apple-tab-span" style="white-space:pre">   </span>      // Insert the new node.</div><div>66<span class="Apple-tab-span" style="white-space:pre">       </span>      New->setNext(MatcherPtr.release());</div><div>67<span class="Apple-tab-span" style="white-space:pre">        </span>      MatcherPtr.reset(New);</div><div>68<span class="Apple-tab-span" style="white-space:pre">        </span>      // Remove the old one.</div><div>69<span class="Apple-tab-span" style="white-space:pre">        </span>      MC->setNext(MC->getNext()->takeNext());</div><div>70<span class="Apple-tab-span" style="white-space:pre">      </span>      return ContractNodes(MatcherPtr, CGP);</div><div>71<span class="Apple-tab-span" style="white-space:pre">        </span>    }</div></div><div><br></div><div><br></div><div>Regards</div><div>Hui Wu</div></div><br><br><span title="neteasefooter"><span id="netease_mail_footer"></span></span>