[gcc(refs/vendors/ARM/heads/arm-perf-staging)] ipa-sra: Prevent constructing debug info from wrong argument

Tamar Christina tnfchris@gcc.gnu.org
Fri Jul 17 15:36:33 GMT 2020


https://gcc.gnu.org/g:61e4ee3f2c0e3d77602c87866cd5c0cfb81d5da2

commit 61e4ee3f2c0e3d77602c87866cd5c0cfb81d5da2
Author: Martin Jambor <mjambor@suse.cz>
Date:   Fri Jul 3 14:51:02 2020 +0200

    ipa-sra: Prevent constructing debug info from wrong argument
    
    The mechanism generating debug info for removed parameters did not
    adjust index of the argument in the call statement to take into
    account extra arguments IPA-SRA might have produced when splitting a
    strucutre.  This patch addresses that omission and stops gdb from
    showing incorrect value for the removed parameter and says "value
    optimized out" instead.  The guality testcase will end up as
    UNSUPPORTED in the results which is how Richi told me on IRC we deal
    with this.
    
    It is possible to generate debug info to actually show the value of
    the removed parameter but so far my approaches to do just that seem
    toocontroversial
    (https://gcc.gnu.org/pipermail/gcc-patches/2020-May/546705.html), so
    before I come up with something better I'd like to push this to master
    and the gcc-10 branch in time for the GCC 10.2 release.
    
    gcc/ChangeLog:
    
    2020-07-01  Martin Jambor  <mjambor@suse.cz>
    
            PR debug/95343
            * ipa-param-manipulation.c (ipa_param_adjustments::modify_call): Adjust
            argument index if necessary.
    
    gcc/testsuite/ChangeLog:
    
    2020-07-01  Martin Jambor  <mjambor@suse.cz>
    
            PR debug/95343
            * gcc.dg/guality/pr95343.c: New test.
    
    (cherry picked from commit 053c88093a45f175f446eda009f3312e4e508514)

Diff:
---
 gcc/ipa-param-manipulation.c           |  6 ++++-
 gcc/testsuite/gcc.dg/guality/pr95343.c | 45 ++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c
index 839bd2ef870..fbeea454084 100644
--- a/gcc/ipa-param-manipulation.c
+++ b/gcc/ipa-param-manipulation.c
@@ -787,7 +787,11 @@ ipa_param_adjustments::modify_call (gcall *stmt,
 	  if (!is_gimple_reg (old_parm) || kept[i])
 	    continue;
 	  tree origin = DECL_ORIGIN (old_parm);
-	  tree arg = gimple_call_arg (stmt, i);
+	  tree arg;
+	  if (transitive_remapping)
+	    arg = gimple_call_arg (stmt, index_map[i]);
+	  else
+	    arg = gimple_call_arg (stmt, i);
 
 	  if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
 	    {
diff --git a/gcc/testsuite/gcc.dg/guality/pr95343.c b/gcc/testsuite/gcc.dg/guality/pr95343.c
new file mode 100644
index 00000000000..a3e57decda8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr95343.c
@@ -0,0 +1,45 @@
+/* { dg-do run } */
+/* { dg-options "-g -fno-ipa-icf" } */
+
+volatile int v;
+
+int __attribute__((noipa))
+get_val0 (void)  {return 0;}
+int __attribute__((noipa))
+get_val2 (void)  {return 2;}
+
+struct S
+{
+  int a, b, c;
+};
+
+static int __attribute__((noinline))
+bar (struct S s, int x, int y, int z, int i)
+{
+  int r;
+  v = s.a + s.b;		/* { dg-final { gdb-test . "i+1" "3" } } */
+  return r;
+}
+
+static int __attribute__((noinline))
+foo (struct S s, int i)
+{
+  int r;
+  r = bar (s, 3, 4, 5, i);
+  return r;
+}
+
+
+int
+main (void)
+{
+  struct S s;
+  int i;
+  i = get_val2 ();
+  s.a = get_val0 ();
+  s.b = get_val0 ();
+  s.c = get_val0 ();
+  int r = foo (s, i);
+  v = r + i;
+  return 0;
+}


More information about the Gcc-cvs mailing list