aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-04-07 23:02:12 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2015-04-07 21:02:12 +0000
commit006e317a14aca1c3d19485b66df07007bf07694e (patch)
tree4fbaa001162291c95c195789b3e37bc9f7c1eab8
parent4209b6d00f1cee70bcbe8f7ec3f2c7936fc0b3a5 (diff)
downloadgcc-006e317a14aca1c3d19485b66df07007bf07694e.zip
gcc-006e317a14aca1c3d19485b66df07007bf07694e.tar.gz
gcc-006e317a14aca1c3d19485b66df07007bf07694e.tar.bz2
re PR ipa/65540 (internal error on s-fatllf.ads at -O2)
PR ipa/65540 * calls.c (initialize_argument_information): When producing tail call also turn SSA_NAMES passed by references to original PARM_DECLs * gcc.c-torture/compile/pr65540.c: New. From-SVN: r221910
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/calls.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr65540.c21
4 files changed, 41 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 315eafc..7de5451 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-07 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/65540
+ * calls.c (initialize_argument_information): When producing tail
+ call also turn SSA_NAMES passed by references to original PARM_DECLs
+
2015-04-07 Vladimir Makarov <vmakarov@redhat.com>
PR target/65648
diff --git a/gcc/calls.c b/gcc/calls.c
index ec44624..970415d 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1321,6 +1321,15 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
&& TREE_CODE (base) != SSA_NAME
&& (!DECL_P (base) || MEM_P (DECL_RTL (base)))))
{
+ /* We may have turned the parameter value into an SSA name.
+ Go back to the original parameter so we can take the
+ address. */
+ if (TREE_CODE (args[i].tree_value) == SSA_NAME)
+ {
+ gcc_assert (SSA_NAME_IS_DEFAULT_DEF (args[i].tree_value));
+ args[i].tree_value = SSA_NAME_VAR (args[i].tree_value);
+ gcc_assert (TREE_CODE (args[i].tree_value) == PARM_DECL);
+ }
/* Argument setup code may have copied the value to register. We
revert that optimization now because the tail call code must
use the original location. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d46d726..74a39ec 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-07 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/65540
+ * gcc.c-torture/compile/pr65540.c: New.
+
2015-04-07 Alan Lawrence <alan.lawrence@arm.com>
* gcc.target/aarch64/c-output-template-3.c: Add -O, remove
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr65540.c b/gcc/testsuite/gcc.c-torture/compile/pr65540.c
new file mode 100644
index 0000000..7b0fb56
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr65540.c
@@ -0,0 +1,21 @@
+long double func1 (long double x)
+{
+ if (x > 0.0)
+ return x;
+ else if (x < 0.0)
+ return -x;
+ else
+ return x;
+}
+
+long double func2 (long double x)
+{
+ if (x > 0.0)
+ return x;
+ else if (x < 0.0)
+ return -x;
+ else
+ return x;
+}
+
+