<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Arial,Helvetica,sans-serif;" dir="ltr">
<p>Hey guys ,</p>
<p><br>
</p>
<p>I have question : How to find nearest store to a alloca variable in LLVM ?</p>
<p><br>
</p>
<p>I tried to write a LLVM pass for the following C++ program - </p>
<p><br>
</p>
<p></p>
<div>#include <stdio.h></div>
<div>int main()</div>
<div>{</div>
<div>int a ;</div>
<div>int datasize;</div>
<div><br>
</div>
<div>datasize = 5;</div>
<div><b><span style="color: rgb(255, 0, 0);">datasize=10; // most recent definition for the (useless)  "datasize=datasize" below.</span></b></div>
<div><br>
</div>
<div>datasize = datasize;</div>
<div><br>
</div>
<div>// Just for verification of result. should be 10.</div>
<div>printf("value=%d",a+datasize);</div>
<div>return a+datasize;</div>
<div><br>
</div>
<div>}</div>
<br>
<p></p>
<p>//==================</p>
<p><br>
</p>
<p>I wrote the following <b>LLVM Function Pass</b> for it ( Have not included unecessary details ) </p>
<p><br>
</p>
<p><br>
</p>
<p><br>
</p>
<p></p>
<div>for(Function::iterator BB = F.begin() ; BB != F.end() ; ++BB)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>for(BasicBlock::iterator I = BB->begin(); I != BB->end() ; ++I)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(StoreInst* st = dyn_cast<StoreInst>(I))</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>User* user1 = st;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>std::string str =
<span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
user1 </span>->getOperand(1)->getName();</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// it is a store to datasize</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(str=="datasize)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Use& use1 = user1->getOperandUse(0) ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// trying to find nearest assignment/store for this.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Value* v = <span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
use1 </span>.get();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>errs() << *v << "\n" ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// this means that it was datasize = datasize</div>
<div>                                      // since it is translated to the following in IR -</div>
<div>
<div>                                   <span style="color: rgb(255, 0, 0);">  //
</span><span style="color: rgb(255, 0, 0);">%0 = load i32, i32* %datasize, align 4</span></div>
<div><span style="color: rgb(255, 0, 0);">                                    // </span><span style="color: rgb(255, 0, 0);">store i32 %0, i32* %datasize, align 4</span></div>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if(LoadInst* loadInst = dyn_cast<LoadInst>(v))</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>User* <span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
user2</span>= loadInst ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Use& use2= <span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
user21</span>->getOperandUse(0);</div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>// find nearest defiinion/store</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>Value* v2 = <span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
use2</span>.get();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>errs() << "found nearest definiton" << *v2 << "\n" ;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}<span class="Apple-tab-span" style="white-space:pre">
</span></div>
<div><br>
</div>
<div><br>
</div>
//===========================================
<div><br>
</div>
<div>The result I get -</div>
<div><br>
</div>
<div><br>
</div>
<div>
<div>i32 5 ----------------> ignore,n<span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">ot useful</span></div>
<div>i32 10 ------------------> <span style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
ignore,</span>not useful</div>
<div><span style="color: rgb(255, 0, 0);">  %0 = load i32, i32* %datasize, align 4</span></div>
<div><span style="color: rgb(255, 0, 0);">found nearest  %datasize = alloca i32, align 4</span></div>
<div><span style="color: rgb(255, 0, 0);"><br>
</span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">My Issue :  The nearest "def" found for the usage of datasize=datasize is an </span><br>
</span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">alloca instruction while I wanted to find the IR -</span></span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);"><span><b>store i32 10, i32* %datasize, align 4</b></span><br>
</span></span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">(In C++ - "<b style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><span style="color: rgb(255, 0, 0);">datasize=10"
 instruction. as seen below).</span></b></span></span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);"><br>
</span></span></div>
<div><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">
<div><br>
</div>
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
// ... c++ code</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
datasize = 5;</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<b><span style="color: rgb(255, 0, 0);">datasize=10; // most recent definition for the (useless)  "datasize=datasize" below.</span></b></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
datasize = datasize;</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
<br>
</div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">
// ... C++ code</div>
</div>
<br>
</span></span></div>
<div><br>
</div>
<div>Thank you for keeping patience and reading uptil here.</div>
<b><u>My Question : Can anyone explain how I can find the nearest store to a variable  in LLVM IR ?</u></b></div>
<div><br>
<p></p>
<p><br>
</p>
<p><br>
</p>
<p>Thanks,</p>
<p>Malhar</p>
</div>
</div>
</body>
</html>