[LLVMdev] use-def chain questions
Chris Lattner
clattner at apple.com
Sat Dec 5 10:42:53 PST 2009
On Dec 5, 2009, at 4:02 AM, Tianwei wrote:
> Hi, all,
> We are working on a static analysis phase on LLVM's IR, we want to do a backforward phase through the use-def chain, I knew that LLVM
> had a built-in SSA form which provide the use-def chain for virtual register variables, however, I want to know if you also provide some kinds of use-def chain for memory operations? for example, I have the following source code
>
> int foo(int *q, int *p) {
> int x;
> *p = 1;
> x = *q;
> return x;
> }
>
> the IR after front-end is:
>
> s1: store i32* %q, i32** %q_addr
> s2: store i32* %p, i32** %p_addr
>
> s3: %1 = load i32** %p_addr, align 8 ; <i32*> [#uses=1]
> s4: store i32 1, i32* %1, align 4
>
> s5: %2 = load i32** %q_addr, align 8 ; <i32*> [#uses=1]
> s6: %3 = load i32* %2, align 4 ; <i32> [#uses=1]
> s7: store i32 %3, i32* %x, align 4
>
> in the source code, I want to find the definition statement of "*q", here since we do not know if p and q are aliased or not, we assume they are may-aliased, So I want to find the statement "*p = 1" as the define statement
>
> in the IR code, s6 is the load instruction for "*p", s4 is the store instruction for "*q", is there existing infrastructure for us to use and find s4 directly?
> I understand that I can traverse back every instruction, and compare the alias result to see if any instruction prior to it is define statement, but I am not sure if there is already better way to do that.
This is what the MemoryDependenceAnalysis pass is used for. Given a load (for example) it searches "up" the cfg to find a defining store or a clobbering value (e.g. a store which may alias the loaded pointer).
-Chris
More information about the llvm-dev
mailing list