<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi,<div><br></div><div>Now I want use llvm to do pointer analysis, and I use -mem2reg to get the SSA IR, but when I analysis source code with pointer, the IR will not in SSA format. For example, the following C code:</div><div><div>void test() {</div><div><span style="white-space:pre">    </span>int a, b, c, d;</div><div><span style="white-space:pre">       </span>int *p, *q, *m, *n;</div><div><br></div><div><span style="white-space:pre">  </span>p = &a;</div><div><span style="white-space:pre">   </span>get2(&p);</div><div><span style="white-space:pre"> </span>q = &b;</div><div><span style="white-space:pre">   </span>get2(&q);</div><div><span style="white-space:pre"> </span>m = &c;</div><div><span style="white-space:pre">   </span>get2(&m);</div><div><span style="white-space:pre"> </span>n = &d;</div><div><span style="white-space:pre">   </span>get2(&n);</div><div><span style="white-space:pre"> </span>p = q;</div><div><span style="white-space:pre">        </span>m = p;</div><div><span style="white-space:pre">        </span>p = n;</div><div><span style="white-space:pre">        </span>get2(&n);</div><div>}</div></div><div><br></div><div>I use the following command to get IR result:</div><div><div>clang -S -emit-llvm -Xclang -disable-O0-optnone -c new.c -o new.ll</div><div>opt -S -mem2reg new.ll -o new.opt.ll</div></div><div><br></div><div>It's IR:</div><div><div>define dso_local void @test() #0 {</div><div>entry:</div><div>  %a = alloca i32, align 4</div><div>  %b = alloca i32, align 4</div><div>  %c = alloca i32, align 4</div><div>  %d = alloca i32, align 4</div><div>  %p = alloca i32*, align 4</div><div>  %q = alloca i32*, align 4</div><div>  %m = alloca i32*, align 4</div><div>  %n = alloca i32*, align 4</div><div>  store i32* %a, i32** %p, align 4</div><div>  call void @get2(i32** %p)</div><div>  store i32* %b, i32** %q, align 4</div><div>  call void @get2(i32** %q)</div><div>  store i32* %c, i32** %m, align 4</div><div>  call void @get2(i32** %m)</div><div>  store i32* %d, i32** %n, align 4</div><div>  call void @get2(i32** %n)</div><div>  %0 = load i32*, i32** %q, align 4</div><div>  store i32* %0, i32** %p, align 4</div><div>  %1 = load i32*, i32** %p, align 4</div><div>  store i32* %1, i32** %m, align 4</div><div>  %2 = load i32*, i32** %n, align 4</div><div>  store i32* %2, i32** %p, align 4</div><div>  call void @get2(i32** %n)</div><div>  ret void</div><div>}</div></div><div><br></div><div>I want to distinguish varitable p in p = q;p = n, like p0 = q;p1 = n. How can I get the SSA IR that variables defined multiple times in the original representation will be split into separate instances?</div><div><br></div><div>Also, when I use -mem2reg to get IR, they would do some optimization, such as remove some unnecessary stack allocation. Can I get SSA IR without other optimization?</div><div><br></div><div>Thank you,</div><div>panqaq</div></div></div></div></div></div></div></div></div>