[llvm-dev] Change prototype for TargetInstrInfo::foldMemoryOperandImpl

Quentin Colombet via llvm-dev llvm-dev at lists.llvm.org
Thu Sep 10 09:13:39 PDT 2020


Would it make sense to attach mayLoad to ARM::tBL instead?

> On Sep 10, 2020, at 4:16 AM, Prathamesh Kulkarni <prathamesh.kulkarni at linaro.org> wrote:
> 
> Hi Quentin,
> I get following error from MachineVerifier:
> # End machine code for function f.
> *** Bad machine code: Missing mayLoad flag ***
> 
> which comes from:
> // Check the MachineMemOperands for basic consistency.
>  for (MachineMemOperand *Op : MI->memoperands()) {
>    if (Op->isLoad() && !MI->mayLoad())
>      report("Missing mayLoad flag", MI);
>    if (Op->isStore() && !MI->mayStore())
>      report("Missing mayStore flag", MI);
>  }
> 
> The MI is ARM::tBL, and it doesn't have mayLoad set, which hits the
> assert in MachineVerifier, since it still has memory operands attached
> by foldMemoryOperand.
> I have attached patch (changes to foldMemoryOperand), that checks if
> the MI returned by foldMemoryOperandImpl has mayLoad or mayLoadOrStore
> property set, and then proceed with adding memory operands, which
> seems to resolve the issue.
> Testing with make check-llvm with enable expensive checks doesn't show
> unexpected failures.
> Do the changes to foldMemoryOperand look OK ?
> 
> Thanks,
> Prathamesh
> 
> On Wed, 9 Sep 2020 at 22:30, Quentin Colombet <qcolombet at apple.com> wrote:
>> 
>> Hi Prathamesh,
>> 
>> What is the machine verifier error that you get?
>> 
>> I am wondering if the issue is not in the machine verifier itself in the sense that it is somewhat reasonable to have calls “document” which memory slot they access.
>> 
>> I am not fan of the idea of removing the addition of the memory operands because:
>> 1. This was part of the interface contract
>> 2. This may prevent unfolding to work
>> 
>> For #1 see that comment on TargetInstrInfo::foldMemoryOperandImpl:
>>  /// Target-independent code in foldMemoryOperand will
>>  /// take care of adding a MachineMemOperand to the newly created instruction.
>> 
>> For #2, I am guessing folding at one point and unfolding later is a rare enough thing that we may not care.
>> 
>> Cheers,
>> -Quentin
>> 
>> On Sep 7, 2020, at 2:17 AM, Prathamesh Kulkarni via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>> 
>> Hi,
>> While working on https://reviews.llvm.org/D79785, we wanted to define
>> foldMemoryOperandImpl hook for Thumb1, that folds load, indirect call
>> to direct call  tLDRpci, tBLX -> tBL. This triggered an assertion
>> error with expensive checks turned on in MachineVerifier because the
>> newly created tBL insn by
>> Thumb1InstrInfo::foldMemoryOperandImpl had memory operands of LoadMI
>> attached by TargetInstrInfo::foldMemoryOperand, which is done
>> unconditionally:
>> 
>> // Copy the memoperands from the load to the folded instruction.
>> if (MI.memoperands_empty()) {
>> NewMI->setMemRefs(MF, LoadMI.memoperands())
>> 
>> In this case, we don't want the memory loads to be added to MI from
>> LoadMI. Should there be some mechanism for target specific
>> foldMemoryOperandImpl hook to signal to foldMemoryOperand to not add
>> memory operands from LoadMI ?
>> 
>> I was wondering if either of these approaches look good ?
>> (a) Make foldMemoryOperandImpl return two values via std::pair or use
>> OUT param (reference). The first is the MI instruction, and second a
>> bool whether or not to add memory operands from LoadMI. This will
>> however require adjusting other targets that override
>> foldMemoryOperandImpl. Would that be OK ?
>> 
>> (b) Define another method in TargetInstrInfo that decides whether or
>> not to add memory operands to the MI returned by
>> foldMemoryOperandImpl, which will not require to modify existing code,
>> but not sure if it's a good idea ?
>> 
>> (c) Make foldMemoryOperandImpl itself add memory operands, which will
>> require somewhat more complicated changes in targets that already
>> implement foldMemoryOperandImpl.
>> 
>> I would be grateful for suggestions on how to proceed.
>> 
>> Thanks,
>> Prathamesh
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> 
>> 
> <foldmemoperand.diff>



More information about the llvm-dev mailing list