[llvm-commits] [llvm] r126964 - in /llvm/trunk: lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp lib/CodeGen/SelectionDAG/LegalizeTypes.h test/CodeGen/X86/umulo-64.ll
Eric Christopher
echristo at apple.com
Thu Mar 3 14:57:01 PST 2011
On Mar 3, 2011, at 2:52 PM, Eli Friedman wrote:
> On Thu, Mar 3, 2011 at 2:39 PM, Eric Christopher <echristo at apple.com> wrote:
>>
>> On Mar 3, 2011, at 2:33 PM, Eli Friedman wrote:
>>
>>> Author: efriedma
>>> Date: Thu Mar 3 16:33:23 2011
>>> New Revision: 126964
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=126964&view=rev
>>> Log:
>>> Revert r123908; the code in question is completely untested and wrong.
>>
>> How very anti-social of you.
>>
>> Don't do that again without sending email first or filing a bug.
>
> Sorry, I agree that was inappropriate.
>
>> What's up?
>
> On x86-64, trying to compile an i128 umulo crashes. As for smulo,
> it's returning completely wrong results because it's trying to use the
> bottom 128 bits of an i128-bit multiply to determine whether it
> overflowed, which is impossible to do. For example, compiling the
> following at -O0 with -ftrapv traps, while it is trivial to conclude
> it shouldn't because a 64x64->128 multiply can't overflow.
>
> #include <stdio.h>
> __int128_t x(__int128_t a, __int128_t b) {
> return a*b;
> }
>
> int main() {
> __int128_t r = x((long long)0x8000000000000001, (long
> long)0x8000000000000000);
> printf("%llx %llx\n", (long long)(r >> 64), (long long)r);
> return 0;
> }
Aha. I'd only been testing 64-bit on arm, not 128-bit on x86-64. Though, what happens on x86-64 without the patch applied? It can't possibly succeed and be correct?
I'll take a look at it, but I'm pretty sure the code works for 64-bit. Probably could hack it to turn off if there's no multiply instruction for the target at the width.
-eric
More information about the llvm-commits
mailing list