diff --git a/gcc/ipa-param-manipulation.c b/gcc/ipa-param-manipulation.c index 2cc4bc79dc1..5fc0de56556 100644 --- a/gcc/ipa-param-manipulation.c +++ b/gcc/ipa-param-manipulation.c @@ -790,7 +790,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; +}