[Bug tree-optimization/124788] tree-fnsummary.cc calls ptr_deref_may_alias_global_p on a non-pointer SSA name

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Apr 7 09:30:53 GMT 2026


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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2026-04-07

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Filip Kastl from comment #0)
> Compile the attached source file with trunk GCC using -O2 and debug the
> compilation using for example GDB (-wrapper gdb,--args).
> 
> Set a breakpoint at the tree-ssa-alias.cc:ptr_deref_may_alias_global_p
> function.  You'll see that it gets called on x_24.  That is not a pointer
> SSA name.  But ptr_deref_may_alias_global_p assumes the 'ptr' parameter *is*
> a pointer.  It ends up reading from ptr.ssa_name.info.ptr_info.  But info is
> an union and for x_24, ptr_deref_may_alias_global_p ends up reading garbage.
> 
>   1725   /* Value range information.  */
>   1726   union ssa_name_info_type {
>   1727     /* Range and aliasing info for pointers.  */
>   1728     struct GTY ((tag ("0"))) ptr_info_def *ptr_info;
>   1729     /* Range info for everything else.  */
>   1730     struct GTY ((tag ("1"))) vrange_storage * range_info;
>   1731   } GTY ((desc ("%1.typed.type ?" \
>   1732                 "!POINTER_TYPE_P (TREE_TYPE ((tree)&%1)) : 2"))) info;
> 
> I haven't seen this cause any ICEs or miscompilations.  I've merely noticed
> this while working on something else.  This could potentially cause problems
> in the future, so I think we should do something about it.
> 
> Seems to me that the fix could just be having
> ipa-fnsummary.cc:points_to_local_or_readonly_memory_p return false when
> !POINTER_TYPE_P(TREE_TYPE(t)) but I haven't looked into this thoroughly.

Yes, I agree.

> Also, we should probably have a
> gcc_checking_assert(POINTER_TYPE_P(TREE_TYPE(ptr)) in
> tree-ssa-alias.cc:ptr_deref_may_alias_global_p (and in other alias functions
> that assume pointer-ness).

ideally SSA_NAME_PTR_INFO would, as part of SSA_NAME_CHECK, also do
a pointer type check (similar SSA_NAME_RANGE_INFO).  Needs a separate
SSA_NAME_WITH_POINTER_TYPE_CHECK then, of course, or simply turning
SSA_NAME_PTR_INFO into a static inline function.

> Backtrace:
> 
> #0  ptr_deref_may_alias_global_p (ptr=0x7ffff7745dc0, escaped_local_p=false)
>     at ../../src/gcc/tree-ssa-alias.cc:238
> #1  0x000000000163aa24 in points_to_local_or_readonly_memory_p
> (t=0x7ffff7745dc0)
>     at ../../src/gcc/ipa-fnsummary.cc:2661
> #2  0x000000000163c485 in analyze_function_body (node=0x7ffff7735110,
> early=true)
>     at ../../src/gcc/ipa-fnsummary.cc:3078
> #3  0x000000000163e273 in compute_fn_summary (node=0x7ffff7735110,
> early=true)
>     at ../../src/gcc/ipa-fnsummary.cc:3518
> #4  0x000000000163e340 in compute_fn_summary_for_current () at
> ../../src/gcc/ipa-fnsummary.cc:3548
> #5  0x0000000001643e71 in (anonymous
> namespace)::pass_local_fn_summary::execute (this=0x4a679e0)
>     at ../../src/gcc/ipa-fnsummary.cc:5219
> #6  0x000000000188858a in execute_one_pass (pass=0x4a679e0) at
> ../../src/gcc/passes.cc:2656
> #7  0x00000000018889ce in execute_pass_list_1 (pass=0x4a679e0) at
> ../../src/gcc/passes.cc:2769
> #8  0x0000000001888a58 in execute_pass_list (fn=0x7ffff7681ea0,
> pass=0x4a66d30)
>     at ../../src/gcc/passes.cc:2780
> #9  0x0000000001886343 in do_per_function_toporder (
>     callback=0x1888a1b <execute_pass_list(function*, opt_pass*)>,
> data=0x4a66d30)
>     at ../../src/gcc/passes.cc:1785
> #10 0x00000000018896e7 in execute_ipa_pass_list (pass=0x4a66cd0) at
> ../../src/gcc/passes.cc:3123
> #11 0x000000000129251c in ipa_passes () at ../../src/gcc/cgraphunit.cc:2244
> #12 0x00000000012928b0 in symbol_table::compile (this=0x7ffff7806000)
>     at ../../src/gcc/cgraphunit.cc:2367
> #13 0x0000000001292ebd in symbol_table::finalize_compilation_unit
> (this=0x7ffff7806000)
>     at ../../src/gcc/cgraphunit.cc:2626
> #14 0x0000000001a1f633 in compile_file () at ../../src/gcc/toplev.cc:482
> #15 0x0000000001a22b59 in do_compile () at ../../src/gcc/toplev.cc:2225
> #16 0x0000000001a22fc0 in toplev::main (this=0x7fffffffd4da, argc=21,
> argv=0x7fffffffd608)
>     at ../../src/gcc/toplev.cc:2389
> #17 0x000000000388b79c in main (argc=21, argv=0x7fffffffd608) at
> ../../src/gcc/main.cc:39


More information about the Gcc-bugs mailing list