On Tue, 2006-03-21 at 11:29 -0500, Diego Novillo wrote: > On 03/21/06 03:25, Laurent GUERBY wrote: > > > A casual read of tree-vrp.c showed that symbolic_range_p is mostly > > used to do nothing, did I miss something? May be it's in another file. > > > That's correct. We mostly punt on symbolic ranges because they are > fairly expensive to track. We do try to use symbolic range information > in some places like 'if (a_3 > b_10)'. If b_10's range is [a_3, +INF] > then we know the conditional is false. > > Do you have anything specific in mind that you would like to track? Any > kind of heavy symbolic processing will likely be very expensive. And > VRP already is a hog.
The typical Ada check we'd want to remove is below. I suspect Java and Pascal are similar (Java has only one variable bound IIRC, the first is always zero). procedure T is -- Natural means [0 .. 2**32-1] procedure P (X : in out String; N1, N2 : in Natural) is First : constant Natural := X'First; Last : constant Natural := X'Last; begin for I in First + N1 .. Last - N2 loop X (I) := ' '; -- CHECK that I>=X'First and I<=X'Last end loop; end P; S : String := "123456"; begin P (S, 2, 1); if S /= "12 6" then raise Program_Error; end if; end T; The Ada front-end expanded codes look like (gcc -c -gnatdg t.adb) : procedure t__p (x : in out string; n1 : in natural; n2 : in natural) is subtype t__p__S1b is string (x'first(1) .. x'last(1)); first : constant natural := {x'first}; last : constant natural := {x'last}; L_1 : label begin S2b : integer; S2b := first + n1; S3b : integer; S3b := last - n2; L_1 : for i in S2b .. S3b loop [constraint_error when not (integer(i) in x'first .. x'last) "index check failed"] x (i) := ' '; end loop L_1; return; end t__p; So we know: - First, Last, N1, N2 are locally constant - N1 >= 0 - N2 >= 0 - First + N1 didn't overflow - Last - N2 didn't overflow And within the loop body: - I >= First + N1 - I <= Last - N2 - First + N1 <= Last - N2 We'd need to track enough to prove that the following are always true - I >= First - I <= Last So the FE generated check can be removed. Looks like not very far from what you describe, but I'm not a specialist of those issues. Laurent