<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>