<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">In general, we have to RAUW before we erase an instruction in dead code; even if we know the instruction is dead, it could still have uses in other dead code.  If an instruction still has uses, we can’t erase it.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Eli<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> llvm-dev <llvm-dev-bounces@lists.llvm.org> <b>On Behalf Of
</b>Alexandre Isoard via llvm-dev<br>
<b>Sent:</b> Tuesday, June 16, 2020 7:33 PM<br>
<b>To:</b> David Majnemer <david.majnemer@gmail.com>; llvm-dev <llvm-dev@lists.llvm.org><br>
<b>Subject:</b> [EXT] [llvm-dev] InstCombine doesn't delete instructions with token<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Hello David,<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I am having an issue with some custom intrinsics that return a token value: InstCombine deletes the users of the token but not the instruction that creates the token itself. The IR is still valid but it's wasted.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The source of the issue is coming from an old patch of yours:<o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">commit 7204cff0a121ebc770cf81f7f94679ae7324daae<br>
Author: David Majnemer <<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>><br>
Date:   Fri Nov 6 21:26:32 2015 +0000<br>
<br>
    [InstCombine] Don't RAUW tokens with undef<br>
    <br>
    Let SimplifyCFG remove unreachable BBs which define token instructions.<br>
    <br>
    llvm-svn: 252343<br>
<br>
--- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp<br>
+++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp<br>
@@ -3012,7 +3012,7 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,<br>
     while (EndInst != BB->begin()) {<br>
       // Delete the next to last instruction.<br>
       Instruction *Inst = &*--EndInst->getIterator();<br>
-      if (!Inst->use_empty())<br>
+      if (!Inst->use_empty() && !Inst->getType()->isTokenTy())<br>
         Inst->replaceAllUsesWith(UndefValue::get(Inst->getType())); <br>
-      if (Inst->isEHPad()) { <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">+      if (Inst->isEHPad() || Inst->getType()->isTokenTy()) { <br>
         EndInst = Inst;<br>
@@ -3022,7 +3022,8 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,<br>
         ++NumDeadInst;<br>
         MadeIRChange = true;<br>
       }<br>
       Inst->eraseFromParent();<br>
     }<br>
   }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I believe the goal was to avoid RAUW the EHPad (as we don't delete the associated EHRet) and not skip all of the token instructions. At least you only test on EHPad in the associated unit test.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">In which case we could instead do:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">     while (EndInst != BB->begin()) {<br>
       // Delete the next to last instruction.<br>
       Instruction *Inst = &*--EndInst->getIterator();<br>
-      if (!Inst->use_empty())<br>
+      if (!Inst->use_empty() && !Inst->isEHPad())<br>
         Inst->replaceAllUsesWith(UndefValue::get(Inst->getType())); <br>
       if (Inst->isEHPad()) { <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">         EndInst = Inst;<br>
@@ -3022,7 +3022,8 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,<br>
         ++NumDeadInst;<br>
         MadeIRChange = true;<br>
       }<br>
       Inst->eraseFromParent();<br>
     }<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Is my assumption correct?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Note that the code is now in llvm::removeAllNonTerminatorAndEHPadInstructions of llvm/lib/Transforms/Utils/Local.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<p class="MsoNormal">-- <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal"><b>Alexandre Isoard</b><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>