[cfe-dev] Why no NSW/NUW with SHL instruction?

Ryan Taylor ryta1203 at gmail.com
Mon Nov 24 14:56:01 PST 2014


So is that the argument for adding an ashl? :)

On Fri, Nov 21, 2014 at 3:12 PM, David Majnemer <david.majnemer at gmail.com>
wrote:

> On Fri, Nov 21, 2014 at 10:00 AM, Ryan Taylor <ryta1203 at gmail.com> wrote:
>
>> So why in some cases does it still produce the nsw/nuw flag? Just curious.
>>
>
> Let's say you had:
> %mul = mul nsw i32 %V, 2
>
> This can safely be transformed into:
> %mul = shl nsw i32 %V, 1
>
> However, let's take the example:
> %mul = mul nsw i32 %V, -2147483648
>
> We cannot transform this into:
> %mul = shl nsw i32 %V, 31
>
> If we did this, then we would have created a poison value where non
> previously existed.
> This is because when %V is 1, 1 * -2147483648 is just -2147483648 but 1
> << 31 violates NSW.
>
> Instead, we end up with:
> %mul = shl i32 %V, 31
>
> I don't think it's correct to see 'shl nsw' as an arithmetic left-shift
> and 'shl nuw' as a logical shift.
> Where would that leave 'shl nsw nuw' ?
>
> Finally, nsw and nuw flags are permitted to be ignored or otherwise
> dropped when optimizing or performing analysis.
>
>
>>
>> We are going with intrinsics, but I'm still curious. Thanks.
>>
>> On Fri, Nov 21, 2014 at 12:54 PM, David Chisnall <
>> David.Chisnall at cl.cam.ac.uk> wrote:
>>
>>> On 21 Nov 2014, at 17:39, Ryan Taylor <ryta1203 at gmail.com> wrote:
>>>
>>> > I don't care if clang only produces shl, I'm more curious how to get
>>> the signed info to the backend for shl when it's not producing a nsw/nuw
>>> flag? I'm currently not sure how this would be done, is there another arch
>>> that manages this somehow?
>>>
>>> I think the point is that the only difference between the two is the
>>> overflow flag, which is not something that C exposes, and LLVM IR tends to
>>> be driven by the needs of the front ends.
>>>
>>> If you wanted an IR instruction that represented a left shift that set a
>>> flag, then you'd need something that returned both the result and the
>>> overflow flag (look at the existing overflow checked addition intrinsics
>>> for inspiration).  This sort of thing tends only to be added when someone
>>> needs it.  If the first someone to need it is you, then... patches
>>> welcome.  I think that you'd probably want to implement it as a
>>> shift-with-overflow intrinsic rather than a variation on the shl
>>> instruction and you'd probably need to provide some expansion for it for
>>> processors that don't have a direct mapping.
>>>
>>> David
>>>
>>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141124/1825aa04/attachment.html>


More information about the cfe-dev mailing list