]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa-sra: Prevent constructing debug info from wrong argument
authorMartin Jambor <mjambor@suse.cz>
Fri, 3 Jul 2020 12:51:02 +0000 (14:51 +0200)
committerMartin Jambor <mjambor@suse.cz>
Fri, 3 Jul 2020 12:51:02 +0000 (14:51 +0200)
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)

gcc/ipa-param-manipulation.c
gcc/testsuite/gcc.dg/guality/pr95343.c [new file with mode: 0644]

index 839bd2ef870e1fba7e03f005c7d4589e8f35fc4a..fbeea454084db7bcad73fe20596567a7a93d28b8 100644 (file)
@@ -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 (file)
index 0000000..a3e57de
--- /dev/null
@@ -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;
+}