[LLVMdev] llvm-gcc promotes i32 mul to i64 inside __muldi3

Sergey Yakoushkin sergey.yakoushkin at gmail.com
Wed Mar 17 13:32:53 PDT 2010


I'm building tool-chain for processor without integer MUL.
So, I've defined __mulsi3 for integer multiplication (int32).

Now I've got a problem with int64 multiplication which is implemented
in libgcc2.c.
Segfualt due to infinite recursion in i64 soft multiplication
(libgcc2, __muldi3).

LLVM-GCC (for my target) misoptimizes code if -O2 is passed.
It promotes i32 multiplication to int64 multiplication and as the
result my back-end generates __muldi3 call.

I would appreciate if someone can point out where this promotion happens.
And how can I disable it? Thanks in advance.

... some code examples. __muldi3 (defined in llvm-gcc/gcc/libgcc2.c):
w.s.high += ((UWtype) uu.s.low * (UWtype) vv.s.high + (UWtype)
uu.s.high * (UWtype) vv.s.low);

llvm asm compiled with llvm-gcc -O2:
%20 = zext i32 %19 to i64 ; <i64> #uses=1
%21 = zext i32 %16 to i64 ; <i64> #uses=1
%22 = mul i64 %sroa.store.elt3, %u ; <i64> #uses=1
%23 = mul i64 %sroa.store.elt, %v ; <i64> #uses=1
%24 = add i64 %22, %23 ; <i64> #uses=1
%25 = add i64 %24, %21 ; <i64> #uses=1
%26 = shl i64 %25, 32 ; <i64> #uses=1

Regards,
Sergey Y.



More information about the llvm-dev mailing list