Re: [PATCH] tree-outof-ssa: fix unsignedp uninitialized in insert_value_copy_on_edge

Jeffrey Law <[email protected]>
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>

On 8/13/2026 2:45 PM, Andrea Pinski wrote:
> On Thu, Aug 13, 2026 at 1:39 PM Jeffrey Law
> <[email protected]> wrote:
>>
>>
>> On 8/12/2026 10:27 PM, Sam Price wrote:
>>> insert_value_copy_on_edge declares 'unsignedp' uninitialized and sets it
>>> only as a side effect of an argument to gcc_assert.  When src_mode and
>>> dest_mode differ it is then passed to convert_modes, which uses it to
>>> choose between zero and sign extension.
>>>
>>> gcc_assert does not always evaluate its argument.  With GCC_VERSION
>>> < 4005 and without assert checking, gcc/system.h defines
>>>
>>>     #define gcc_assert(EXPR) ((void)(0 && (EXPR)))
>>>
>>> so promote_ssa_mode is never called and unsignedp is passed to
>>> convert_modes indeterminate, selecting zero or sign extension at random.
>>> GCC_VERSION is __GNUC__ * 1000 + __GNUC_MINOR__, so any host compiler
>>> reporting less than 4.5 takes this branch.
>>>
>>> Relying on a side effect in gcc_assert is against the coding
>>> conventions regardless of which expansion is in use.  Call
>>> promote_ssa_mode outside the assert, as the same file already does in
>>> get_temp_reg, and keep the assert for the invariant alone.  unsignedp is
>>> initialized for the !REG_P path, where promote_ssa_mode is not called.
>>>
>>> Signed-off-by: Sam Price<[email protected]>
>>> Assisted-by: Claude (Anthropic)
>>> ---
>>>
>>> Found while getting gcc.c-torture running against a MicroBlaze port to
>>> LLVM, comparing the two compilers over the suite.
>> So I don't think is necessarily as simple as it might appear.  In
>> particular what is the right value for the !REG case.    I would suggest
>> one of two paths to make sure we're safe WRT the unsignedp initialization.
>>
>> First, make the call to promote_ssa_mode unconditionally.  The worry
>> here is that it may not be ready to handle non-REG cases.
>>
>> Second, in the src_mode != dest_mode code, assert REG_P (dest).
>>
>> Given the change affects generic code it would need to be bootstrapped
>> and regression tested on one of the primary targets (x86, aarch64 linux
>> being the most common).
> So the problem will only show up with --disable-checking and a non GCC build.
> Since GCC before 5.4.0 can't build GCC at this point. So maybe the
> best way forward is either removing assert checking or just changing
> the non-GCC gcc_assert case into the assert checking case.
> I filed https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126838 and
> Richard B. sugguests we remove --disable-checking. I tend to agree
> with him.
I could live with that as well.   But I don't think that resolves the 
question of what value to use for unsignedp unless you pair the removal 
with making the call to promote_ssa_mode unconditional.



jeff
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.