[LLVMdev] On semantics of add instruction - nsw,nuw flags
Tobias Grosser
tobias at grosser.es
Wed Jul 23 11:56:27 PDT 2014
On 23/07/2014 20:32, Dan Gohman wrote:
>
>
>
> On Wed, Jul 23, 2014 at 1:54 AM, Tobias Grosser <tobias at grosser.es
> <mailto:tobias at grosser.es>> wrote:
>
> On 23/07/2014 09:46, Tim Northover wrote:
>
> Then why does the Release Note say
> " the operation is guaranteed to not overflow".
>
>
> It means that the person who wrote the IR has guaranteed that
> there's
> no overflow (by some means) so LLVM can assume it during
> optimisation.
>
> This guarantee might come from doing explicit checks before
> executing
> the add/sub; or perhaps from performing the operation after a
> sext so
> that the type is guaranteed to be big enough; or (as in C) by
> trusting
> the programmer to make sure that doesn't happen.
>
> What are the redundancies in the following code snip. Assume
> they appear in
> that order in a basic block.
>
> Case1; %add2 = add nsw i32 %add, %add1
> %add3 = add i32 %add, %add1
>
> Case2: %add2 = add i32 %add, %add1
> %add3 = add nsw i32 %add, %add1
>
>
> In both cases the add with nsw can be removed in favour of the one
> without. Order is completely irrelevant for normal LLVM arithmetic
> instructions.
>
>
> Tim,
>
> if both instructions are right after each other such that we know
> that either none of them or both will be executed, is there a way to
> leave the nsw flag taking advantage of the knowledge that any pair
> of values
> that cause nsw in the instruction that originally had now nsw flag
> is already known to break the nsw assumption of the other instruction
> and causes consequently undefined behaviour?
>
>
> No; the motivation for poison values (formerly named trap values, if
> anyone is reading the rationale linked to earlier in the thread) is to
> defer undefined behavior until execution can no longer be speculative.
> The location where a poison value is produced isn't significant. What's
> important is the location of the use of a poison value (and how it's used).
>
>
> The langref description is a little surprising, as it seems the
> undefined behaviour only is invoked is the resulting poison value is
> actually used:
>
> "Poison Values have the same behavior as undef values, with the
> additional affect that any instruction which has a dependence on a
> poison value has undefined behavior."
>
>
> Correct. nsw isn't a guarantee that overflow won't occur. It is
> (intended to be) a guarantee that if overflow does occur, the program
> will avoid using the result for anything important (roughly speaking).
Thanks, for bringing this back to my mind.
Tobias
More information about the llvm-dev
mailing list