Re: AW: Correct way to express to the compiler "this does not get clobbered"?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/12/2020 23:52, Andrea Corallo via Gcc-help wrote:
> "Stefan Franke" <s.franke@xxxxxxxxxxxx> writes:
> 
>>>> -----Ursprüngliche Nachricht-----
>>>> Von: Gcc-help <gcc-help-bounces@xxxxxxxxxxx> Im Auftrag von Segher
>>>> Boessenkool
>>>> Gesendet: Freitag, 4. Dezember 2020 19:33
>>>> An: Andrea Corallo <andrea.corallo@xxxxxxx>
>>>> Cc: stefan@xxxxxxxxx; gcc-help@xxxxxxxxxxx
>>>> Betreff: Re: Correct way to express to the compiler "this does not get
>>>> clobbered"?
>>>>
>>>> On Fri, Dec 04, 2020 at 07:16:45PM +0100, Andrea Corallo via Gcc-help
>>> wrote:
>>>>> Segher Boessenkool <segher@xxxxxxxxxxxxxxxxxxx> writes:
>>>>>
>>>>>> On Fri, Dec 04, 2020 at 10:52:17AM +0100, Andrea Corallo via
>>> Gcc-help
>>>> wrote:
>>>>>>> stefan@xxxxxxxxx writes:
>>>>>>> I might open a bug but my understanding is that const is
>>>>>>> generally not used for optimizations.  Am I wrong?
>>>>>>
>>>>>> extern const int x = 42;
>>>>>> int f(void) { return x; }
>>>>>>
>>>>>> The code generated for f does not load the value for x from memory:
>>>>>> it returns 42 always.
>>>>
>>>>> Are you suggesting we should treat this as a bug?
>>>>
>>>> Huh?  No, I am just saying that const *is* used for optimisation, with
>>>> a
>>> dumb
>>>> simple example.  Remove const from this code and you get different
>>>> generated machine code (that does load x from memory always).
>>>>
>>>> If you think you have found a missing optimisation, please make a
>>>> self- contained demonstrator for that, and a file a PR?
>>>>
>>>>
>>>> Segher
>>
>> IMHO it's the cprop pass which should get enhanced.
>>
>> Stefan
> 
> Hi Stefan,
> 
> IIUC declaring a pointer to constant prevents the pointer to be used in
> order to modify what is pointing to.
> 
> But in this case (the original example) it does not prevent the function
> being called to modify that piece of memory (the one pointed by y).
> 
> Therefore I believe this is not a bug.
> 
>   Andrea
> 

That is, AFAIUI, correct.

The case of "extern const int x = 42;" above is very different - here
the object "x" is /defined/ as a const, and therefore the compiler knows
it cannot ever be changed (or rather, any attempts to change it are
undefined behaviour).  But if you make a const pointer to something, you
are merely saying that /you/ won't change the object (via that pointer).
 There is no way in C to say that there can't be anything else that
changes the object.





[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux