diff options
author | Pierre-Marie de Rodat <derodat@adacore.com> | 2015-10-19 23:47:35 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2015-10-19 23:47:35 +0000 |
commit | 524d9b4b9035ff69f1024ca2c32c7217128f3cf9 (patch) | |
tree | d4b672674b050b5804bf9a28e4d83b5c24ea0d85 /gcc/testsuite/gnat.dg | |
parent | 32308c8db4af9260cafcb517fe020dff5280f993 (diff) | |
download | gcc-524d9b4b9035ff69f1024ca2c32c7217128f3cf9.zip gcc-524d9b4b9035ff69f1024ca2c32c7217128f3cf9.tar.gz gcc-524d9b4b9035ff69f1024ca2c32c7217128f3cf9.tar.bz2 |
REE: fix uninitialized registers handling
gcc/ChangeLog:
PR rtl-optimization/66790
* df.h (DF_MIR): New macro.
(DF_LAST_PROBLEM_PLUS1): Update to be past DF_MIR
(DF_MIR_INFO_BB): New macro.
(DF_MIR_IN, DF_MIR_OUT): New macros.
(struct df_mir_bb_info): New.
(df_mir): New macro.
(df_mir_add_problem, df_mir_simulate_one_insn): New forward
declarations.
(df_mir_get_bb_info): New.
* df-problems.c (struct df_mir_problem_data): New.
(df_mir_free_bb_info, df_mir_alloc, df_mir_reset,
df_mir_bb_local_compute, df_mir_local_compute, df_mir_init,
df_mir_confluence_0, df_mir_confluence_n,
df_mir_transfer_function, df_mir_free, df_mir_top_dump,
df_mir_bottom_dump, df_mir_verify_solution_start,
df_mir_verify_solution_end): New.
(problem_MIR): New.
(df_mir_add_problem, df_mir_simulate_one_insn): New.
* timevar.def (TV_DF_MIR): New.
* ree.c: Include bitmap.h
(add_removable_extension): Add an INIT_REGS parameter. Use it
to skip zero-extensions that may get an uninitialized register.
(find_removable_extensions): Compute must-initialized registers
using the MIR dataflow problem. Update the call to
add_removable_extension.
(find_and_remove_re): Call df_mir_add_problem.
gcc/testsuite/ChangeLog:
* gnat.dg/opt50.adb: New test.
* gnat.dg/opt50_pkg.adb: New helper.
* gnat.dg/opt50_pkg.ads: New helper.
From-SVN: r229008
Diffstat (limited to 'gcc/testsuite/gnat.dg')
-rw-r--r-- | gcc/testsuite/gnat.dg/opt50.adb | 23 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt50_pkg.adb | 48 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt50_pkg.ads | 12 |
3 files changed, 83 insertions, 0 deletions
diff --git a/gcc/testsuite/gnat.dg/opt50.adb b/gcc/testsuite/gnat.dg/opt50.adb new file mode 100644 index 0000000..f930d09 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt50.adb @@ -0,0 +1,23 @@ +-- { dg-do run } +-- { dg-options "-O3 -gnatn" } + +with Opt50_Pkg; use Opt50_Pkg; + +procedure Opt50 is + B : Boolean; + E : Enum; +begin + Get ("four", E, B); + if B = True then + raise Program_Error; + end if; + Get ("three", E, B); + if B = False then + raise Program_Error; + end if; + declare + A : Enum_Boolean_Array (One .. E) := (others => True); + begin + Set (A); + end; +end Opt50; diff --git a/gcc/testsuite/gnat.dg/opt50_pkg.adb b/gcc/testsuite/gnat.dg/opt50_pkg.adb new file mode 100644 index 0000000..0f92f7d --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt50_pkg.adb @@ -0,0 +1,48 @@ +with Ada.Characters.Handling; +with Ada.Containers; +with Ada.Containers.Indefinite_Hashed_Maps; +with Ada.Strings.Hash; + +package body Opt50_Pkg is + + type Enum_Name is array (Enum) of access constant String; + + Enum_Name_Table : constant Enum_Name := ( + One => new String'("one"), + Two => new String'("two"), + Three => new String'("three")); + + package String_To_Enum_Map is new Ada.Containers.Indefinite_Hashed_Maps + (Key_Type => String, Element_Type => Enum, + Hash => Ada.Strings.Hash, Equivalent_Keys => "="); + + function Fill_Hashed_Map return String_To_Enum_Map.Map is + Res : String_To_Enum_Map.Map; + use String_To_Enum_Map; + begin + for I in Enum_Name_Table'Range loop + declare + Kind : constant String := Enum_Name_Table (I).all; + begin + Res.Insert(Key => Kind, New_Item => I); + end; + end loop; + return Res; + end; + + String_To_Enum : constant String_To_Enum_Map.Map := Fill_Hashed_Map; + + procedure Get (Kind : String; Result : out Enum; Success : out Boolean) is + X : constant String := Ada.Characters.Handling.To_Lower (Kind); + use String_To_Enum_Map; + Curs : constant Cursor := String_To_Enum.Find (X); + begin + Success := Curs /= No_Element; + if Success then + Result := Element(Curs); + end if; + end; + + procedure Set (A : Enum_Boolean_Array) is null; + +end Opt50_Pkg; diff --git a/gcc/testsuite/gnat.dg/opt50_pkg.ads b/gcc/testsuite/gnat.dg/opt50_pkg.ads new file mode 100644 index 0000000..9faea54 --- /dev/null +++ b/gcc/testsuite/gnat.dg/opt50_pkg.ads @@ -0,0 +1,12 @@ +package Opt50_Pkg is + + type Enum is (One, Two, Three); + for Enum'Size use 16; + + type Enum_Boolean_Array is array (Enum range <>) of Boolean; + + procedure Get (Kind : String; Result : out Enum; Success : out Boolean); + + procedure Set (A : Enum_Boolean_Array); + +end Opt50_Pkg; |