<div dir="ltr"><div>Hi,</div><div><br></div><div>I want to track StoreInst that affect loadInst/CallInst.</div><div><br></div><div>e.g %1 = alloc i32</div><div>      store 10,%1</div><div>      foo(%1)      -------> %1 should take the value 10 (defined by store ins)</div><div><br></div><div>I tried to use MemSSA for this but for situations I can't find these correct dependencies possibly due to insufficient Alias information <br></div><div><br></div><div>e.g <br></div><div>Consider the C code:<code class="gmail-cpp gmail-hljs"></code><pre><code class="gmail-cpp gmail-hljs"><span class="gmail-line"></span>__attribute__((noinline)) <span class="gmail-hljs-function"><span class="gmail-hljs-keyword">void</span> <span class="gmail-hljs-title">foo</span><span class="gmail-hljs-params">(<span class="gmail-hljs-keyword">int</span> i,<span class="gmail-hljs-keyword">int</span> j)</span>
<span class="gmail-line"></span></span>{
<span class="gmail-line"></span>    <span class="gmail-hljs-built_in">printf</span>(<span class="gmail-hljs-string">"%d %d"</span>,i,j);
<span class="gmail-line"></span>}
<span class="gmail-line"></span><span class="gmail-hljs-function"><span class="gmail-hljs-keyword">int</span> <span class="gmail-hljs-title">main</span><span class="gmail-hljs-params">()</span>
<span class="gmail-line"></span></span>{
<span class="gmail-line"></span>    <span class="gmail-hljs-keyword">int</span> j;
<span class="gmail-line"></span>    <span class="gmail-hljs-keyword">int</span> k;
<span class="gmail-line"></span>    <span class="gmail-hljs-built_in">scanf</span>(<span class="gmail-hljs-string">"%d%d"</span>,&j,&k);
<span class="gmail-line"></span>    j+=<span class="gmail-hljs-number">10</span>;
<span class="gmail-line"></span>    k-=<span class="gmail-hljs-number">3</span>;
<span class="gmail-line"></span>
<span class="gmail-line"></span>    <span class="gmail-hljs-comment">//func call to force the stores</span>
<span class="gmail-line"></span>    foo(j,k);
<span class="gmail-line"></span>
<span class="gmail-line"></span>    <span class="gmail-hljs-comment">//func call to force the loads</span>
<span class="gmail-line"></span>    <span class="gmail-hljs-built_in">printf</span>(<span class="gmail-hljs-string">"%d %d"</span>,j,k);
<span class="gmail-line"></span>}</code></pre>

</div><div><br></div><div><u><b>MemSSA generated:</b></u></div><div>define dso_local i32 @main() #2 {<br>  %1 = alloca i32, align 4<br>  %2 = alloca i32, align 4<br>  %3 = bitcast i32* %1 to i8*<br>; 1 = MemoryDef(liveOnEntry)<br>  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %3) #5<br>  %4 = bitcast i32* %2 to i8*<br>; 2 = MemoryDef(1)<br>  call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %4) #5<br>  %5 = getelementptr inbounds [5 x i8], [5 x i8]* @.str.1, i64 0, i64 0<br>; 3 = MemoryDef(2)<br>  %6 = call i32 (i8*, ...) @__isoc99_scanf(i8* %5, i32* nonnull %1, i32* nonnull %2)<br>; MemoryUse(3) MayAlias<br>  %7 = load i32, i32* %1, align 4, !tbaa !5<br>  %8 = add nsw i32 %7, 10<br>; 4 = MemoryDef(3)<br>  store i32 %8, i32* %1, align 4, !tbaa !5<br>; MemoryUse(3) MayAlias<br>  %9 = load i32, i32* %2, align 4, !tbaa !5<br>  %10 = add nsw i32 %9, -3<br>; 5 = MemoryDef(4)<br>  store i32 %10, i32* %2, align 4, !tbaa !5<br>; 6 = MemoryDef(5)<br>  call void @foo(i32 %8, i32 %10)<br>; MemoryUse(6) MayAlias<br>  %11 = load i32, i32* %1, align 4, !tbaa !5<br>; MemoryUse(6) MayAlias<br>  %12 = load i32, i32* %2, align 4, !tbaa !5<br>  %13 = getelementptr inbounds [6 x i8], [6 x i8]* @.str, i64 0, i64 0<br>; 7 = MemoryDef(6)<br>  %14 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) %13, i32 %11, i32 %12)</div><div><br></div><div><br></div><div><br></div><div>Two  issues for me:</div><div>1. I am not able to track from where the values for %11 and %12 are coming. There are coming from 2 store instructions before the foo call. But since both loads   have defining ins as 
6 = MemoryDef(5), I couldn't get these stores.<br></div><div>The only way I could find them is traverse back using def chain created in MemSSA <br></div><div><br></div><div>2. For function foo(), I can't trace from where parameter values are coming from because MemSSA only gives 1 link up  i.e it tracks only 
5 = MemoryDef(4)and not the other store.  That is to say, its tracking only 1 parameter.<br></div><div><br></div><div>Is there any solution to this?</div><div><br></div><div>Regards</div><div>Sushant<br></div></div>