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.