https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108520

            Bug ID: 108520
           Summary: [C2x] ICE in nonnull_arg_p, at tree.cc:14372 with -O1
                    and above (gnu::assume)
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: p...@gcc-bugzilla.mail.kapsi.fi
  Target Milestone: ---

Hi.

Consider the following testcase.  The important aspects are i) optimized, ii)
array of structures containing multiple elements, iii) assume.

Using 13.0.1 20230124 (experimental).

# cat assume.c
static
void f0() {  }

[[ gnu::nonnull(1) ]]
void f1(void *)
  {
    const struct { void (*f)(); } af[] = {
      { f0 } , { f0 } , { f0 }
    };

    for (__typeof__(af[0]) * it = af, * const end = af + sizeof(af) /
sizeof(af[0]); it != end; ++it)
      {
        [[ gnu::assume (it->f) ]];
        it->f();
      }
  }

# gcc -c -std=gnu2x -Wall -Wextra -O1 assume.c
during GIMPLE pass: ethread
assume.c: In function 'f1':
assume.c:16:3: internal compiler error: in nonnull_arg_p, at tree.cc:14372

---

(gdb) bt
#0  <address> in fancy_abort(char const*, int, char const*) ()
#1  <address> in nonnull_arg_p(tree_node const*) [clone .cold] ()
#2  <address> in get_range_global (r=..., name=<optimized out>)
    at <...>/src/gcc/gcc/value-query.cc:330
#3  <address> in global_range_query::range_of_expr (this=<optimized out>,
r=..., expr=<optimized out>,
    stmt=<optimized out>) at <...>/src/gcc/gcc/value-query.cc:406
#4  <address> in gimple_infer_range::check_assume_func (this=<optimized out>,
call=<optimized out>)
    at <...>/src/gcc/gcc/gimple-range-infer.cc:87
#5  <address> in gimple_infer_range::gimple_infer_range (this=<optimized out>,
s=<optimized out>)
    at <...>/src/gcc/gcc/gimple-range-infer.cc:166
#6  <address> in infer_range_manager::register_all_uses (this=<optimized out>,
name=<optimized out>)
    at <...>/src/gcc/gcc/gimple-range-infer.cc:374
#7  <address> in infer_range_manager::has_range_p (this=<optimized out>,
name=<optimized out>,
    bb=<optimized out>) at <...>/src/gcc/gcc/gimple-range-infer.cc:273
#8  <address> in infer_range_manager::maybe_adjust_range (this=<optimized out>,
r=..., name=<optimized out>,
    bb=<optimized out>) at <...>/src/gcc/gcc/gimple-range-infer.cc:290
#9  <address> in path_range_query::adjust_for_non_null_uses (this=<optimized
out>, bb=<optimized out>)
    at <...>/src/gcc/gcc/gimple-range-path.cc:502
#10 <address> in path_range_query::compute_ranges (this=<optimized out>,
dependencies=<optimized out>)
    at <...>/src/gcc/gcc/gimple-range-path.cc:623
#11 <address> in back_threader::find_taken_edge_cond (this=<optimized out>,
path=..., cond=<optimized out>)
    at <...>/src/gcc/gcc/bitmap.h:955
#12 <address> in back_threader::maybe_register_path (this=<optimized out>,
profit=...)
    at <...>/src/gcc/gcc/tree-ssa-threadbackward.cc:248
#13 <address> in back_threader::find_paths_to_names (this=<optimized out>,
bb=<optimized out>,
    interesting=<optimized out>, overall_paths=<optimized out>,
    at <...>/src/gcc/gcc/tree-ssa-threadbackward.cc:371
#14 <address> in back_threader::find_paths_to_names (this=<optimized out>,
bb=<optimized out>,
    interesting=<optimized out>, overall_paths=<optimized out>,
    at <...>/src/gcc/gcc/bitmap.h:955
#15 <address> in back_threader::maybe_thread_block (this=<optimized out>,
bb=<optimized out>)
    at <...>/src/gcc/gcc/bitmap.h:955
#16 <address> in back_threader::thread_blocks (this=<optimized out>)
    at <...>/src/gcc/gcc/tree-ssa-threadbackward.cc:975
#17 <address> in pass_thread_jumps_full::execute (this=<optimized out>,
fun=<optimized out>)
    at <...>/src/gcc/gcc/tree-ssa-threadbackward.cc:1105
#18 <address> in execute_one_pass (pass=<optimized out>)
    at <...>/src/gcc/gcc/passes.cc:2644
#19 <address> in execute_pass_list_1 (pass=<optimized out>)
    at <...>/src/gcc/gcc/passes.cc:2753
#20 <address> in execute_pass_list_1 (pass=<optimized out>)
    at <...>/src/gcc/gcc/passes.cc:2754
#21 <address> in execute_pass_list (fn=<optimized out>, pass=<optimized out>)
    at <...>/src/gcc/gcc/passes.cc:2764
#22 <address> in cgraph_node::expand (this=<optimized out>)
    at <...>/src/gcc/gcc/context.h:48
#23 <address> in symbol_table::compile (this=<optimized out>)
    at <...>/src/gcc/gcc/cgraphunit.cc:2015
#24 <address> in symbol_table::finalize_compilation_unit (this=<optimized out>)
    at <...>/src/gcc/gcc/cgraphunit.cc:2302
#25 <address> in compile_file () at <...>/src/gcc/gcc/toplev.cc:471
#26 <address> in toplev::main(int, char**) ()
#27 <address> in main (argc=<...>, argv=<...>) at <...>/src/gcc/gcc/main.cc:39

Reply via email to