PR ipa/65540
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Apr 2015 21:02:12 +0000 (21:02 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 7 Apr 2015 21:02:12 +0000 (21:02 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221910 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/calls.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr65540.c [new file with mode: 0644]

index 315eafc..7de5451 100644 (file)
@@ -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
index ec44624..970415d 100644 (file)
@@ -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.  */
index d46d726..74a39ec 100644 (file)
@@ -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 (file)
index 0000000..7b0fb56
--- /dev/null
@@ -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;
+}
+
+