<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=us-ascii">
<meta name=Generator content="Microsoft Word 12 (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;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</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=Section1>

<p class=MsoNormal>I’ve recently sync’d to a newer version of LLVM(Apple
branch 2326 from Apple branch 2323.8) that changed the interface to
addCommonCodeGenPasses which caused the default implementation to be executed
instead of my overriding implementation. This default implementation has DeadMachineInstructionElim
pass enabled, which is causing havoc with my backend. Before entering this
pass, everything in my machine function is fine, after this pass, all
instructions that are not function calls are deleted. I’ve tracked this
issue down to the line:<o:p></o:p></p>

<p class=MsoNormal>BitVector NonAllocatableRegs = TRI->getAllocatableSet(MF);
(In my case all registers defined in RegisterInfo.td)<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>This function loops through all registers classes and sets
all registers in the bitset that are allocatable. It then inverts the registers
that are set to get the NonAllocatable registers and assigns that to the
LivePhysRegs for each basic block in a function. The function then loops
through all instructions in a basic block and checks to see if it is a dead
instruction.  The check is whether it is a physical register or not with
the check:<o:p></o:p></p>

<p class=MsoNormal>TargetRegisterInfo::isPhysicalRegister(reg) ?
LivePhysRegs[Reg] : !MRI->use_nodbg_empty(Reg)<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>If the register is virtual, then MRI->use_nodbg_empty()
returns false, if the register is physical LivePhysRegs[Reg] returns false,
since the bitvector was inverted. So my instruction is considered dead and
deleted.<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>So, what I am trying to figure out is why this behavior is occurring?
I don’t see this happening on the x86 backend because getAllocatableSet
does not return all registers as set. <o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Since I’m working on virtual registers, how do I get
MRI->use_nodbg_empty() to return true? Is there something I should be
setting in my backend that affects this?<o:p></o:p></p>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal>Thanks,<o:p></o:p></p>

<p class=MsoNormal>Micah<o:p></o:p></p>

</div>

</body>

</html>