On 1/18/19 4:43 PM, Martin Sebor wrote:
> On 1/18/19 2:35 AM, Christophe Lyon wrote:
>> Hi Martin,
>>
>>
>> On Thu, 17 Jan 2019 at 02:51, Martin Sebor <mse...@gmail.com> wrote:
>>>
>>> On 1/16/19 6:14 PM, Jeff Law wrote:
>>>> On 1/15/19 8:21 AM, Martin Sebor wrote:
>>>>> On 1/15/19 4:07 AM, Richard Biener wrote:
>>>>>> On Tue, Jan 15, 2019 at 1:08 AM Martin Sebor <mse...@gmail.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> The gimple_fold_builtin_memory_op() function folds calls to memcpy
>>>>>>> and similar to MEM_REF when the size of the copy is a small power
>>>>>>> of 2, but it does so without considering whether the copy might
>>>>>>> write (or read) past the end of one of the objects.  To detect
>>>>>>> these kinds of errors (and help distinguish them from -Westrict)
>>>>>>> the folder calls into the wrestrict pass and lets it diagnose them.
>>>>>>> Unfortunately, that can lead to false positives for even some fairly
>>>>>>> straightforward code that is ultimately found to be unreachable.
>>>>>>> PR 88800 is a report of one such problem.
>>>>>>>
>>>>>>> To avoid these false positives the attached patch adjusts
>>>>>>> the function to avoid issuing -Warray-bounds for out-of-bounds
>>>>>>> calls to memcpy et al.  Instead, the patch disables the folding
>>>>>>> of such invalid calls (and only those).  Those that are not
>>>>>>> eliminated during DCE or other subsequent passes are eventually
>>>>>>> diagnosed by the wrestrict pass.
>>>>>>>
>>>>>>> Since this change required removing the dependency of the detection
>>>>>>> on the warning options (originally done as a micro-optimization to
>>>>>>> avoid spending compile-time cycles on something that wasn't needed)
>>>>>>> the patch also adds tests to verify that code generation is not
>>>>>>> affected as a result of warnings being enabled or disabled.  With
>>>>>>> the patch as is, the invalid memcpy calls end up emitted (currently
>>>>>>> they are folded into equally invalid MEM_REFs).  At some point,
>>>>>>> I'd like us to consider whether they should be replaced with traps
>>>>>>> (possibly under the control of  as has been proposed a number of
>>>>>>> times in the past.  If/when that's done, these tests will need to
>>>>>>> be adjusted to look for traps instead.
>>>>>>>
>>>>>>> Tested on x86_64-linux.
>>>>>>
>>>>>> I've said in the past that I feel delaying of folding is wrong.
>>>>>>
>>>>>> To understand, the PR is about emitting a warning for out-of-bound
>>>>>> accesses in a dead code region?
>>>>>
>>>>> Yes.  I am keeping in my mind your preference of not delaying
>>>>> the folding of valid code.
>>>>>
>>>>>>
>>>>>> If we think delaying/disablign the folding is the way to go the
>>>>>> patch looks OK.
>>>>>
>>>>> I do, at least for now.  I'm taking this as your approval to commit
>>>>> the patch (please let me know if you didn't mean it that way).
>>>> Note we are in stage4, so we're supposed to be addressing regression
>>>> bugfixes and documentation issues.
>>>>
>>>> So  I think Richi needs to be explicit about whether or not he wants
>>>> this in gcc-9 or if it should defer to gcc-10.
>>>>
>>>> I have no technical objections to the patch and would easily ack it in
>>>> stage1 or stage3.
>>>
>>> The warning is a regression introduced in GCC 8.  I was just about
>>> to commit the fix so please let me know if I should hold off until
>>> stage 1.
>>>
>>
>> After your commit (r268037), I'm seeing excess errors on some arm
>> targets:
>> FAIL: c-c++-common/Wrestrict.c  -Wc++-compat  (test for excess errors)
>> Excess errors:
>> /gcc/testsuite/c-c++-common/Wrestrict.c:195:3: warning: 'memcpy'
>> accessing 4 bytes at offsets [2, 3] and 0 overlaps between 1 and 2
>> bytes at offset [2, 3] [-Wrestrict]
>> /gcc/testsuite/c-c++-common/Wrestrict.c:202:3: warning: 'memcpy'
>> accessing 4 bytes at offsets [2, 3] and 0 overlaps between 1 and 2
>> bytes at offset [2, 3] [-Wrestrict]
>> /gcc/testsuite/c-c++-common/Wrestrict.c:207:3: warning: 'memcpy'
>> accessing 4 bytes at offsets [2, 3] and 0 overlaps between 1 and 2
>> bytes at offset [2, 3] [-Wrestrict]
>>
>>
>> This is not true for all arm toolchains, so for instance if you want
>> to reproduce it, you can build for target arm-eabi and keep default
>> cpu/fpu/mode.
> 
> The warnings are valid, the test just hardcodes the wrong byte counts
> in the xfailed dg-warning directives.  I've fixed the byte counts so
> that the test just shows XPASSes.
> 
> The other issue here is that the -Wrestrict warning only triggers for
> built-ins and whether GCC keeps those around or folds them to MEM_REFs
> depends on the target.  On common targets, a memcpy (d, d + 2, 4) call,
> for instance, (i.e., one with a small power-of-2 size) is folded to
> MEM_REF, so there is no -Wrestrict warning despite the overlap.
> Strictly, it's a false negative, but in reality it's not a problem
> because GCC gives the MEM_REF copy the same safe semantics as with
> memmove, so the overlap is benign.
> 
> But on targets that optimize for space by default (like arm-eabi)
> the folding doesn't happen, memcpy gets called for the overlapping
> regions, and we get the helpful warning.
> 
> If there was a way to tell at compile time which target the test is
> being compiled for, whether a folding or non-folding one, that would
> give us a way to conditionalize the dg-warnings and avoid these pesky
> regressions.  I just posted a patch to do that so if it's approved,
> these failures should all be resolved.  Ultimately, though, I'd like
> to make the warnings detect invalid accesses in MEM_REFs as much as
> in built-in calls, so this should be just a temporary stop-gap fix.
> 
> https://gcc.gnu.org/ml/gcc-patches/2019-01/msg01111.html
I'm not sure if a way to control or predict this stuff. It's dependent
on the target's capabilities, its MOVE_RATIO defintion as well as any
conditions in its block move patterns.

The only way would be to auto-detect this kind of stuff in the dejagnu
framework by passing in suitable C code and analyzing the result.  Ugh.

Not having good knobs/switches on this stuff is a bit of a design &
implementation wart.

I noticed in another thread you were investigating
-m<whatever>-strategy.  All -m arguments are supposed to be target
specific, so you can't rely on those for generic tests.

jeff

Reply via email to