Jorge Navas
2011-Oct-25 00:48 UTC
[LLVMdev] How to handle global variables in LLVM analyses
I'm trying to implement a basic analysis for inferring the ranges (minimum and maximum values) of integer variables. I don't expect for now to reason about pointers or arrays but I would like some reasoning about global variables. As expected, the fact that all register values are in SSA form simplifies a lot the analysis. However, global variables are not necessarily in SSA form. I understand the reasons but I wonder what I can do for simple cases like this one: int i; void foo(){ if(*) i=2; // store i32 2, i32* @i, align 4 else i=3; // store i32 3, i32* @i, align 4 } Here I would like to have a phi-node after the if-then-else so my analysis can easily merge the values 2 and 3 for the global variable "i". I guess, this is a common case (no aliasing, no function pointers, etc) so i wonder what is the way to go: 1) Is there any pass to convert these simple cases to SSA form? 2) Alternatively, can I extract some useful info from e.g., "-globalsmodref-aa"? 3) Or, do I have to write a transformation pass to extend the SSA algorithm for my particular purpose? Thanks, Jorge
Michael Ilseman
2011-Oct-25 16:33 UTC
[LLVMdev] How to handle global variables in LLVM analyses
> 1) Is there any pass to convert these simple cases to SSA form?Mem2Reg[1] has always worked for me for globals that are only used in one function. If this doesn't work straight away, have you tried mem2reg after running instcombine and simplify-cfg? It's possible those passes can sink the store. Also note that for 2.9, I believe the default AA is no-aa, and not basic-aa, so you may be met with more success if you specify which AA you want before you run your passes. If none of these work for you, try making sure you're specifying a TargetData. If this still doesn't work, hopefully someone else has some suggestions. [1] http://llvm.org/docs/Passes.html#mem2reg On Mon, Oct 24, 2011 at 6:48 PM, Jorge Navas <navas at comp.nus.edu.sg> wrote:> > I'm trying to implement a basic analysis for inferring the ranges > (minimum and maximum values) of integer variables. I don't expect for > now to reason about pointers or arrays but I would like some reasoning > about global variables. > > As expected, the fact that all register values are in SSA form > simplifies a lot the analysis. However, global variables are not > necessarily in SSA form. I understand the reasons but I wonder what I > can do for simple cases like this one: > > int i; > void foo(){ > if(*) > i=2; // store i32 2, i32* @i, align 4 > else > i=3; // store i32 3, i32* @i, align 4 > > } > > Here I would like to have a phi-node after the if-then-else so my > analysis can easily merge the values 2 and 3 for the global variable > "i". I guess, this is a common case (no aliasing, no function > pointers, etc) so i wonder what is the way to go: > > 1) Is there any pass to convert these simple cases to SSA form? > > 2) Alternatively, can I extract some useful info from e.g., > "-globalsmodref-aa"? > > 3) Or, do I have to write a transformation pass to extend the SSA > algorithm for my particular purpose? > > Thanks, > Jorge > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Possibly Parallel Threads
- [LLVMdev] GlobalsModRef (and thus LTO) is completely broken
- [LLVMdev] GlobalsModRef (and thus LTO) is completely broken
- [LLVMdev] GlobalsModRef (and thus LTO) is completely broken
- [LLVMdev] GlobalsModRef (and thus LTO) is completely broken
- [LLVMdev] GlobalsModRef (and thus LTO) is completely broken