[llvm-dev] registers and sub registers - duplicate keys to match on
Quentin Colombet via llvm-dev
llvm-dev at lists.llvm.org
Fri Jan 20 09:50:55 PST 2017
Hi Edo,
I don’t see anything strange at first glance.
I would suggest to reduce your td file and then investigate the issue and eventually post a bug report if you don’t figure it out.
If you found the problem in the meantime, post the solution here, that may help someone else :).
Thanks,
-Quentin
> On Jan 13, 2017, at 8:52 AM, Edoardo Fusella via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>
> 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
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
More information about the llvm-dev
mailing list