[LLVMdev] Bounds checking

Gordon Henriksen gordonhenriksen at mac.com
Sat Dec 1 08:07:13 PST 2007


On Nov 30, 2007, at 20:59, Jon Harrop wrote:

> Does LLVM hoist bounds checks out of inner loops?

In practice, LLVM is frequently going to have conservative behaviors  
which will prevent hoisting the explicit bounds checks your front-end  
must generate. Specifically, LLVM must use alias analysis to disprove  
the hypothesis that the array length variable is updated by the body  
of the loop. Consider:

struct array { int length; int values[]; };
extern void x(void);

void f(struct array *arr) {
   for (int i = 0; i < arr->length; ++i) {
     if (i < 0 || i >= arr->length)
       throw;  // trivially unreachable
     x();
     if (i < 0 || i >= arr->length)
       throw;  // unreachable only if 'x() changed arr->length' is  
provably false
   }
}

You can make alias analysis stronger by:

• using -anders-aa instead of -basic-aa
• performing link-time optimization
• using the new 'readonly' and 'readnone' function attributes whenever  
possible

Since you're working with a functional language, you may be able to  
know that 'arr' itself and 'arr.length' are both immutable (based on  
properties of your language/object model). If so, use only a single  
SSA value for each rather than 'load'ing them over again at each use.  
This eliminates the dependency on alias analysis (at the cost of  
increased register pressure). With that out of the way, it becomes a  
matter of building a pass pipeline which either hoists or eliminates  
the checks. opt -mem2reg -gvn -predsimplify -licm -dce -simplifycfg  
may be a starting point for elimination. Any of the passes in lib/ 
Transforms/Scalar which include the string 'SCEV' may be helpful for  
hoisting.

— Gordon

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20071201/1986f441/attachment.html>


More information about the llvm-dev mailing list