[llvm-dev] Questions about relaxation in MC

Konstantin Schwarz via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 10 04:34:33 PST 2020


Thanks for highlighting that patch!

Using instruction bundles indeed sounds interesting, as it seems more 
flexible. We'll see how far we get with this.

Konstantin

On 08.12.2020 16:10, Ryan Taylor wrote:
> We had a similar issue with a hardware bug where we changed the 32 bit 
> branch instruction encoding into a 64 encoding, the other 32 bit being 
> a NOP: 
> https://reviews.llvm.org/rG9ab812d4752b2a1442426db2ccc17dc95d12eb04 
> <https://reviews.llvm.org/rG9ab812d4752b2a1442426db2ccc17dc95d12eb04>
>
> We also looked at using a bundle instead of this encoding method as we 
> thought that might have been cleaner but that's a bit more complex, 
> not sure if either of these help you.
>
> On Tue, Dec 8, 2020 at 9:47 AM Konstantin Schwarz via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>
>     Hi Kai,
>
>     did you make any progress on this topic?
>     We have a similar case in our backend, where conditional branches
>     have only a limited range.
>     So for hand-written assembly, we would like to relax using the
>     scheme you describe: invert the branch condition and add an
>     unconditional jump.
>
>     As you've already discovered, the relaxInstruction callback
>     doesn't allow to insert additional instructions, but requires the
>     relaxed instruction to be returned.
>     We could work around that by relaxing to a pseudo instruction
>     whose size is the combined size of the conditional branch + jump
>     and expand it later to the actual instructions, but that seems
>     unnecessarily complex.
>
>     Did you come up with a better solution?
>
>     Konstantin
>
>     On 07.10.2020 17:20, Philip Reames via llvm-dev wrote:
>>
>>     If done in the assembler, this is branch relaxation.  You need to
>>     implement the calls backs mayNeedRelaxation, and relaxInstruction
>>     on your target MCAsmBackend.  The iteration relaxation logic
>>     already exists, see the generic MC code.
>>
>>     Philip
>>
>>     On 10/5/20 8:20 PM, Kai Wang via llvm-dev wrote:
>>>     Correct the title.
>>>
>>>     On Tue, Oct 6, 2020 at 11:11 AM Kai Wang <kai.wang at sifive.com
>>>     <mailto:kai.wang at sifive.com>> wrote:
>>>
>>>         Hi all,
>>>
>>>         In RISC-V ISA, the range of conditional branches is within
>>>         4KiB. In current implementation, if the branch target is out
>>>         of range, LLVM MC will issue an error message to tell users
>>>         it could not resolve the fixup record. I have compared the
>>>         result with the GNU assembler. GNU assembler will convert
>>>         the branch to inverted one plus jump to make the branch
>>>         possible. The range of unconditional jump is 1MiB. It looks like
>>>
>>>         ##########################
>>>         bne a0, a1, FAR_BRANCH
>>>>>>         FAR_BRANCH:
>>>
>>>         converted to
>>>
>>>         ##########################
>>>         beq a0, a1, SKIP_J
>>>         j FAR_BRANCH
>>>         SKIP_J:
>>>>>>         FAR_BRANCH:
>>>
>>>         I found there is a target hook, relaxInstruction, that tries
>>>         to achieve the similar goal. However, the target hook only
>>>         replaces one MCInst with another one with a larger branch
>>>         range. For example, c.beqz will be converted to beq in the
>>>         RISC-V backend if the fixup value is out of range. There
>>>         seems no target hook to convert one MCInst to a complex
>>>         pattern in LLVM MC. Do I miss something obvious?
>>>
>>>         I found there is a target hook, finishLayout, to manipulate
>>>         the code generated. Does it make sense to implement the
>>>         feature in finishLayout? Or is there any better idea to
>>>         achieve the conversion? Thanks a lot.
>>>
>>>         Best,
>>>         Kai
>>>
>>>
>>>     _______________________________________________
>>>     LLVM Developers mailing list
>>>     llvm-dev at lists.llvm.org  <mailto:llvm-dev at lists.llvm.org>
>>>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev  <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>>
>>     _______________________________________________
>>     LLVM Developers mailing list
>>     llvm-dev at lists.llvm.org  <mailto:llvm-dev at lists.llvm.org>
>>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev  <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     <https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20201210/e6276ddd/attachment.html>


More information about the llvm-dev mailing list