[COMMITTED] Enable prange support.
Checks
Commit Message
This throws the switch on prange. After this patch, it is no longer
valid to store a pointer in an irange (or vice versa). Instead, they
must go in prange, which is faster and more memory efficient.
I will push this now, so I have time to do any follow-up bugfixing
before going on paternity leave.
There are various cleanups we plan on doing after this patch (faster
intersect/union, remove range-op-mixed.h, remove value_range in favor
of int_range_max, reclaim the name for the Value_Range temporary,
clean up range-ops, etc etc). But we will hold off on those for now
to make it easier to revert this patch, if for some reason we need to
do so while I'm away.
Tested on x86-64 Linux.
gcc/ChangeLog:
* gimple-range-cache.cc (sbr_sparse_bitmap::sbr_sparse_bitmap):
Change irange to prange.
* gimple-range-fold.cc (fold_using_range::fold_stmt): Same.
(fold_using_range::range_of_address): Same.
* gimple-range-fold.h (range_of_address): Same.
* gimple-range-infer.cc (gimple_infer_range::add_nonzero): Same.
* gimple-range-op.cc (class cfn_strlen): Same.
* gimple-range-path.cc
(path_range_query::adjust_for_non_null_uses): Same.
* gimple-ssa-warn-access.cc (pass_waccess::check_pointer_uses): Same.
* tree-ssa-structalias.cc (find_what_p_points_to): Same.
* range-op-ptr.cc (range_op_table::initialize_pointer_ops): Remove
hybrid entries in table.
* range-op.cc (range_op_table::range_op_table): Add pointer
entries for bitwise and/or and min/max.
* value-range.cc (irange::verify_range): Add assert.
* value-range.h (irange::varying_compatible_p): Remove check for
error_mark_node.
(irange::supports_p): Remove pointer support.
* ipa-cp.h (ipa_supports_p): Add prange support.
---
gcc/gimple-range-cache.cc | 4 ++--
gcc/gimple-range-fold.cc | 4 ++--
gcc/gimple-range-fold.h | 2 +-
gcc/gimple-range-infer.cc | 2 +-
gcc/gimple-range-op.cc | 2 +-
gcc/gimple-range-path.cc | 2 +-
gcc/gimple-ssa-warn-access.cc | 2 +-
gcc/ipa-cp.h | 2 +-
gcc/range-op-ptr.cc | 4 ----
gcc/range-op.cc | 18 ++++--------------
gcc/tree-ssa-structalias.cc | 2 +-
gcc/value-range.cc | 1 +
gcc/value-range.h | 4 ++--
13 files changed, 18 insertions(+), 31 deletions(-)
Comments
Breaks bootstrap on aarch64.
$ /opt/gcc/gcc-20240509/Build/./prev-gcc/xg++ -B/opt/gcc/gcc-20240509/Build/./prev-gcc/ -B/usr/aarch64-suse-linux/bin/ -nostdinc++ -B/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs -B/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs -I/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/include/aarch64-suse-linux -I/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/include -I/opt/gcc/gcc-20240509/libstdc++-v3/libsupc++ -L/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs -L/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs -fno-PIE -c -g -O2 -fno-checking -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Wconditionally-supported -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror -fno-common -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../../gcc -I../../gcc/. -I../../gcc/../include -I../../gcc/../libcpp/include -I../../gcc/../libcody -I../../gcc/../libdecnumber -I../../gcc/../libdecnumber/bid -I../libdecnumber -I../../gcc/../libbacktrace -o tree-vect-stmts.o -MT tree-vect-stmts.o -MMD -MP -MF ./.deps/tree-vect-stmts.TPo ../../gcc/tree-vect-stmts.cc
DISCRIMINATOR FAIL. Dispatch ====> RO_PPP <====
during IPA pass: inline
../../gcc/tree-vect-stmts.cc:14792:1: internal compiler error: in discriminator_fail, at range-op.cc:204
14792 | }
| ^
0x1145513 range_op_handler::discriminator_fail(vrange const&, vrange const&, vrange const&) const
../../gcc/range-op.cc:204
0x114592b range_op_handler::fold_range(vrange&, tree_node*, vrange const&, vrange const&, relation_trio) const
../../gcc/range-op.cc:228
0x1fe978b ipa_value_range_from_jfunc(vrange&, ipa_node_params*, cgraph_edge*, ipa_jump_func*, tree_node*)
../../gcc/ipa-cp.cc:1743
0xf5e0d7 evaluate_properties_for_edge(cgraph_edge*, bool, unsigned int*, unsigned int*, ipa_auto_call_arg_values*, bool)
../../gcc/ipa-fnsummary.cc:680
0xf6fedf do_estimate_edge_size(cgraph_edge*)
../../gcc/ipa-inline-analysis.cc:337
0xf72acf estimate_edge_size(cgraph_edge*)
../../gcc/ipa-inline.h:79
0xf72acf estimate_edge_growth(cgraph_edge*)
../../gcc/ipa-inline.h:100
0xf713cf do_estimate_growth_1
../../gcc/ipa-inline-analysis.cc:436
0xf714ff cgraph_node::call_for_symbol_and_aliases(bool (*)(cgraph_node*, void*), void*, bool)
../../gcc/cgraph.h:3429
0xf714ff estimate_growth(cgraph_node*)
../../gcc/ipa-inline-analysis.cc:474
0x200d153 inline_small_functions
../../gcc/ipa-inline.cc:2081
0x200d153 ipa_inline
../../gcc/ipa-inline.cc:2850
0x200d153 execute
../../gcc/ipa-inline.cc:3248
This is:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114985
I have proposed a patch but need confirmation from the IPA folks.
Aldy
On Thu, May 9, 2024 at 10:08 AM Andreas Schwab <schwab@linux-m68k.org> wrote:
>
> Breaks bootstrap on aarch64.
>
> $ /opt/gcc/gcc-20240509/Build/./prev-gcc/xg++ -B/opt/gcc/gcc-20240509/Build/./prev-gcc/ -B/usr/aarch64-suse-linux/bin/ -nostdinc++ -B/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs -B/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs -I/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/include/aarch64-suse-linux -I/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/include -I/opt/gcc/gcc-20240509/libstdc++-v3/libsupc++ -L/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/src/.libs -L/opt/gcc/gcc-20240509/Build/prev-aarch64-suse-linux/libstdc++-v3/libsupc++/.libs -fno-PIE -c -g -O2 -fno-checking -gtoggle -DIN_GCC -fno-exceptions -fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings -Wcast-qual -Wmissing-format-attribute -Wconditionally-supported -Woverloaded-virtual -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Werror -fno-common -DHAVE_CONFIG_H -fno-PIE -I. -I. -I../../gcc -I../../gcc/. -I../../gcc/../include -I../../gcc/../libcpp/include -I../../gcc/../libcody -I../../gcc/../libdecnumber -I../../gcc/../libdecnumber/bid -I../libdecnumber -I../../gcc/../libbacktrace -o tree-vect-stmts.o -MT tree-vect-stmts.o -MMD -MP -MF ./.deps/tree-vect-stmts.TPo ../../gcc/tree-vect-stmts.cc
> DISCRIMINATOR FAIL. Dispatch ====> RO_PPP <====
> during IPA pass: inline
> ../../gcc/tree-vect-stmts.cc:14792:1: internal compiler error: in discriminator_fail, at range-op.cc:204
> 14792 | }
> | ^
> 0x1145513 range_op_handler::discriminator_fail(vrange const&, vrange const&, vrange const&) const
> ../../gcc/range-op.cc:204
> 0x114592b range_op_handler::fold_range(vrange&, tree_node*, vrange const&, vrange const&, relation_trio) const
> ../../gcc/range-op.cc:228
> 0x1fe978b ipa_value_range_from_jfunc(vrange&, ipa_node_params*, cgraph_edge*, ipa_jump_func*, tree_node*)
> ../../gcc/ipa-cp.cc:1743
> 0xf5e0d7 evaluate_properties_for_edge(cgraph_edge*, bool, unsigned int*, unsigned int*, ipa_auto_call_arg_values*, bool)
> ../../gcc/ipa-fnsummary.cc:680
> 0xf6fedf do_estimate_edge_size(cgraph_edge*)
> ../../gcc/ipa-inline-analysis.cc:337
> 0xf72acf estimate_edge_size(cgraph_edge*)
> ../../gcc/ipa-inline.h:79
> 0xf72acf estimate_edge_growth(cgraph_edge*)
> ../../gcc/ipa-inline.h:100
> 0xf713cf do_estimate_growth_1
> ../../gcc/ipa-inline-analysis.cc:436
> 0xf714ff cgraph_node::call_for_symbol_and_aliases(bool (*)(cgraph_node*, void*), void*, bool)
> ../../gcc/cgraph.h:3429
> 0xf714ff estimate_growth(cgraph_node*)
> ../../gcc/ipa-inline-analysis.cc:474
> 0x200d153 inline_small_functions
> ../../gcc/ipa-inline.cc:2081
> 0x200d153 ipa_inline
> ../../gcc/ipa-inline.cc:2850
> 0x200d153 execute
> ../../gcc/ipa-inline.cc:3248
>
> --
> Andreas Schwab, schwab@linux-m68k.org
> GPG Key fingerprint = 7578 EB47 D4E5 4D69 2510 2552 DF73 E780 A9DA AEC1
> "And now for something completely different."
>
@@ -274,10 +274,10 @@ sbr_sparse_bitmap::sbr_sparse_bitmap (tree t, vrange_allocator *allocator,
// Pre-cache zero and non-zero values for pointers.
if (POINTER_TYPE_P (t))
{
- int_range<2> nonzero;
+ prange nonzero;
nonzero.set_nonzero (t);
m_range[1] = m_range_allocator->clone (nonzero);
- int_range<2> zero;
+ prange zero;
zero.set_zero (t);
m_range[2] = m_range_allocator->clone (zero);
}
@@ -597,7 +597,7 @@ fold_using_range::fold_stmt (vrange &r, gimple *s, fur_source &src, tree name)
// Process addresses.
if (gimple_code (s) == GIMPLE_ASSIGN
&& gimple_assign_rhs_code (s) == ADDR_EXPR)
- return range_of_address (as_a <irange> (r), s, src);
+ return range_of_address (as_a <prange> (r), s, src);
gimple_range_op_handler handler (s);
if (handler)
@@ -757,7 +757,7 @@ fold_using_range::range_of_range_op (vrange &r,
// If a range cannot be calculated, set it to VARYING and return true.
bool
-fold_using_range::range_of_address (irange &r, gimple *stmt, fur_source &src)
+fold_using_range::range_of_address (prange &r, gimple *stmt, fur_source &src)
{
gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN);
gcc_checking_assert (gimple_assign_rhs_code (stmt) == ADDR_EXPR);
@@ -157,7 +157,7 @@ protected:
fur_source &src);
bool range_of_call (vrange &r, gcall *call, fur_source &src);
bool range_of_cond_expr (vrange &r, gassign* cond, fur_source &src);
- bool range_of_address (irange &r, gimple *s, fur_source &src);
+ bool range_of_address (prange &r, gimple *s, fur_source &src);
bool range_of_phi (vrange &r, gphi *phi, fur_source &src);
void range_of_ssa_name_with_loop_info (vrange &, tree, class loop *, gphi *,
fur_source &src);
@@ -123,7 +123,7 @@ gimple_infer_range::add_nonzero (tree name)
{
if (!gimple_range_ssa_p (name))
return;
- int_range<2> nz;
+ prange nz;
nz.set_nonzero (TREE_TYPE (name));
add_range (name, nz);
}
@@ -1120,7 +1120,7 @@ class cfn_strlen : public range_operator
{
public:
using range_operator::fold_range;
- virtual bool fold_range (irange &r, tree type, const irange &,
+ virtual bool fold_range (irange &r, tree type, const prange &,
const irange &, relation_trio) const
{
wide_int max = irange_val_max (ptrdiff_type_node);
@@ -443,7 +443,7 @@ path_range_query::compute_ranges_in_block (basic_block bb)
void
path_range_query::adjust_for_non_null_uses (basic_block bb)
{
- int_range_max r;
+ prange r;
bitmap_iterator bi;
unsigned i;
@@ -4213,7 +4213,7 @@ pass_waccess::check_pointer_uses (gimple *stmt, tree ptr,
where the realloc call is known to have failed are valid.
Ignore pointers that nothing is known about. Those could
have escaped along with their nullness. */
- value_range vr;
+ prange vr;
if (m_ptr_qry.rvals->range_of_expr (vr, realloc_lhs, use_stmt))
{
if (vr.zero_p ())
@@ -296,7 +296,7 @@ bool values_equal_for_ipcp_p (tree x, tree y);
static inline bool
ipa_supports_p (tree type)
{
- return irange::supports_p (type);
+ return irange::supports_p (type) || prange::supports_p (type);
}
#endif /* IPA_CP_H */
@@ -1968,8 +1968,4 @@ range_op_table::initialize_pointer_ops ()
{
set (POINTER_PLUS_EXPR, op_pointer_plus);
set (POINTER_DIFF_EXPR, op_pointer_diff);
- set (BIT_AND_EXPR, op_hybrid_and);
- set (BIT_IOR_EXPR, op_hybrid_or);
- set (MIN_EXPR, op_hybrid_min);
- set (MAX_EXPR, op_hybrid_max);
}
@@ -102,23 +102,13 @@ range_op_table::range_op_table ()
set (MINUS_EXPR, op_minus);
set (NEGATE_EXPR, op_negate);
set (MULT_EXPR, op_mult);
-
- // Occur in both integer and pointer tables, but currently share
- // integral implementation.
set (ADDR_EXPR, op_addr);
set (BIT_NOT_EXPR, op_bitwise_not);
set (BIT_XOR_EXPR, op_bitwise_xor);
-
- // These are in both integer and pointer tables, but pointer has a different
- // implementation.
- // If commented out, there is a hybrid version in range-op-ptr.cc which
- // is used until there is a pointer range class. Then we can simply
- // uncomment the operator here and use the unified version.
-
- // set (BIT_AND_EXPR, op_bitwise_and);
- // set (BIT_IOR_EXPR, op_bitwise_or);
- // set (MIN_EXPR, op_min);
- // set (MAX_EXPR, op_max);
+ set (BIT_AND_EXPR, op_bitwise_and);
+ set (BIT_IOR_EXPR, op_bitwise_or);
+ set (MIN_EXPR, op_min);
+ set (MAX_EXPR, op_max);
}
// Instantiate a default range operator for opcodes with no entry.
@@ -6833,7 +6833,7 @@ find_what_p_points_to (tree fndecl, tree p)
struct ptr_info_def *pi;
tree lookup_p = p;
varinfo_t vi;
- value_range vr;
+ prange vr;
get_range_query (DECL_STRUCT_FUNCTION (fndecl))->range_of_expr (vr, p);
bool nonnull = vr.nonzero_p ();
@@ -1518,6 +1518,7 @@ irange::verify_range ()
gcc_checking_assert (m_num_ranges == 0);
return;
}
+ gcc_checking_assert (supports_p (type ()));
gcc_checking_assert (m_num_ranges <= m_max_ranges);
// Legacy allowed these to represent VARYING for unknown types.
@@ -988,7 +988,7 @@ irange::varying_compatible_p () const
const wide_int &u = m_base[1];
tree t = m_type;
- if (m_kind == VR_VARYING && t == error_mark_node)
+ if (m_kind == VR_VARYING)
return true;
unsigned prec = TYPE_PRECISION (t);
@@ -1033,7 +1033,7 @@ irange::nonzero_p () const
inline bool
irange::supports_p (const_tree type)
{
- return INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type);
+ return INTEGRAL_TYPE_P (type);
}
inline bool