diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2024-07-22 18:08:08 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@ucw.cz> | 2024-07-22 18:08:08 +0200 |
commit | cf8ffc58aad3127031c229a75cc4b99c8ace25e0 (patch) | |
tree | 1674225e5f61750d84d9384403e089f38382f3b2 | |
parent | 391f46f10b0586c074014de82efe76787739bb0c (diff) | |
download | gcc-cf8ffc58aad3127031c229a75cc4b99c8ace25e0.zip gcc-cf8ffc58aad3127031c229a75cc4b99c8ace25e0.tar.gz gcc-cf8ffc58aad3127031c229a75cc4b99c8ace25e0.tar.bz2 |
Fix modref_eaf_analysis::analyze_ssa_name handling of values dereferenced to function call parameters
modref_eaf_analysis::analyze_ssa_name misinterprets EAF flags. If dereferenced
parameter is passed (to map_iterator in the testcase) it can be returned
indirectly which in turn makes it to escape into the next function call.
PR ipa/115033
gcc/ChangeLog:
* ipa-modref.cc (modref_eaf_analysis::analyze_ssa_name): Fix checking of
EAF flags when analysing values dereferenced as function parameters.
gcc/testsuite/ChangeLog:
* gcc.c-torture/execute/pr115033.c: New test.
-rw-r--r-- | gcc/ipa-modref.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr115033.c | 35 |
2 files changed, 39 insertions, 2 deletions
diff --git a/gcc/ipa-modref.cc b/gcc/ipa-modref.cc index a5adce8..f994388 100644 --- a/gcc/ipa-modref.cc +++ b/gcc/ipa-modref.cc @@ -2571,8 +2571,10 @@ modref_eaf_analysis::analyze_ssa_name (tree name, bool deferred) int call_flags = deref_flags (gimple_call_arg_flags (call, i), ignore_stores); if (!ignore_retval && !(call_flags & EAF_UNUSED) - && !(call_flags & EAF_NOT_RETURNED_DIRECTLY) - && !(call_flags & EAF_NOT_RETURNED_INDIRECTLY)) + && (call_flags & (EAF_NOT_RETURNED_DIRECTLY + | EAF_NOT_RETURNED_INDIRECTLY)) + != (EAF_NOT_RETURNED_DIRECTLY + | EAF_NOT_RETURNED_INDIRECTLY)) merge_call_lhs_flags (call, i, name, false, true); if (ecf_flags & (ECF_CONST | ECF_NOVOPS)) m_lattice[index].merge_direct_load (); diff --git a/gcc/testsuite/gcc.c-torture/execute/pr115033.c b/gcc/testsuite/gcc.c-torture/execute/pr115033.c new file mode 100644 index 0000000..3e79367 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr115033.c @@ -0,0 +1,35 @@ + +typedef struct func +{ + int *a; +}func; +__attribute__((noinline)) +void ff(struct func *t) +{ + *(t->a) = 0; +} + + +typedef struct mapped_iterator { + func F; +}mapped_iterator; + +__attribute__((noinline)) +mapped_iterator map_iterator(func F) { + mapped_iterator t = {F}; + return t; +} + +void map_to_vector(func *F) { + mapped_iterator t = map_iterator(*F); + ff(&t.F); +} +int main() { + int resultIsStatic = 1; + func t ={&resultIsStatic}; + map_to_vector(&t); + + if (resultIsStatic) + __builtin_trap(); + __builtin_exit(0); +} |