[gcc(refs/vendors/ibm/heads/gcc-9)] re PR middle-end/92384 (Empty class instances have different equal testing result among GCC versions

Peter Bergner bergner@gcc.gnu.org
Tue Feb 4 20:55:00 GMT 2020


https://gcc.gnu.org/g:05b77d39e26070e41b5edbf0f3ea821dfe3314f1

commit 05b77d39e26070e41b5edbf0f3ea821dfe3314f1
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Nov 8 20:02:24 2019 +0100

    re PR middle-end/92384 (Empty class instances have different equal testing result among GCC versions)
    
    	PR c++/92384
    	* function.c (assign_parm_setup_block, assign_parm_setup_stack): Don't
    	copy TYPE_EMPTY_P arguments from data->entry_parm to data->stack_parm
    	slot.
    	(assign_parms): For TREE_ADDRESSABLE parms with TYPE_EMPTY_P type
    	force creation of a unique data.stack_parm slot.
    
    	* g++.dg/torture/pr92384.C: New test.
    
    From-SVN: r277989

Diff:
---
 gcc/ChangeLog                          |  7 +++++++
 gcc/function.c                         | 16 ++++++++++++--
 gcc/testsuite/ChangeLog                |  3 +++
 gcc/testsuite/g++.dg/torture/pr92384.C | 38 ++++++++++++++++++++++++++++++++++
 4 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index de09391..64849fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
 2019-11-08  Jakub Jelinek  <jakub@redhat.com>
 
+	PR c++/92384
+	* function.c (assign_parm_setup_block, assign_parm_setup_stack): Don't
+	copy TYPE_EMPTY_P arguments from data->entry_parm to data->stack_parm
+	slot.
+	(assign_parms): For TREE_ADDRESSABLE parms with TYPE_EMPTY_P type
+	force creation of a unique data.stack_parm slot.
+
 	Backported from mainline
 	2019-10-31  Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/function.c b/gcc/function.c
index 6c1d27f8..acf9f9e 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3078,7 +3078,7 @@ assign_parm_setup_block (struct assign_parm_data_all *all,
 	move_block_from_reg (REGNO (entry_parm), mem,
 			     size_stored / UNITS_PER_WORD);
     }
-  else if (data->stack_parm == 0)
+  else if (data->stack_parm == 0 && !TYPE_EMPTY_P (data->passed_type))
     {
       push_to_sequence2 (all->first_conversion_insn, all->last_conversion_insn);
       emit_block_move (stack_parm, data->entry_parm, GEN_INT (size),
@@ -3454,7 +3454,9 @@ assign_parm_setup_stack (struct assign_parm_data_all *all, tree parm,
       dest = validize_mem (copy_rtx (data->stack_parm));
       src = validize_mem (copy_rtx (data->entry_parm));
 
-      if (MEM_P (src))
+      if (TYPE_EMPTY_P (data->passed_type))
+	/* Empty types don't really need to be copied.  */;
+      else if (MEM_P (src))
 	{
 	  /* Use a block move to handle potentially misaligned entry_parm.  */
 	  if (!to_conversion)
@@ -3610,6 +3612,16 @@ assign_parms (tree fndecl)
 	{
 	  assign_parm_find_stack_rtl (parm, &data);
 	  assign_parm_adjust_entry_rtl (&data);
+	  /* For arguments that occupy no space in the parameter
+	     passing area, have non-zero size and have address taken,
+	     force creation of a stack slot so that they have distinct
+	     address from other parameters.  */
+	  if (TYPE_EMPTY_P (data.passed_type)
+	      && TREE_ADDRESSABLE (parm)
+	      && data.entry_parm == data.stack_parm
+	      && MEM_P (data.entry_parm)
+	      && int_size_in_bytes (data.passed_type))
+	    data.stack_parm = NULL_RTX;
 	}
       /* Record permanently how this parm was passed.  */
       if (data.passed_pointer)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c3c6608..90948e8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
 2019-11-08  Jakub Jelinek  <jakub@redhat.com>
 
+	PR c++/92384
+	* g++.dg/torture/pr92384.C: New test.
+
 	Backported from mainline
 	2019-11-05  Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/g++.dg/torture/pr92384.C b/gcc/testsuite/g++.dg/torture/pr92384.C
new file mode 100644
index 0000000..049a45a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr92384.C
@@ -0,0 +1,38 @@
+// PR c++/92384
+// { dg-do run }
+
+struct S {};
+struct T : public S { S a, b, c, d, e, f, g, h, i, j, k, l, m; };
+struct U { long long a, b, c; };
+
+U
+foo (S, S, S, T, T, T, U g)
+{
+  return g;
+}
+
+__attribute__((noipa)) bool
+bar (S a, S b, S c, T d, T e, T f, U g, void **h)
+{
+  h[0] = (void *) &a;
+  h[1] = (void *) &b;
+  h[2] = (void *) &c;
+  h[3] = (void *) &d;
+  h[4] = (void *) &e;
+  h[5] = (void *) &f;
+  h[6] = (void *) &g;
+  asm volatile ("" : : "r" (h) : "memory");
+  return (h[0] != h[1] && h[1] != h[2] && h[2] != h[3]
+	  && h[3] != h[4] && h[4] != h[5] && h[5] != h[6]);
+}
+
+int
+main ()
+{
+  S a;
+  T b;
+  U c = { 1, 2, 3 };
+  void *d[7];
+  if (!bar (a, a, a, b, b, b, c, d))
+    __builtin_abort ();
+}



More information about the Gcc-cvs mailing list