[llvm-dev] registers and sub registers - duplicate keys to match on

Edoardo Fusella via llvm-dev llvm-dev at lists.llvm.org
Fri Jan 13 09:13:00 PST 2017


Hello
I'm dealing with an implementation from scratch of a backend. However,
although I reached some first good results, now I'm facing a quite strange
issue that I'm not able to figure out.

In my Arch0RegisterInfo.td, I have:

def sub_even : SubRegIndex<32>;
def sub_odd  : SubRegIndex<32, 32>;

class Arch0GPRReg<bits<16> Enc, string n> : Arch0Reg<Enc, n>;
class Arch064GPRReg<bits<16> Enc, string n, list<Register> subregs>
  : Arch0RegWithSubRegs<Enc, n, subregs> {
  let SubRegIndices = [sub_even, sub_odd];
  let CoveredBySubRegs = 1;
}

and then:

foreach i = 0-57 in {
    def S#i : Arch0GPRReg<i, "s"#i>, DwarfRegNum<[i]>;
}
foreach i = 0-28 in {
  def S#!shl(i, 1)#_S#!add(!shl(i, 1), 1) : Arch064GPRReg<!shl(i, 1),
"s"#!shl(i, 1),
               [!cast<Arch0GPRReg>("S"#!shl(i, 1)),
                !cast<Arch0GPRReg>("S"#!add(!shl(i, 1), 1))]>;
}

The two loops will generate something like this:
def S0 : Arch0GPRReg<0, "s0">, DwarfRegNum<[0]>;
def S1 : Arch0GPRReg<1, "s1">, DwarfRegNum<[1]>;
def S2 : Arch0GPRReg<2, "s2">, DwarfRegNum<[2]>;
def S3 : Arch0GPRReg<3, "s3">, DwarfRegNum<[3]>;
...

def S0_S1 : Arch064GPRReg<0, "s0", [S0, S1]>;
def S2_S3 : Arch064GPRReg<2, "s2", [S2, S3]>;
...


I would like to have 32 bit general purpose registers that could be taken
in pairs to have 64 bit registers.

However, when I compile in debug mode, I got the following error message:
Assertion `Matches.size() == 1 && "Had duplicate keys to match on"' failed.

This depends on the fact that the method emitMatchRegisterName and in
particular the method EmitStringMatcherForChar found different registers
with the same names.

However, I have seen that this is quite common in many other backends
(sparca, mips, etc..).

Can somebody help me to figure out what is wrong with my code?

Thank you,
Edo
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170113/898adb68/attachment.html>


More information about the llvm-dev mailing list