[llvm-dev] [compiler-rt] Undefined negation in float emulation functions

Matthew Fernandez via llvm-dev llvm-dev at lists.llvm.org
Sun Oct 25 13:56:51 PDT 2015


On 26/10/15 02:54, Joerg Sonnenberger wrote:
> On Sun, Oct 25, 2015 at 06:46:48AM -0400, Steve Canon via llvm-dev wrote:
>> On Oct 24, 2015, at 6:02 PM, Chris Lattner <clattner at apple.com> wrote:
>>>
>>>
>>>> On Oct 23, 2015, at 7:43 PM, Matthew Fernandez via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>>>>> On 21/10/15 00:15, Stephen Canon wrote:
>>>>> Yup, this is UB.  If you want to propose a patch, I would do something like the following:
>>>>>
>>>>>     rep_t sign = 0;
>>>>>     unsigned int aAbs = a;
>>>>>     if (a < 0) {
>>>>>         sign = signBit;
>>>>>         aAbs = -aAbs;
>>>>>     }
>>>>>     // Now use aAbs instead of a.
>>>
>>> FWIW, another way to avoid the UB is to use an unsigned value.
>>
>> I'm confused, that's exactly what this does.
>
> At least in one place it is negating the signed variable, not creating a
> new unsigned variable.

Chris, were you suggesting a cast (`a = -(unsigned)a`)? Otherwise, like Steve, I don't understand the difference between 
this proposal and Steve's code above.


More information about the llvm-dev mailing list