Message ID | ri6il0wm0mn.fsf@virgil.suse.cz |
---|---|
State | New |
Headers | show |
Series | ipa: Force args obtined through pass-through maps to the expected type (PR 113964) | expand |
> Hi, > > interactions of IPA-CP and IPA-SRA on the same data is a rather big > source of issues, I'm afraid. PR 113964 is a situation where IPA-CP > propagates an unsigned short in a union parameter into a function > which itself calls a different function which has a same union > parameter and both these union parameters are split with IPA-SRA. The > leaf function however uses a signed short member of the union. > > In the calling function, we get the unsigned constant as the > replacement for the union and it is then passed in the call without > any type compatibility checks. Apparently on riscv64 it matters > whether the parameter is signed or unsigned short and so the leaf > function can see different values. > > Fixed by using useless_type_conversion_p at the appropriate place and > if it fails, use force_value_to type as elsewhere in similar > situations. > > Bootstrapped and tested on x86_64-linux, the reporter has also run the > testsuite with this patch on riscv64 and reported in Bugzilla there were > no issues. > > OK for master and GCC 13? > > Thanks, > > Martin > > > gcc/ChangeLog: > > 2024-04-04 Martin Jambor <mjambor@suse.cz> > > PR ipa/113964 > * ipa-param-manipulation.cc (ipa_param_adjustments::modify_call): > Force values obtined through pass-through maps to the expected > split type. > > gcc/testsuite/ChangeLog: > > 2024-04-04 Patrick O'Neill <patrick@rivosinc.com> > Martin Jambor <mjambor@suse.cz> > > PR ipa/113964 > * gcc.dg/ipa/pr114247.c: New test. OK, thanks! Honza
diff --git a/gcc/ipa-param-manipulation.cc b/gcc/ipa-param-manipulation.cc index 3e0df6a6f77..b4ca78b652e 100644 --- a/gcc/ipa-param-manipulation.cc +++ b/gcc/ipa-param-manipulation.cc @@ -740,6 +740,12 @@ ipa_param_adjustments::modify_call (cgraph_edge *cs, } if (repl) { + if (!useless_type_conversion_p(apm->type, repl->typed.type)) + { + repl = force_value_to_type (apm->type, repl); + repl = force_gimple_operand_gsi (&gsi, repl, + true, NULL, true, GSI_SAME_STMT); + } vargs.quick_push (repl); continue; } diff --git a/gcc/testsuite/gcc.dg/ipa/pr114247.c b/gcc/testsuite/gcc.dg/ipa/pr114247.c new file mode 100644 index 00000000000..60aa2bc0122 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr114247.c @@ -0,0 +1,31 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -fsigned-char -fno-strict-aliasing -fwrapv" } */ + +union a { + unsigned short b; + int c; + signed short d; +}; +int e, f = 1, g; +long h; +const int **i; +void j(union a k, int l, unsigned m) { + const int *a[100]; + i = &a[0]; + h = k.d; +} +static int o(union a k) { + k.d = -1; + while (1) + if (f) + break; + j(k, g, e); + return 0; +} +int main() { + union a n = {1}; + o(n); + if (h != -1) + __builtin_abort(); + return 0; +}