[llvm-dev] API to Differentiate between SSA and non SSA form

Pushpinder Singh via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 19 08:50:20 PDT 2017

Hello everyone,

We are working on a particular points-to analysis. The final output of
that analysis should not have the LLVM SSA temporaries (like, %0, %1).
My doubt is that whether we can extract the normal C variables from
LLVM IR or is there any way to differentiate between SSA temporary and
local C variable?

For e.g. in GCC I can check whether a particular variable is an SSA
temporary like,

     if(TREE_CODE(t) == SSA_NAME)
            return true;

Basically, I want to skip all those %0, %1 temporaries. But keep all
those which refer to C variables. One way to do this would be to check
whether a Value has been given a name by using hasName function. But
it does not work every time. For e.g. in case of getelementptr
instruction, this name refers to a member name of a structure (which
is in SSA form).

define void @f() {
  %s = alloca %struct.A, align 8
  %a = alloca i32, align 4                        ; I can know that
this is a C variable
  store i32 10, i32* %a, align 4
  %b = getelementptr inbounds %struct.A, %struct.A* %s, i32 0, i32 1
  ; but this is not
  store i32* %a, i32** %b, align 8

  ; and this is not a C variable, so hasName logic can not work here.
  %a1 = getelementptr inbounds %struct.A, %struct.A* %s, i32 0, i32 0
  store i32 30, i32* %a1, align 8
  ret void

Pushpinder Singh

More information about the llvm-dev mailing list