From: Aldy Hernandez Date: Fri, 14 Jul 2023 10:38:16 +0000 (+0200) Subject: Read global value/mask in IPA. X-Git-Tag: basepoints/gcc-15~7174 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c83528d2367b353156e27af50b63d1c14686f778;p=thirdparty%2Fgcc.git Read global value/mask in IPA. Instead of reading the known zero bits in IPA, read the value/mask pair which is available. There is a slight change of behavior here. I have removed the check for SSA_NAME, as the ranger can calculate the range and value/mask for INTEGER_CST. This simplifies the code a bit, since there's no special casing when setting the jfunc bits. The default range for VR is undefined, so I think it's safe just to check for undefined_p(). gcc/ChangeLog: * ipa-prop.cc (ipa_compute_jump_functions_for_edge): Read global value/mask. gcc/testsuite/ChangeLog: * g++.dg/ipa/pure-const-3.C: Move source to... * g++.dg/ipa/pure-const-3.h: ...here, and adjust original test accordingly. * g++.dg/ipa/pure-const-3b.C: New. --- diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc index 5d790ff12658..4f6ed7b89bd7 100644 --- a/gcc/ipa-prop.cc +++ b/gcc/ipa-prop.cc @@ -2402,8 +2402,7 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, } else { - if (TREE_CODE (arg) == SSA_NAME - && param_type + if (param_type && Value_Range::supports_type_p (TREE_TYPE (arg)) && Value_Range::supports_type_p (param_type) && irange::supports_p (TREE_TYPE (arg)) @@ -2422,15 +2421,14 @@ ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi, gcc_assert (!jfunc->m_vr); } - if (INTEGRAL_TYPE_P (TREE_TYPE (arg)) - && (TREE_CODE (arg) == SSA_NAME || TREE_CODE (arg) == INTEGER_CST)) + if (INTEGRAL_TYPE_P (TREE_TYPE (arg)) && !vr.undefined_p ()) { - if (TREE_CODE (arg) == SSA_NAME) - ipa_set_jfunc_bits (jfunc, 0, - widest_int::from (get_nonzero_bits (arg), - TYPE_SIGN (TREE_TYPE (arg)))); - else - ipa_set_jfunc_bits (jfunc, wi::to_widest (arg), 0); + irange &r = as_a (vr); + irange_bitmask bm = r.get_bitmask (); + signop sign = TYPE_SIGN (TREE_TYPE (arg)); + ipa_set_jfunc_bits (jfunc, + widest_int::from (bm.value (), sign), + widest_int::from (bm.mask (), sign)); } else if (POINTER_TYPE_P (TREE_TYPE (arg))) { diff --git a/gcc/testsuite/g++.dg/ipa/pure-const-3.C b/gcc/testsuite/g++.dg/ipa/pure-const-3.C index b4a4673e86ea..62d355b4ce7e 100644 --- a/gcc/testsuite/g++.dg/ipa/pure-const-3.C +++ b/gcc/testsuite/g++.dg/ipa/pure-const-3.C @@ -1,32 +1,6 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp -fdisable-tree-evrp" } */ -int *ptr; -static int barvar; -static int b(int a); -/* We can not detect A to be const because it may be interposed by unoptimized - body. */ -inline -__attribute__ ((noinline)) -int a(int a) -{ - if (a>0) - return b(a-1); - return *ptr == *ptr; -} -inline -__attribute__ ((noinline)) -static int b(int p) -{ - if (p<0) - return a(p+1); - return 1; -} -int main() -{ - int aa; - ptr = &barvar; - aa=!b(3); - ptr = 0; - return aa; -} +/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp -fdisable-tree-evrp -fdisable-tree-vrp1 -fdisable-tree-vrp2 -fno-thread-jumps -fno-tree-dominator-opts" } */ + +#include "pure-const-3.h" + /* { dg-final { scan-tree-dump "barvar" "optimized" } } */ diff --git a/gcc/testsuite/g++.dg/ipa/pure-const-3.h b/gcc/testsuite/g++.dg/ipa/pure-const-3.h new file mode 100644 index 000000000000..61d162f541ea --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pure-const-3.h @@ -0,0 +1,29 @@ +int *ptr; +static int barvar; +static int b(int a); +/* We can not detect A to be const because it may be interposed by unoptimized + body. */ +inline +__attribute__ ((noinline)) +int a(int a) +{ + if (a>0) + return b(a-1); + return *ptr == *ptr; +} +inline +__attribute__ ((noinline)) +static int b(int p) +{ + if (p<0) + return a(p+1); + return 1; +} +int main() +{ + int aa; + ptr = &barvar; + aa=!b(3); + ptr = 0; + return aa; +} diff --git a/gcc/testsuite/g++.dg/ipa/pure-const-3b.C b/gcc/testsuite/g++.dg/ipa/pure-const-3b.C new file mode 100644 index 000000000000..eaa48429b4eb --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pure-const-3b.C @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-ipa-vrp -fno-tree-ccp -fdisable-tree-evrp -fno-thread-jumps -fdump-ipa-cp-details" } */ + +#include "pure-const-3.h" + +/* { dg-final { scan-ipa-dump "Propagated bits info for function int b" "cp" } } */