<div dir="ltr"><div><div><div><div>Hi,<br><br></div>I am trying to get llvm working for an architecture that has 64bit registers, but 32bit addresses.<br></div>Because of that, I want the pointers to also be 32bit, although they will live in a 64 bit register.<br>
<br></div><div>On the frontend, I do not encounter any issues, but when I provide a<br> ...<br> "p:32:32:32"<br> ...<br></div><div>DataLayout specification to the backend, things get ugly:<br></div><div>- SelectionDag is producing a mix of 64bit and 32bit nodes, and it seems that a number of<br>
necessary legalizations/promotions are missing.<br><br></div><div>After adding support for 'PromoteIntRes_GlobalAddress(...)', I get a failure, because a 'store' node now has a mix of operands:<br></div><div>
- some of the operands were already 'i64' from the beginning,<br></div><div>- others were 'i32' (due to the 32bit pointers) and have been promoted to 'i64'<br><br></div><div>Because of the latter, the 'PromoteIntOp_STORE' is called. This uses 'GetPromotedInteger' to access the operands.<br>
</div><div>But, GetPromotedInteger fails if the operand was not promoted. So it fails on the operands of the 'store' that were already legal (i64).<br><br></div><div>What would be the recommended way to fix this ?<br>
</div><div>(Or did I miss something, and should 32bit pointers on a 64bit architecture be done in a completely different way)<br></div><div><br></div><div>Greetings,</div><br></div>Jeroen Dobbelaere<br><br></div>