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

Matthew Fernandez via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 29 17:46:46 PDT 2015


On 26 October 2015 at 07:56, Matthew Fernandez
<matthew.fernandez at gmail.com> wrote:
> 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.

I started an attempt at this today, but the current revision, r251669,
doesn't seem to build for me. I don't recall having problems building
Clang in the past and this time I just followed the standard getting
started instructions [0] without any odd flags in my environment. The
actual error is pages long, but is essentially a link failure when
forming libc++.so caused by failing to find vtables for things like
`__cxxabiv1::__si_class_type_info`. Is this a known issue? If the
solution is not straightforward, perhaps I should move this over to
Bugzilla.

  [0]: http://clang.llvm.org/get_started.html


More information about the llvm-dev mailing list