[PATCH] Have HasSideEffects() return false for __attribute__((const)) functions

Aaron Ballman aaron.ballman at gmail.com
Mon Mar 23 10:00:39 PDT 2015


On Mon, Mar 23, 2015 at 12:44 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> From: "Aaron Ballman" <aaron.ballman at gmail.com>
>> To: reviews+D8548+public+9c0a033e02b7b4b5 at reviews.llvm.org
>> Cc: "Michael M Kuperstein" <michael.m.kuperstein at intel.com>, "Richard Smith" <richard at metafoo.co.uk>, "Hal Finkel"
>> <hfinkel at anl.gov>, "llvm cfe" <cfe-commits at cs.uiuc.edu>
>> Sent: Monday, March 23, 2015 11:38:02 AM
>> Subject: Re: [PATCH] Have HasSideEffects() return false for __attribute__((const)) functions
>>
>> On Mon, Mar 23, 2015 at 12:33 PM, hfinkel at anl.gov <hfinkel at anl.gov>
>> wrote:
>> > In http://reviews.llvm.org/D8548#145253, @mkuper wrote:
>> >
>> >> I think PureAttr isn't strong enough.
>> >>
>> >> char foo(char *a)
>> >>  {
>> >>
>> >>   return *a;
>> >>
>> >> }
>> >>
>> >> is pure, but isn't side-effect free.
>> >
>> >
>> > Loads are not considered side effects currently, however. This
>> > works fine:
>> >
>> >   void bar(int *i) {
>> >     __builtin_assume(*i > 0);
>> >   }
>> >
>> > and, thus, my recommendation ;)
>>
>> Some loads are side-effecting though, such as volatile loads:
>>
>> int foo(volatile int *a) {
>>   return *a;
>> }
>>
>> Can that be marked __attribute__((pure))? Or can pure access a
>> volatile global variable?
>
> I think that the answer is no, but only by indirect inference. The GCC docs say:
>
> [from GCC docs]
> Many functions have no effects except the return value and their return value depends only on the parameters and/or global variables. Such a function can be subject to common subexpression elimination and loop optimization just as an arithmetic operator would be.
> [end from GCC docs]
>
> and since volatile loads often cannot be CSE'd, I suspect they're meant to be excluded. What do you think?

I'm not overly familiar with __attribute__((pure)), but what you say
seems logical. Looking at the GCC docs a bit more closely, it also
says: "Interesting non-pure functions are functions with infinite
loops or those depending on volatile memory or other system resource,
that may change between two consecutive calls (such as feof in a
multithreading environment). "

So I think it might be safe to do this for __attribute__((pure)) as well.

~Aaron

>
>  -Hal
>
>>
>> ~Aaron
>>
>> >
>> >
>> > http://reviews.llvm.org/D8548
>> >
>> > EMAIL PREFERENCES
>> >   http://reviews.llvm.org/settings/panel/emailpreferences/
>> >
>> >
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory




More information about the cfe-commits mailing list