[PATCH] D92069: [NFC] [TargetRegisterInfo] add one use check to lookThruCopyLike.

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Sun Jan 17 17:18:26 PST 2021


Sorry to point this out now, but taking a bool in/out pointer is some
fairly awkward API. Can we do something else here?

Thanks!

-eric

On Sun, Jan 17, 2021 at 8:01 PM ChenZheng via Phabricator <
reviews at reviews.llvm.org> wrote:

> This revision was automatically updated to reflect the committed changes.
> Closed by commit rG3bdf4507b663: [NFC] [TargetRegisterInfo] add one use
> check to lookThruCopyLike. (authored by shchenz).
>
> Repository:
>   rG LLVM Github Monorepo
>
> CHANGES SINCE LAST ACTION
>   https://reviews.llvm.org/D92069/new/
>
> https://reviews.llvm.org/D92069
>
> Files:
>   llvm/include/llvm/CodeGen/TargetRegisterInfo.h
>   llvm/lib/CodeGen/TargetRegisterInfo.cpp
>
>
> Index: llvm/lib/CodeGen/TargetRegisterInfo.cpp
> ===================================================================
> --- llvm/lib/CodeGen/TargetRegisterInfo.cpp
> +++ llvm/lib/CodeGen/TargetRegisterInfo.cpp
> @@ -510,13 +510,19 @@
>    return getRegSizeInBits(*RC);
>  }
>
> -Register
> -TargetRegisterInfo::lookThruCopyLike(Register SrcReg,
> -                                     const MachineRegisterInfo *MRI)
> const {
> +Register TargetRegisterInfo::lookThruCopyLike(Register SrcReg,
> +                                              const MachineRegisterInfo
> *MRI,
> +                                              bool *AllDefHaveOneUser)
> const {
> +  if (AllDefHaveOneUser)
> +    *AllDefHaveOneUser = true;
> +
>    while (true) {
>      const MachineInstr *MI = MRI->getVRegDef(SrcReg);
> -    if (!MI->isCopyLike())
> +    if (!MI->isCopyLike()) {
> +      if (AllDefHaveOneUser && !MRI->hasOneNonDBGUse(SrcReg))
> +        *AllDefHaveOneUser = false;
>        return SrcReg;
> +    }
>
>      Register CopySrcReg;
>      if (MI->isCopy())
> @@ -526,8 +532,11 @@
>        CopySrcReg = MI->getOperand(2).getReg();
>      }
>
> -    if (!CopySrcReg.isVirtual())
> +    if (!CopySrcReg.isVirtual()) {
> +      if (AllDefHaveOneUser)
> +        *AllDefHaveOneUser = false;
>        return CopySrcReg;
> +    }
>
>      SrcReg = CopySrcReg;
>    }
> Index: llvm/include/llvm/CodeGen/TargetRegisterInfo.h
> ===================================================================
> --- llvm/include/llvm/CodeGen/TargetRegisterInfo.h
> +++ llvm/include/llvm/CodeGen/TargetRegisterInfo.h
> @@ -410,10 +410,13 @@
>
>    /// Returns the original SrcReg unless it is the target of a copy-like
>    /// operation, in which case we chain backwards through all such
> operations
> -  /// to the ultimate source register.  If a physical register is
> encountered,
> +  /// to the ultimate source register. If a physical register is
> encountered,
>    /// we stop the search.
> +  /// If one definition in the copy chain has multiple uses, set \p
> +  /// AllDefHaveOneUser to false, otherwise set it to true.
>    virtual Register lookThruCopyLike(Register SrcReg,
> -                                    const MachineRegisterInfo *MRI) const;
> +                                    const MachineRegisterInfo *MRI,
> +                                    bool *AllDefHaveOneUser = nullptr)
> const;
>
>    /// Return a null-terminated list of all of the callee-saved registers
> on
>    /// this target. The register should be in the order of desired
> callee-save
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210117/7e798894/attachment-0001.html>


More information about the llvm-commits mailing list