aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gnat.dg
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2015-10-19 23:47:35 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2015-10-19 23:47:35 +0000
commit524d9b4b9035ff69f1024ca2c32c7217128f3cf9 (patch)
treed4b672674b050b5804bf9a28e4d83b5c24ea0d85 /gcc/testsuite/gnat.dg
parent32308c8db4af9260cafcb517fe020dff5280f993 (diff)
downloadgcc-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.adb23
-rw-r--r--gcc/testsuite/gnat.dg/opt50_pkg.adb48
-rw-r--r--gcc/testsuite/gnat.dg/opt50_pkg.ads12
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;