]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-forwprop.c (combine_conversions): Punt if the RHS of the defining statement...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 19 Jul 2012 21:35:12 +0000 (21:35 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 19 Jul 2012 21:35:12 +0000 (21:35 +0000)
* tree-ssa-forwprop.c (combine_conversions): Punt if the RHS of the
defining statement is a SSA name that occurs in abnormal PHIs.

From-SVN: r189687

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 1a3d4017f516454b1bd61077251b98bf2d4bc67d..6d7f568dda1a2d4abdb3a21f9dbd9d110c712639 100644 (file)
@@ -1,3 +1,8 @@
+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
index 740d26bdf35ed5ee155b415946ad567b526b8a49..47ae24c9ae7f9daf93007fadf67e0c73fcdec55b 100644 (file)
@@ -1,3 +1,9 @@
+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.
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 2ab4b2375faf1457db038123d94ef83ee9f7aff5..c265f71bc93b9479aa8730614660362e4d390758 100644 (file)
@@ -2584,6 +2584,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