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

Kuperstein, Michael M michael.m.kuperstein at intel.com
Mon Mar 23 09:09:40 PDT 2015


This is exactly the problem - that's what I'd expect from the warning text, but apparently, that is not what actually happens.
For "assume(a > 0 && i++)" the entire assumption gets thrown out.

void foo(int a, int b)
{
  __builtin_assume(a > 0 && b++);
}

>clang -O0 -c -S -o - -emit-llvm assume.c

assume.c:3:20: warning: the argument to '__builtin_assume' has side effects that will be discarded [-Wassume]
  __builtin_assume(a > 0 && b++);
                   ^~~~~~~~~~~~
; ModuleID = 'assume.c'
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"

; Function Attrs: nounwind uwtable
define void @foo(i32 %a, i32 %b) #0 {
entry:
  %b.addr = alloca i32, align 4
  %a.addr = alloca i32, align 4
  store i32 %b, i32* %b.addr, align 4
  store i32 %a, i32* %a.addr, align 4
  ret void
}

-----Original Message-----
From: Aaron Ballman [mailto:aaron.ballman at gmail.com] 
Sent: Monday, March 23, 2015 18:01
To: reviews+D8548+public+9c0a033e02b7b4b5 at reviews.llvm.org
Cc: Kuperstein, Michael M; Hal Finkel; Richard Smith; llvm cfe
Subject: Re: [PATCH] Have HasSideEffects() return false for __attribute__((const)) functions

On Mon, Mar 23, 2015 at 11:47 AM, Michael Kuperstein <michael.m.kuperstein at intel.com> wrote:
> Also, there's something a bit odd about the warning text for an assume with side-effects.
>
> "the argument to '__assume' has side effects that will be discarded" suggests that only the side effects will be discarded.

Which is correct. The side effects are unevaluated, but __assume is not. Think: sizeof(i++). i will not be incremented, but sizeof is still evaluated and produces a result.

> This:
> (a) doesn't make a lot of sense to me, and
> (b) doesn't imply that nothing at all will be emitted.
> That is, for "assume(a > 0 && i++)", the warning would make me expect that what I ended up with was equivalent to "assume(a > 0)" or perhaps "assume(a > 0 && i)".

The latter is correct, not the former.

>
> Is this just a problem with how I'm reading the warning? If not, any suggestions for alternative text?

I'm not certain where the confusion lies, but if there is alternative text that would be more clear, then great!

~Aaron

>
>
> http://reviews.llvm.org/D8548
>
> EMAIL PREFERENCES
>   http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
---------------------------------------------------------------------
Intel Israel (74) Limited

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.




More information about the cfe-commits mailing list