[LLVMdev] Ada bound checks

Duncan Sands baldrick at free.fr
Wed May 27 12:41:25 PDT 2009

Hi Andre,

> Everything worked out with your help. Thanks. I'm now looking at bound
> checks that an Ada program has, so I can remove all possible. It seams
> that Ada already does some optimization to remove bound checks. Do you
> know how are they done, and where?

yes, the front-end doesn't generate range checks in cases where it knows
that everything is ok.  It tries hard to catch all simple cases, since
range checks are very expensive.  I think this basically means that the
array bounds are known constants (they need not be constant in Ada, a
common example is strings), and the index is too.  I think this is done
in ada/checks.adb, search for calls to Compile_Time_Known_Value.  Also,
I think the front-end can handle simple symbolic cases like:
   for I in A'Range loop ... do something with A(I)... end loop;

By the way, you can see what the front-end is sending to the rest
of gcc by compiling with the -gnatdg flag.
Also, to get all checks required by the language you need to compile
with -gnato.  This checks for overflow in all integer computations
(this is off by default because the generated code is so slow).

> I tested two codes (below) and the first code did not produce any bound
> check

Yes, it is too simple.  The LLVM optimizers would almost certainly also
have removed the checks.

> and the second produced two bound checks.

You might say four checks, since it does lower and upper bound checks
for each array access.



PS: You might want to take a look at 
This is more of a VRP example, but perhaps the kind of pass you have
in mind can help.  In theory every call to __gnat_rcheck_12 can be
eliminated, but currently there are 13 calls that llvm fails to remove.
That's mostly because llvm is not informed that Source_First and
Source_Last have values in the range 0 .. 100, and Target_First in the
range 10 .. 20.

More information about the llvm-dev mailing list