OSDN Git Service

* tree-ssa-forwprop.c (combine_conversions): Punt if the RHS of the
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Jul 2012 21:40:23 +0000 (21:40 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 19 Jul 2012 21:40:23 +0000 (21:40 +0000)
defining statement is a SSA name that occurs in abnormal PHIs.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189688 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt25.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt25_pkg1.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt25_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt25_pkg2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt25_pkg2.ads [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index b75171d..2385faa 100644 (file)
@@ -1,5 +1,10 @@
 2012-07-19  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * tree-ssa-forwprop.c (combine_conversions): Punt if the RHS of the
+       defining statement is a SSA name that occurs in abnormal PHIs.
+
+2012-07-19  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gimple-fold.c (canonicalize_constructor_val): Strip only useless type
        conversions.
 
index 21ef1f3..5615b74 100644 (file)
@@ -1,5 +1,11 @@
 2012-07-19  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * gnat.dg/opt25.adb: New test.
+       * gnat.dg/opt25_pkg1.ad[sb]: New helper.
+       * gnat.dg/opt25_pkg2.ad[sb]: Likewise.
+
+2012-07-19  Eric Botcazou  <ebotcazou@adacore.com>
+
        * gnat.dg/aggr20.ad[sb]: New test.
        * gnat.dg/aggr20_pkg.ads: New helper.
 
diff --git a/gcc/testsuite/gnat.dg/opt25.adb b/gcc/testsuite/gnat.dg/opt25.adb
new file mode 100644 (file)
index 0000000..5046d16
--- /dev/null
@@ -0,0 +1,17 @@
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Opt25_Pkg1;
+with Opt25_Pkg2;
+
+procedure Opt25 (B1, B2 : in out Boolean) is
+
+   package Local_Pack_Instance is new Opt25_Pkg1 (Boolean, True);
+
+   package Local_Stack is new Opt25_Pkg2 (Integer, 0);
+
+   S : Local_Stack.Stack := Local_Stack.Default_Stack;
+
+begin
+   Local_Pack_Instance.Swap (B1, B2);
+end;
diff --git a/gcc/testsuite/gnat.dg/opt25_pkg1.adb b/gcc/testsuite/gnat.dg/opt25_pkg1.adb
new file mode 100644 (file)
index 0000000..c18694f
--- /dev/null
@@ -0,0 +1,10 @@
+package body Opt25_Pkg1 is
+
+   procedure Swap (A, B : in out T) is
+      Tmp : T := A;
+   begin
+      A := B;
+      B := Tmp;
+   end Swap;
+
+end Opt25_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/opt25_pkg1.ads b/gcc/testsuite/gnat.dg/opt25_pkg1.ads
new file mode 100644 (file)
index 0000000..7a96f27
--- /dev/null
@@ -0,0 +1,11 @@
+generic
+
+   type T is private;
+   Init_Value : T;
+
+package Opt25_Pkg1 is
+
+   Var : T := Init_Value;
+   procedure Swap (A, B : in out T);
+
+end Opt25_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/opt25_pkg2.adb b/gcc/testsuite/gnat.dg/opt25_pkg2.adb
new file mode 100644 (file)
index 0000000..164ef33
--- /dev/null
@@ -0,0 +1,8 @@
+package body Opt25_Pkg2 is
+
+   function Default_Stack return Stack is
+   begin
+      return Default_Stack_Var;
+   end Default_Stack;
+
+end Opt25_Pkg2;
diff --git a/gcc/testsuite/gnat.dg/opt25_pkg2.ads b/gcc/testsuite/gnat.dg/opt25_pkg2.ads
new file mode 100644 (file)
index 0000000..f127308
--- /dev/null
@@ -0,0 +1,20 @@
+generic
+
+   type Value is private;
+   Init_Val : Value;
+
+package Opt25_Pkg2 is
+
+   type Stack (Size : Natural) is private;
+
+   function Default_Stack return Stack;
+
+private
+   type Value_Array is array (Natural range <>) of Value;
+
+   type Stack (Size : Natural) is record
+      Store : Value_Array (1 .. Size);
+   end record;
+
+   Default_Stack_Var : Stack (10);
+end Opt25_Pkg2;
index 308a579..fe2e89f 100644 (file)
@@ -2247,6 +2247,11 @@ combine_conversions (gimple_stmt_iterator *gsi)
       unsigned int final_prec = TYPE_PRECISION (type);
       int final_unsignedp = TYPE_UNSIGNED (type);
 
+      /* Don't propagate ssa names that occur in abnormal phis.  */
+      if (TREE_CODE (defop0) == SSA_NAME
+         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (defop0))
+       return 0;
+
       /* In addition to the cases of two conversions in a row
         handled below, if we are converting something to its own
         type via an object of identical or wider precision, neither