https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120156
--- Comment #5 from Stefan Schulze Frielinghaus <stefansf at gcc dot gnu.org>
---
Sorry for taking so long. I accidentally switched to a checking=release build.
With checking=yes it is reproducible and I get a proper ICE. Now, even
earlier tests fail. With the appended reduced test I get:
$ c++ -O3 -std=c++14 -c t.ii
t.ii:133:3: warning: access declarations are deprecated in favor of
using-declarations; suggestion: add the 'using' keyword [-Wdeprecated]
133 | DenseCoeffsBase<Derived>::derived;
| ^~~~~~~~~~~~~~~~~~~~~~~~
during GIMPLE pass: aprefetch
t.ii: In function 'void product()':
t.ii:422:6: internal compiler error: tree check: expected ssa_name, have
integer_cst in ptr_deref_may_alias_decl_p, at tree-ssa-alias.cc:299
422 | void product() {
| ^~~~~~~
0x1269571 tree_check_failed(tree_node const*, char const*, int, char const*,
...)
/gcc/src/gcc/tree.cc:8995
0x1ff009b tree_check(tree_node*, char const*, int, char const*, tree_code)
/gcc/src/gcc/tree.h:3624
0x1ff009b ptr_deref_may_alias_decl_p
/gcc/src/gcc/tree-ssa-alias.cc:299
0x2cad1bf initialize_data_dependence_relation(data_reference*, data_reference*,
vec<loop*, va_heap, vl_ptr>)
/gcc/src/gcc/tree-data-ref.cc:3489
0x2cad2db compute_all_dependences(vec<data_reference*, va_heap, vl_ptr> const&,
vec<data_dependence_relation*, va_heap, vl_ptr>*, vec<loop*, va_heap, vl_ptr>
const&, bool)
/gcc/src/gcc/tree-data-ref.cc:5764
0x2cad2db compute_all_dependences(vec<data_reference*, va_heap, vl_ptr> const&,
vec<data_dependence_relation*, va_heap, vl_ptr>*, vec<loop*, va_heap, vl_ptr>
const&, bool)
/gcc/src/gcc/tree-data-ref.cc:5739
0x209d323 determine_loop_nest_reuse
/gcc/src/gcc/tree-ssa-loop-prefetch.cc:1693
0x209d323 loop_prefetch_arrays
/gcc/src/gcc/tree-ssa-loop-prefetch.cc:1939
0x209d323 tree_ssa_prefetch_arrays()
/gcc/src/gcc/tree-ssa-loop-prefetch.cc:2041
we enter ptr_deref_may_alias_decl_p with
call debug_tree(ptr)
<addr_expr 0x3fff74c5380
type <pointer_type 0x3fff78237e0
type <real_type 0x3fff78232a0 float sizes-gimplified type_6 SF
size <integer_cst 0x3fff7802fd8 constant 32>
unit-size <integer_cst 0x3fff781f000 constant 4>
align:32 warn_if_not_align:0 symtab:0 alias-set 2 canonical-type
0x3fff78232a0 precision:32
pointer_to_this <pointer_type 0x3fff78237e0> reference_to_this
<reference_type 0x3fff79dc1f8>>
sizes-gimplified public unsigned type_6 DI
size <integer_cst 0x3fff7802d98 constant 64>
unit-size <integer_cst 0x3fff7802db0 constant 8>
align:64 warn_if_not_align:0 symtab:0 alias-set 3 canonical-type
0x3fff78237e0>
constant
arg:0 <component_ref 0x3fff744bba0 type <real_type 0x3fff78232a0 float>
arg:0 <mem_ref 0x3fff7496c30 type <union_type 0x3fff79dc540 Packet>
arg:0 <integer_cst 0x3fff740a5b8 constant 0>
arg:1 <integer_cst 0x3fff740a630 constant 0>>
arg:1 <field_decl 0x3fff79db130 v4f type <real_type 0x3fff78232a0
float>
used nonlocal decl_3 SF t.ii:114:9 size <integer_cst 0x3fff7802fd8
32> unit-size <integer_cst 0x3fff781f000 4>
align:32 warn_if_not_align:0 offset_align 64 decl_not_flexarray: 0
offset <integer_cst 0x3fff7802dc8 constant 0>
bit-offset <integer_cst 0x3fff7802e10 constant 0> context
<union_type 0x3fff79d9bd0 Packet> chain <type_decl 0x3fff79db098 ._anon_6>>
t.ii:121:16 start: t.ii:121:10 finish: t.ii:121:18>>
then in
if (TREE_CODE (ptr) == ADDR_EXPR)
{
tree base = get_base_address (TREE_OPERAND (ptr, 0));
if (base
&& (TREE_CODE (base) == MEM_REF
|| TREE_CODE (base) == TARGET_MEM_REF))
ptr = TREE_OPERAND (base, 0);
we have
call debug_tree (base)
<mem_ref 0x3fff7496c30
type <union_type 0x3fff79dc540 Packet readonly sizes-gimplified cxx-odr-p
type_5 SI
size <integer_cst 0x3fff7802fd8 constant 32>
unit-size <integer_cst 0x3fff781f000 constant 4>
align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type
0x3fff79dc540
fields <function_decl 0x3fff79de300 __dt type <method_type
0x3fff79dc3f0>
public abstract external autoinline decl_3 QI t.ii:115:3 align:64
warn_if_not_align:0 context <union_type 0x3fff79d9bd0 Packet>
full-name "Packet::~Packet() noexcept (<uninstantiated>)"
not-really-extern chain <function_decl 0x3fff79de500 __dt_base >>
context <translation_unit_decl 0x3fff7819000 t.ii>
full-name "const union Packet"
X() X(constX&) this=(X&)
pointer_to_this <pointer_type 0x3fff79dca80> reference_to_this
<reference_type 0x3fff79dc5e8>>
arg:0 <integer_cst 0x3fff740a5b8 type <pointer_type 0x3fff7945348> constant
0>
arg:1 <integer_cst 0x3fff740a630 type <reference_type 0x3fff79dc5e8>
constant 0>>
which means we end up with a const_int
call debug_tree (ptr)
<integer_cst 0x3fff740a5b8 type <pointer_type 0x3fff7945348> constant 0>
with checking=yes we finally ICE in
pi = SSA_NAME_PTR_INFO (ptr);
or with checking=release we don't ICE but later on segfault.
Commit r15-491-gc290e6a0b7a9de introduces
diff --git a/gcc/tree-ssa-alias.cc b/gcc/tree-ssa-alias.cc
index e7c1c1aa624..374ba04e6fd 100644
--- a/gcc/tree-ssa-alias.cc
+++ b/gcc/tree-ssa-alias.cc
@@ -294,6 +294,11 @@ ptr_deref_may_alias_decl_p (tree ptr, tree decl)
if (!may_be_aliased (decl))
return false;
+ /* From here we require a SSA name pointer. Anything else aliases. */
+ if (TREE_CODE (ptr) != SSA_NAME
+ || !POINTER_TYPE_P (TREE_TYPE (ptr)))
+ return true;
which is why we don't see an ICE/segfault anymore.