mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
* gcc-interface/ada-tree.h (DECL_INVARIANT_P): New macro. * gcc-interface/gigi.h (enum standard_datatypes): Remove ADT_longjmp_decl and add ADT_not_handled_by_others_decl. (longjmp_decl): Delete. (not_handled_by_others_decl): New macro. (build_simple_component_ref): Delete. (build_component_ref): Adjust prototype. * gcc-interface/decl.c (gnat_to_gnu_entity): Adjust calls to build_component_ref. (gnat_to_gnu_field): Set DECL_INVARIANT_P on discriminants without default value. * gcc-interface/trans.c (gigi): Reorder initialization sequence and add not_handled_by_others_decl. (Attribute_to_gnu): Adjust calls to build_component_ref. (Subprogram_Body_to_gnu): Likewise. (Call_to_gnu): Likewise. (Exception_Handler_to_gnu_sjlj): Likewise. (gnat_to_gnu): Likewise. (range_check_info_d): Add inserted_cond field. (Loop_Statement_to_gnu): Make two passes on the recorded range checks. (build_noreturn_cond): New static function. (Raise_Error_to_gnu): Record range checks in loops at -O1 and above. (make_invariant): New static function. (Loop_Statement_to_gnu): Use it to compute invariant expressions for the loop bounds if possible, but do not require it if loop unswitching is enabled. * gcc-interface/utils.c (convert_to_fat_pointer): Likewise. (convert): Likewise. (maybe_unconstrained_array): Likewise. Call it instead of build_simple_component_ref and add guard for CONSTRUCTORs. (unchecked_convert): Likewise. * gcc-interface/utils2.c (compare_fat_pointers): Likewise. (build_simple_component_ref): Remove COMPONENT parameter, unify code dealing with VIEW_CONVERT_EXPR and make it more general, remove special treatment for CONSTRUCTORs of template types. (build_component_ref): Remove COMPONENT parameter and adjust call to build_simple_component_ref. (maybe_wrap_malloc): Likewise. (build_allocator): Likewise. (gnat_invariant_expr): Look through overflow checks, deal with addition and subtraction of constants and take into account DECL_INVARIANT_P for the COMPONENT_REF case. From-SVN: r230575
36 lines
774 B
Ada
36 lines
774 B
Ada
-- { dg-do compile }
|
|
-- { dg-options "-O -fdump-tree-optimized" }
|
|
|
|
procedure Loop_Optimization20 is
|
|
|
|
type Array_T is array (Positive range <>) of Integer;
|
|
type Obj_T (Length : Natural) is
|
|
record
|
|
Elements : Array_T (1 .. Length);
|
|
end record;
|
|
|
|
type T is access Obj_T;
|
|
|
|
function Is_Null (S1 : Obj_T) return Boolean;
|
|
pragma No_Inline (Is_Null);
|
|
|
|
function Is_Null (S1 : Obj_T) return Boolean is
|
|
begin
|
|
for I in 1 .. S1.Length loop
|
|
if S1.Elements (I) /= 0 then
|
|
return False;
|
|
end if;
|
|
end loop;
|
|
return True;
|
|
end;
|
|
|
|
A : T := new Obj_T'(Length => 10, Elements => (others => 0));
|
|
|
|
begin
|
|
if not Is_Null (A.all) then
|
|
raise Program_Error;
|
|
end if;
|
|
end;
|
|
|
|
-- { dg-final { scan-tree-dump-not "Index_Check" "optimized" } }
|