No Signed Wrap

Hi,

I am not able to understand the No Signed Wrap property. My problem is in the Instruction combiner which combines two operations -
add1 = add ‘nsw’ x 5
add2 = add ‘nsw’ add1 1
into
add2 = add x 6. // No ‘nsw’ property in the combined operation.

From the comments in the Instruction Combiner I can see that the nsw flag / property is “conservatively cleared” but do not understand why - especially when it was present in both the add instructions.

Any insight would be appreciated.

Thanks in advance,
Pranav

Hi Pranav,

I am not able to understand the No Signed Wrap property. My problem is in the
Instruction combiner which combines two operations -
add1 = add 'nsw' x 5
add2 = add 'nsw' add1 1
into
add2 = add x 6. // No 'nsw' property in the combined operation.

From the comments in the Instruction Combiner I can see that the nsw flag /
property is "conservatively cleared" but do not understand why - especially when
it was present in both the add instructions.

consider the following example:

   %add1 = add nsw i8 %x, 120
   %add2 = add nsw i8 %add1, 10

Suppose for example that %x = -20. Then indeed there is no signed wrap in
either addition, and the result is 110.

The transform you mentioned would convert this into:

   %add2 = add i8 %x, -126

Notice how when %x = -20 there is now a signed wrap in the addition.

Ciao, Duncan.

So there are (at least) two conditions:
a) Both adds must be NSW.
b) Adding their constant operands must itself be NSW.

Any others? Because (b) should be pretty easy to check for, at least
if both constant operands are ConstantInts like in these examples.

In this case it would be safe to turn that into

    %add2 = sub nuw i8 %x, 126

since the initial nsw constraints mean that %x must be in [-128, -3],
aka [128, 253].

Would a change like that always be feasible for folds with condition
(b)? It sounds plausible...