Legalizing FrameIndex

Hey all,

I am trying to implement a subtarget for the X86 architecture that only has 64 bit Registers. While running LLC on the IR for a very simple program, llc fails on an assertion that says it doesn't know how to promote ISD::FRAMEINDEX. I've tried to look for why how to promote the frameindex which is stored in a i32 variable to an i64 variable but can't seem to find where this is done. Can anyone help me with this?

Cheers,
Amogh

Hi Amogh,

> I am trying to implement a subtarget for the X86 architecture that only has 64

bit Registers. While running LLC on the IR for a very simple program, llc fails
on an assertion that says it doesn't know how to promote ISD::FRAMEINDEX. I've
tried to look for why how to promote the frameindex which is stored in a i32
variable to an i64 variable but can't seem to find where this is done. Can
anyone help me with this?

probably the easiest way to solve this is to not generate FrameIndex with a
32 bit argument in the first place. That said, in LegalizeIntegerTypes.cpp,
in DAGTypeLegalizer::PromoteIntegerOperand, you can add support for FrameIndex.
The following would probably work:
   (1) get the 64 bit version of the argument using ZExtPromotedInteger or
SExtPromotedInteger (depending on whether indices are unsigned or signed);
   (2) use UpdateNodeOperands to replace the old operand with this one.
There are many examples of similar logic in that file, for example
DAGTypeLegalizer::PromoteIntOp_Shift (though there it is promoting operand
1 and leaving operand 0 alone, while it is the other way round in your case
I think).

Ciao, Duncan.