<div dir="ltr">Sorry to point this out now, but taking a bool in/out pointer is some fairly awkward API. Can we do something else here? <div><br></div><div>Thanks!</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Jan 17, 2021 at 8:01 PM ChenZheng via Phabricator <<a href="mailto:reviews@reviews.llvm.org">reviews@reviews.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This revision was automatically updated to reflect the committed changes.<br>
Closed by commit rG3bdf4507b663: [NFC] [TargetRegisterInfo] add one use check to lookThruCopyLike. (authored by shchenz).<br>
<br>
Repository:<br>
  rG LLVM Github Monorepo<br>
<br>
CHANGES SINCE LAST ACTION<br>
  <a href="https://reviews.llvm.org/D92069/new/" rel="noreferrer" target="_blank">https://reviews.llvm.org/D92069/new/</a><br>
<br>
<a href="https://reviews.llvm.org/D92069" rel="noreferrer" target="_blank">https://reviews.llvm.org/D92069</a><br>
<br>
Files:<br>
  llvm/include/llvm/CodeGen/TargetRegisterInfo.h<br>
  llvm/lib/CodeGen/TargetRegisterInfo.cpp<br>
<br>
<br>
Index: llvm/lib/CodeGen/TargetRegisterInfo.cpp<br>
===================================================================<br>
--- llvm/lib/CodeGen/TargetRegisterInfo.cpp<br>
+++ llvm/lib/CodeGen/TargetRegisterInfo.cpp<br>
@@ -510,13 +510,19 @@<br>
   return getRegSizeInBits(*RC);<br>
 }<br>
<br>
-Register<br>
-TargetRegisterInfo::lookThruCopyLike(Register SrcReg,<br>
-                                     const MachineRegisterInfo *MRI) const {<br>
+Register TargetRegisterInfo::lookThruCopyLike(Register SrcReg,<br>
+                                              const MachineRegisterInfo *MRI,<br>
+                                              bool *AllDefHaveOneUser) const {<br>
+  if (AllDefHaveOneUser)<br>
+    *AllDefHaveOneUser = true;<br>
+<br>
   while (true) {<br>
     const MachineInstr *MI = MRI->getVRegDef(SrcReg);<br>
-    if (!MI->isCopyLike())<br>
+    if (!MI->isCopyLike()) {<br>
+      if (AllDefHaveOneUser && !MRI->hasOneNonDBGUse(SrcReg))<br>
+        *AllDefHaveOneUser = false;<br>
       return SrcReg;<br>
+    }<br>
<br>
     Register CopySrcReg;<br>
     if (MI->isCopy())<br>
@@ -526,8 +532,11 @@<br>
       CopySrcReg = MI->getOperand(2).getReg();<br>
     }<br>
<br>
-    if (!CopySrcReg.isVirtual())<br>
+    if (!CopySrcReg.isVirtual()) {<br>
+      if (AllDefHaveOneUser)<br>
+        *AllDefHaveOneUser = false;<br>
       return CopySrcReg;<br>
+    }<br>
<br>
     SrcReg = CopySrcReg;<br>
   }<br>
Index: llvm/include/llvm/CodeGen/TargetRegisterInfo.h<br>
===================================================================<br>
--- llvm/include/llvm/CodeGen/TargetRegisterInfo.h<br>
+++ llvm/include/llvm/CodeGen/TargetRegisterInfo.h<br>
@@ -410,10 +410,13 @@<br>
<br>
   /// Returns the original SrcReg unless it is the target of a copy-like<br>
   /// operation, in which case we chain backwards through all such operations<br>
-  /// to the ultimate source register.  If a physical register is encountered,<br>
+  /// to the ultimate source register. If a physical register is encountered,<br>
   /// we stop the search.<br>
+  /// If one definition in the copy chain has multiple uses, set \p<br>
+  /// AllDefHaveOneUser to false, otherwise set it to true.<br>
   virtual Register lookThruCopyLike(Register SrcReg,<br>
-                                    const MachineRegisterInfo *MRI) const;<br>
+                                    const MachineRegisterInfo *MRI,<br>
+                                    bool *AllDefHaveOneUser = nullptr) const;<br>
<br>
   /// Return a null-terminated list of all of the callee-saved registers on<br>
   /// this target. The register should be in the order of desired callee-save<br>
<br>
<br>
</blockquote></div>