> On May 22, 2024, at 03:38, Richard Biener <richard.guent...@gmail.com> wrote:
> 
> On Tue, May 21, 2024 at 11:36 PM David Malcolm <dmalc...@redhat.com> wrote:
>> 
>> On Tue, 2024-05-21 at 15:13 +0000, Qing Zhao wrote:
>>> Thanks for the comments and suggestions.
>>> 
>>>> On May 15, 2024, at 10:00, David Malcolm <dmalc...@redhat.com>
>>>> wrote:
>>>> 
>>>> On Tue, 2024-05-14 at 15:08 +0200, Richard Biener wrote:
>>>>> On Mon, 13 May 2024, Qing Zhao wrote:
>>>>> 
>>>>>> -Warray-bounds is an important option to enable linux kernal to
>>>>>> keep
>>>>>> the array out-of-bound errors out of the source tree.
>>>>>> 
>>>>>> However, due to the false positive warnings reported in
>>>>>> PR109071
>>>>>> (-Warray-bounds false positive warnings due to code duplication
>>>>>> from
>>>>>> jump threading), -Warray-bounds=1 cannot be added on by
>>>>>> default.
>>>>>> 
>>>>>> Although it's impossible to elinimate all the false positive
>>>>>> warnings
>>>>>> from -Warray-bounds=1 (See PR104355 Misleading -Warray-bounds
>>>>>> documentation says "always out of bounds"), we should minimize
>>>>>> the
>>>>>> false positive warnings in -Warray-bounds=1.
>>>>>> 
>>>>>> The root reason for the false positive warnings reported in
>>>>>> PR109071 is:
>>>>>> 
>>>>>> When the thread jump optimization tries to reduce the # of
>>>>>> branches
>>>>>> inside the routine, sometimes it needs to duplicate the code
>>>>>> and
>>>>>> split into two conditional pathes. for example:
>>>>>> 
>>>>>> The original code:
>>>>>> 
>>>>>> void sparx5_set (int * ptr, struct nums * sg, int index)
>>>>>> {
>>>>>>  if (index >= 4)
>>>>>>    warn ();
>>>>>>  *ptr = 0;
>>>>>>  *val = sg->vals[index];
>>>>>>  if (index >= 4)
>>>>>>    warn ();
>>>>>>  *ptr = *val;
>>>>>> 
>>>>>>  return;
>>>>>> }
>>>>>> 
>>>>>> With the thread jump, the above becomes:
>>>>>> 
>>>>>> void sparx5_set (int * ptr, struct nums * sg, int index)
>>>>>> {
>>>>>>  if (index >= 4)
>>>>>>    {
>>>>>>      warn ();
>>>>>>      *ptr = 0;         // Code duplications since "warn" does
>>>>>> return;
>>>>>>      *val = sg->vals[index];   // same this line.
>>>>>>                                // In this path, since it's
>>>>>> under
>>>>>> the condition
>>>>>>                                // "index >= 4", the compiler
>>>>>> knows
>>>>>> the value
>>>>>>                                // of "index" is larger then 4,
>>>>>> therefore the
>>>>>>                                // out-of-bound warning.
>>>>>>      warn ();
>>>>>>    }
>>>>>>  else
>>>>>>    {
>>>>>>      *ptr = 0;
>>>>>>      *val = sg->vals[index];
>>>>>>    }
>>>>>>  *ptr = *val;
>>>>>>  return;
>>>>>> }
>>>>>> 
>>>>>> We can see, after the thread jump optimization, the # of
>>>>>> branches
>>>>>> inside
>>>>>> the routine "sparx5_set" is reduced from 2 to 1, however,  due
>>>>>> to
>>>>>> the
>>>>>> code duplication (which is needed for the correctness of the
>>>>>> code),
>>>>>> we
>>>>>> got a false positive out-of-bound warning.
>>>>>> 
>>>>>> In order to eliminate such false positive out-of-bound warning,
>>>>>> 
>>>>>> A. Add one more flag for GIMPLE: is_splitted.
>>>>>> B. During the thread jump optimization, when the basic blocks
>>>>>> are
>>>>>>   duplicated, mark all the STMTs inside the original and
>>>>>> duplicated
>>>>>>   basic blocks as "is_splitted";
>>>>>> C. Inside the array bound checker, add the following new
>>>>>> heuristic:
>>>>>> 
>>>>>> If
>>>>>>   1. the stmt is duplicated and splitted into two conditional
>>>>>> paths;
>>>>>> +  2. the warning level < 2;
>>>>>> +  3. the current block is not dominating the exit block
>>>>>> Then not report the warning.
>>>>>> 
>>>>>> The false positive warnings are moved from -Warray-bounds=1 to
>>>>>> -Warray-bounds=2 now.
>>>>>> 
>>>>>> Bootstrapped and regression tested on both x86 and aarch64.
>>>>>> adjusted
>>>>>> -Warray-bounds-61.c due to the false positive warnings.
>>>>>> 
>>>>>> Let me know if you have any comments and suggestions.
>>>>> 
>>>>> At the last Cauldron I talked with David Malcolm about these kind
>>>>> of
>>>>> issues and thought of instead of suppressing diagnostics to
>>>>> record
>>>>> how a block was duplicated.  For jump threading my idea was to
>>>>> record
>>>>> the condition that was proved true when entering the path and do
>>>>> this
>>>>> by recording the corresponding locations
>>> 
>>> Is only recording the location for the TRUE path  enough?
>>> We might need to record the corresponding locations for both TRUE and
>>> FALSE paths since the VRP might be more accurate on both paths.
>>> Is only recording the location is enough?
>>> Do we need to record the pointer to the original condition stmt?
>> 
>> Just to be clear: I don't plan to work on this myself (I have far too
>> much already to work on...); I'm assuming Richard Biener is
>> hoping/planning to implement this himself.
> 
> While I think some of this might be an improvement to those vast
> number of "false positive" diagnostics we have from (too) late diagnostic
> passes I do not have the cycles to work on this.

I can study a little bit more on how to improve the diagnostics for PR 109071 
first. 

FYI, I just updated PR109071’s description as: Need more context for 
-Warray-bounds warnings due to code duplication from jump threading. 

As we already agreed, this is NOT a false positive. It caught a real bug in 
linux kernel that need to be patched in the kernel source. (See 
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109071#c11)

In order to add more context to the diagnostics to help the end user locate the 
bug accurately in their source code, compiler needs:

1. During jump threading phase, record the following information for each 
duplicated STMT:
        A. A pointer to the COND stmt;
        B. True/false for such COND 
2. During array out-of-bound checking phase, whenever locate an out-of-bound 
case, 
        A. Use a rich_location for the diagnostic;
        B. Create an instance of diagnositic_path, add events to this 
diagnostic_path based on the COND stmt, True/False info recorded in the STMT;
        C. Call richloc.set_path() to associate the path with the rich_location;
        D. Then issue warning with this rich_location instead of the current 
regular location. 

Any comment and suggestion to the above? 
Thanks.

Qing


> 
> Richard.
> 
>> But feel free to ask me any questions about the diagnostic_path
>> machinery within the diagnostics subsystem.
>> 
>> [...snip...]
>> 
>> Regards
>> Dave


Reply via email to