Reed, Couldn't you also use instruction scheduling classes and specify that the second instruction has a bypass from the first instruction? The scheduler should always schedule them together in that case. Micah> -----Original Message----- > From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On > Behalf Of reed kotler > Sent: Tuesday, September 17, 2013 3:59 PM > To: Owen Anderson > Cc: llvmdev Mailing List > Subject: Re: [LLVMdev] forcing two instructions to be together > > On 09/17/2013 03:52 PM, Owen Anderson wrote: > > +the list again > > On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote: > > > >> On 09/17/2013 03:46 PM, Owen Anderson wrote: > >>> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: > >>> > >>>> Is there any way, except for using bundles, to force two instructions to be > sequentially executed? > >>> What level of codegen are you working at? There are various mechanisms > that can be applied, depending on exactly what the constraints are that you > need to preserve. > >>> > >>> -Owen > >> I have two machine instructions that I need to be together. > >> > >> BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) > >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); > >> BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) > >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); > >> > >> It's in Mips16ISelDagToDag.cpp > >> > >> these two have to be together because they are both part of a complex pc > relative calculation. > >> > >> I have not used bundles yet and was just looking for an easy way to join > these two. > > Bundles is one way you can go. Another is to use a pseudo instruction that is > broken up immediately before (or during!) MC emission. > > > > -Owen > I just tried this but something is wrong here. Well, I have not used bundles at > all. > I just know how they work conceptually. This compiled okay but I got some > constraint errors. > > MIBundleBuilder(MBB, I) > .append(BuildMI(MF, DL, TII.get(Mips::LiRxImmAlignX16), V0) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI)) > .append(BuildMI(MF, DL, TII.get(Mips::AddiuRxPcImmX16), V1) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO)); > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
On 09/17/2013 04:51 PM, Micah Villmow wrote:> Reed, > Couldn't you also use instruction scheduling classes and specify that the second instruction has a bypass from the first instruction? The scheduler should always schedule them together in that case. > > Micah >I'm not sure exactly what you mean. Can you point me to an example of that? TIA. Reed>> -----Original Message----- >> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On >> Behalf Of reed kotler >> Sent: Tuesday, September 17, 2013 3:59 PM >> To: Owen Anderson >> Cc: llvmdev Mailing List >> Subject: Re: [LLVMdev] forcing two instructions to be together >> >> On 09/17/2013 03:52 PM, Owen Anderson wrote: >>> +the list again >>> On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote: >>> >>>> On 09/17/2013 03:46 PM, Owen Anderson wrote: >>>>> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: >>>>> >>>>>> Is there any way, except for using bundles, to force two instructions to be >> sequentially executed? >>>>> What level of codegen are you working at? There are various mechanisms >> that can be applied, depending on exactly what the constraints are that you >> need to preserve. >>>>> -Owen >>>> I have two machine instructions that I need to be together. >>>> >>>> BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) >>>> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); >>>> BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) >>>> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); >>>> >>>> It's in Mips16ISelDagToDag.cpp >>>> >>>> these two have to be together because they are both part of a complex pc >> relative calculation. >>>> I have not used bundles yet and was just looking for an easy way to join >> these two. >>> Bundles is one way you can go. Another is to use a pseudo instruction that is >> broken up immediately before (or during!) MC emission. >>> -Owen >> I just tried this but something is wrong here. Well, I have not used bundles at >> all. >> I just know how they work conceptually. This compiled okay but I got some >> constraint errors. >> >> MIBundleBuilder(MBB, I) >> .append(BuildMI(MF, DL, TII.get(Mips::LiRxImmAlignX16), V0) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI)) >> .append(BuildMI(MF, DL, TII.get(Mips::AddiuRxPcImmX16), V1) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO)); >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
I used the A9 schedule as an example: http://llvm.org/svn/llvm-project/llvm/trunk/lib/Target/ARM/ARMScheduleA9.td The documentation could use more clarity, but this is how I was able to do it to always get two specific instructions to be scheduled together. ________________________________________ From: reed kotler [rkotler at mips.com] Sent: Tuesday, September 17, 2013 8:54 PM To: Micah Villmow Cc: Owen Anderson; llvmdev Mailing List Subject: Re: [LLVMdev] forcing two instructions to be together On 09/17/2013 04:51 PM, Micah Villmow wrote:> Reed, > Couldn't you also use instruction scheduling classes and specify that the second instruction has a bypass from the first instruction? The scheduler should always schedule them together in that case. > > Micah >I'm not sure exactly what you mean. Can you point me to an example of that? TIA. Reed>> -----Original Message----- >> From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On >> Behalf Of reed kotler >> Sent: Tuesday, September 17, 2013 3:59 PM >> To: Owen Anderson >> Cc: llvmdev Mailing List >> Subject: Re: [LLVMdev] forcing two instructions to be together >> >> On 09/17/2013 03:52 PM, Owen Anderson wrote: >>> +the list again >>> On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote: >>> >>>> On 09/17/2013 03:46 PM, Owen Anderson wrote: >>>>> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: >>>>> >>>>>> Is there any way, except for using bundles, to force two instructions to be >> sequentially executed? >>>>> What level of codegen are you working at? There are various mechanisms >> that can be applied, depending on exactly what the constraints are that you >> need to preserve. >>>>> -Owen >>>> I have two machine instructions that I need to be together. >>>> >>>> BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) >>>> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); >>>> BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) >>>> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); >>>> >>>> It's in Mips16ISelDagToDag.cpp >>>> >>>> these two have to be together because they are both part of a complex pc >> relative calculation. >>>> I have not used bundles yet and was just looking for an easy way to join >> these two. >>> Bundles is one way you can go. Another is to use a pseudo instruction that is >> broken up immediately before (or during!) MC emission. >>> -Owen >> I just tried this but something is wrong here. Well, I have not used bundles at >> all. >> I just know how they work conceptually. This compiled okay but I got some >> constraint errors. >> >> MIBundleBuilder(MBB, I) >> .append(BuildMI(MF, DL, TII.get(Mips::LiRxImmAlignX16), V0) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI)) >> .append(BuildMI(MF, DL, TII.get(Mips::AddiuRxPcImmX16), V1) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO)); >> >> >> >> _______________________________________________ >> LLVM Developers mailing list >> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev