[cfe-dev] ABIArgInfo question for RISC-V and hard float abi

Roger Ferrer Ibáñez via cfe-dev cfe-dev at lists.llvm.org
Thu Jun 21 09:48:25 PDT 2018


Dear all,

in RISC-V 32-bit, the base calling convention states that integers
smaller than 32-bit are sign or zero extended according to their
"signedness". So something like the definition below

void foo(short s16, unsigned short u16) { }

is emitted in IR as

void @foo(i16 signext %s16, i16 zeroext %u16)

Now, looking at the RISC-V hard float ABI it states that a case like
the one below

struct float_and_short_t {
   float a;
   short b;
}

where there are enough available registers, 'a' goes into a
floating-point register and 'b' goes into an integer register and the
appropriate sign/zero extension happens. Using ABIArgInfo::getExpand
seems to do exactly what I want except there is no way to state that
some of the expanded types may need to be sign/zero extended.

So, a case like the following

struct float_and_short_t
{
    float a;
    short b;
};
void bar(struct float_and_short_t fs, short i16) { }

the emitted IR is

void @bar(float %fs.0, i16 %fs.1, i16 signext %i16)

where %fs.1 lacks the attribute signext (%i16 does correctly have it).

My understanding is that signext/zeroext are attributes of the
arguments not llvm;:Type. This would exclude
ABIArgInfo::getCoerceAndExpand. Reading the code in CodeGen/CGCall.cpp
apparently only ABIArgInfo::getExtend (not to be confused with
getExpand) is able to set signext/zeroext. I haven't found any example
in CodeGen/TargetInfo.cpp for some other target where a similar case
happens.

I wonder what would be the best way to achieve this. In this case I
know exactly the size of the expansion so I could define a "companion"
sequence (i.e. a smallvector or similar) that relates to every element
expanded and allows me to set the proper attribute and set it as an
attribute of the ABIArgInfo. Perhaps there is a better way.

Thoughts, suggestions?

Thanks a lot,

-- 
Roger Ferrer Ibáñez



More information about the cfe-dev mailing list