]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a call statement...
authorEric Botcazou <ebotcazou@adacore.com>
Sat, 7 Jun 2014 11:59:18 +0000 (11:59 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 7 Jun 2014 11:59:18 +0000 (11:59 +0000)
* tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a
call statement, if any.
(gimple_equal_p) <GIMPLE_CALL>: Compare the static chain of the call
statements, if any.  Tidy up.

From-SVN: r211342

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt38.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt38_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt38_pkg.ads [new file with mode: 0644]
gcc/tree-ssa-tail-merge.c

index 1966add9a533fa114a2927af2e0df87123ef4474..d7a35c3f6a3a07c1e704997d30097e2b83e464e5 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a
+       call statement, if any.
+       (gimple_equal_p) <GIMPLE_CALL>: Compare the static chain of the call
+       statements, if any.  Tidy up.
+
 2014-06-06  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/61431
index 4e3967ecc413ec0b88e7e4851acd6406b93b4486..a6913af74fd42f0478d4a43a7a8945bc5a4046c9 100644 (file)
@@ -1,3 +1,8 @@
+2014-06-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt38.adb: New test.
+       * gnat.dg/opt38_pkg.ad[sb]: New helper.
+
 2014-06-07  Hans-Peter Nilsson  <hp@bitrange.com>
 
        PR target/18343
diff --git a/gcc/testsuite/gnat.dg/opt38.adb b/gcc/testsuite/gnat.dg/opt38.adb
new file mode 100644 (file)
index 0000000..143f4fa
--- /dev/null
@@ -0,0 +1,9 @@
+-- { dg-do run }
+-- { dg-options "-O2 -gnatn" }
+
+with Opt38_Pkg; use Opt38_Pkg;
+
+procedure Opt38 is
+begin
+  Test (-1);
+end;
diff --git a/gcc/testsuite/gnat.dg/opt38_pkg.adb b/gcc/testsuite/gnat.dg/opt38_pkg.adb
new file mode 100644 (file)
index 0000000..7cbbeea
--- /dev/null
@@ -0,0 +1,33 @@
+package body Opt38_Pkg is
+
+  procedure Proc (I : Integer);
+  pragma Inline (Proc);
+
+  procedure Proc (I : Integer) is
+
+    procedure Inner;
+    pragma No_Inline (Inner);
+
+    procedure Inner is
+    begin
+      if I /= 110 then
+        raise Program_Error;
+      end if;
+    end;
+
+  begin
+    if I > 0 then
+      Inner;
+    end if;
+  end;
+
+  procedure Test (I : Integer) is
+  begin
+    if I > -1 then
+      Proc (I);
+    else
+      Proc (I + 111);
+    end if;
+  end;
+
+end Opt38_Pkg;
diff --git a/gcc/testsuite/gnat.dg/opt38_pkg.ads b/gcc/testsuite/gnat.dg/opt38_pkg.ads
new file mode 100644 (file)
index 0000000..b6cb4e6
--- /dev/null
@@ -0,0 +1,5 @@
+package Opt38_Pkg is
+
+  procedure Test (I : Integer);
+
+end Opt38_Pkg;
index 20fbebf35d0be19029d0f972264074389b64a0ad..65b5a4e4420fbfff56e64e90fa694a2eca472f5c 100644 (file)
@@ -481,7 +481,11 @@ same_succ_hash (const_same_succ e)
        hashval = iterative_hash_hashval_t
          ((hashval_t) gimple_call_internal_fn (stmt), hashval);
       else
-       hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval);
+       {
+         hashval = iterative_hash_expr (gimple_call_fn (stmt), hashval);
+         if (gimple_call_chain (stmt))
+           hashval = iterative_hash_expr (gimple_call_chain (stmt), hashval);
+       }
       for (i = 0; i < gimple_call_num_args (stmt); i++)
        {
          arg = gimple_call_arg (stmt, i);
@@ -1121,18 +1125,23 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
   switch (gimple_code (s1))
     {
     case GIMPLE_CALL:
-      if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
-       return false;
       if (!gimple_call_same_target_p (s1, s2))
         return false;
 
+      t1 = gimple_call_chain (s1);
+      t2 = gimple_call_chain (s2);
+      if (!gimple_operand_equal_value_p (t1, t2))
+       return false;
+
+      if (gimple_call_num_args (s1) != gimple_call_num_args (s2))
+       return false;
+
       for (i = 0; i < gimple_call_num_args (s1); ++i)
        {
          t1 = gimple_call_arg (s1, i);
          t2 = gimple_call_arg (s2, i);
-         if (gimple_operand_equal_value_p (t1, t2))
-           continue;
-         return false;
+         if (!gimple_operand_equal_value_p (t1, t2))
+           return false;
        }
 
       lhs1 = gimple_get_lhs (s1);