From 0e9495303db062cf118869b7526132b5821833e9 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Wed, 14 Dec 2022 19:01:11 +0100 Subject: [PATCH] ipa-sra: Consider the first parameter of methods safe to dereference Honza requested this after reviewing the patch that taught IPA-SRA that REFERENCE_TYPEs are always non-NULL that the pass also handles the first parameters of methods, this pointers, in the same way. So this patch does that. gcc/ChangeLog: 2022-12-14 Martin Jambor * ipa-sra.cc (create_parameter_descriptors): Consider the first parameter of a method safe to dereference. gcc/testsuite/ChangeLog: 2022-12-14 Martin Jambor * g++.dg/ipa/ipa-sra-6.C: New test. --- gcc/ipa-sra.cc | 7 +++- gcc/testsuite/g++.dg/ipa/ipa-sra-6.C | 62 ++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/ipa/ipa-sra-6.C diff --git a/gcc/ipa-sra.cc b/gcc/ipa-sra.cc index bcabded..6fe336e 100644 --- a/gcc/ipa-sra.cc +++ b/gcc/ipa-sra.cc @@ -1206,7 +1206,12 @@ create_parameter_descriptors (cgraph_node *node, if (POINTER_TYPE_P (type)) { desc->by_ref = true; - desc->safe_ref = (TREE_CODE (type) == REFERENCE_TYPE); + if (TREE_CODE (type) == REFERENCE_TYPE + || (num == 0 + && TREE_CODE (TREE_TYPE (node->decl)) == METHOD_TYPE)) + desc->safe_ref = true; + else + desc->safe_ref = false; type = TREE_TYPE (type); if (TREE_CODE (type) == FUNCTION_TYPE diff --git a/gcc/testsuite/g++.dg/ipa/ipa-sra-6.C b/gcc/testsuite/g++.dg/ipa/ipa-sra-6.C new file mode 100644 index 0000000..d6b7822 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/ipa-sra-6.C @@ -0,0 +1,62 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-ipa-sra" } */ + +namespace { + +class C +{ + + int mi; + +public: + C (int i) + : mi(i) + {} + + void foo (int c); +}; + +volatile int vi; + + +void __attribute__((noinline)) +C::foo (int cond) +{ + int i; + if (cond) + i = mi; + else + i = 0; + vi = i; +} + +static C c_instance(1); +} + +void __attribute__((noinline)) +bar (C *p, int cond) +{ + p->foo (cond); +} + + +class C *gp; + +void something(void); + +void +baz (int cond) +{ + C c(vi); + gp = &c; + something (); + bar (gp, cond); +} + +void +hoo(void) +{ + gp = &c_instance; +} + +/* { dg-final { scan-ipa-dump "Will split parameter" "sra" } } */ -- 2.7.4