Bad codegen for ARM (and maybe others) when optimizing
Dan Olson via digitalmars-d-ldc
digitalmars-d-ldc at puremagic.com
Fri Feb 6 07:03:11 PST 2015
Dan Olson <zans.is.for.cans at yahoo.com> writes:
>
> I have been looking at IR. The bug is connected to using the byval
> attribute. I checked out clang's IR and it does not use byval for
> structs. It passes structs as an array. I am wondering if LDC could
> use a abi-arm.cpp to generate something like clang.
>
I think an ARM specific abi class is the right solution. On a whim, I tried one small change in abi.cpp
bool passByVal(Type* t)
{
// was
// return t->toBasetype()->ty == Tstruct;
return false;
}
This gets rid of LLVM byval attribute and fixes this codegen problem. The generated instructions are similar to clang. The parameter is not an array like clang, it is the IR struct type as a value, but it works.
"%badopt.A" instead of "%badopt.A* byval"
Another thing I noticed about clang is that structs that fit in 32-bits are returned directly in r0 instead of an sret parameter. There may be more, I need to study clang.
--
Dan
More information about the digitalmars-d-ldc
mailing list