diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-04-07 23:02:12 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-04-07 21:02:12 +0000 |
commit | 006e317a14aca1c3d19485b66df07007bf07694e (patch) | |
tree | 4fbaa001162291c95c195789b3e37bc9f7c1eab8 /gcc | |
parent | 4209b6d00f1cee70bcbe8f7ec3f2c7936fc0b3a5 (diff) | |
download | gcc-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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/calls.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr65540.c | 21 |
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; +} + + |