aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2014-06-07 11:59:18 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2014-06-07 11:59:18 +0000
commit51d2abebc4155932e23becf6304628a8105a2c51 (patch)
treeaad08d05304a8159d0d41e15ffb5048e7c480502 /gcc
parent25608e3a5fb6849e2f90207c1836359df0b79b43 (diff)
downloadgcc-51d2abebc4155932e23becf6304628a8105a2c51.zip
gcc-51d2abebc4155932e23becf6304628a8105a2c51.tar.gz
gcc-51d2abebc4155932e23becf6304628a8105a2c51.tar.bz2
tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a call statement, if any.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/opt38.adb9
-rw-r--r--gcc/testsuite/gnat.dg/opt38_pkg.adb33
-rw-r--r--gcc/testsuite/gnat.dg/opt38_pkg.ads5
-rw-r--r--gcc/tree-ssa-tail-merge.c21
6 files changed, 74 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1966add9..d7a35c3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4e3967e..a6913af 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..143f4fa
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt38.adb
@@ -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
index 0000000..7cbbeea
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt38_pkg.adb
@@ -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
index 0000000..b6cb4e6
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt38_pkg.ads
@@ -0,0 +1,5 @@
+package Opt38_Pkg is
+
+ procedure Test (I : Integer);
+
+end Opt38_Pkg;
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index 20fbebf..65b5a4e 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -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);