<div dir="ltr"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/38846" class="cremed">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/38846</a><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 19 Feb 2020 at 13:00, Vitaly Buka <<a href="mailto:vitalybuka@google.com">vitalybuka@google.com</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"><div dir="ltr">This patch introduces memory bug:<div><br></div><div><pre style="font-family:"Courier New",courier,monotype,monospace;color:rgb(0,0,0);font-size:medium"><span>Testing:  0.. 10.. 20.. 30.. 40.
FAIL: LLVM :: CodeGen/WebAssembly/PR40267.ll (17076 of 36117)
******************** TEST 'LLVM :: CodeGen/WebAssembly/PR40267.ll' FAILED ********************
Script:
--
: 'RUN: at line 1';   /b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/llc < /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/test/CodeGen/WebAssembly/PR40267.ll -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers
--
Exit Code: 1

Command Output (stderr):
--
=================================================================
==16208==ERROR: AddressSanitizer: use-after-poison on address 0x621000036798 at pc 0x000002d6b786 bp 0x7ffd1ab466b0 sp 0x7ffd1ab466a8
READ of size 8 at 0x621000036798 thread T0
    #0 0x2d6b785 in operands_begin /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/CodeGen/MachineInstr.h:486:42
    #1 0x2d6b78</span><span>5 in defs /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/CodeGen/MachineInstr.h:515:23
</span><span>    #2 0x2d6b785 in (anonymous namespace)::WebAssemblyRegStackify::runOnMachineFunction(llvm::MachineFunction&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyRegStackify.cpp:926:37
    #3 0x4581dfd in llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:73:13
    #4 0x50ba4b0 in llvm::FPPassManager::runOnFunction(llvm::Function&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1482:27
    #5 0x50bac07 in llvm::FPPassManager::runOnModule(llvm::Module&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1518:16
    #6 0x50bba71 in runOnModule /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1583:27
    #7 0x50bba71 in llvm::legacy::PassManagerImpl::run(llvm::Module&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1695:44
    #8 0x9802a6 in compileModule(char**, llvm::LLVMContext&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llc/llc.cpp:617:8
    #9 0x979a1f in main /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llc/llc.cpp:356:22
    #10 0x7f1f109472e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
    #11 0x8d20e9 in _start (/b/sanitizer-x86_64-linux-fast/build/llvm_build_asan/bin/llc+0x8d20e9)

0x621000036798 is located 2712 bytes inside of 4096-byte region [0x621000035d00,0x621000036d00)
allocated by thread T0 here:
    #0 0x947cd4 in malloc /b/s/w/ir/cache/builder/src/third_party/llvm/compiler-rt/lib/asan/asan_malloc_linux.cpp:145:3
    #1 0xc1a70a in safe_malloc /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/MemAlloc.h:26:18
    #2 0xc1a70a in Allocate /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/AllocatorBase.h:85:12
    #3 0xc1a70a in llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul, 128ul>::StartNewSlab() /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/Allocator.h:335:31
    #4 0xc1a485 in llvm::BumpPtrAllocatorImpl<llvm::MallocAllocator, 4096ul, 4096ul, 128ul>::Allocate(unsigned long, llvm::Align) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/Allocator.h:188:5
    #5 0x455c6f3 in Allocate /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/Allocator.h:202:12
    #6 0x455c6f3 in operator new<llvm::MallocAllocator, 4096, 4096, 128> /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/include/llvm/Support/Allocator.h:446:20
    #7 0x455c6f3 in llvm::MachineFunction::init() /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/CodeGen/MachineFunction.cpp:158:15
    #8 0x45f1e12 in llvm::MachineModuleInfo::getOrCreateMachineFunction(llvm::Function const&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/CodeGen/MachineModuleInfo.cpp:250:14
    #9 0x4581c2d in llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:45:29
    #10 0x50ba4b0 in llvm::FPPassManager::runOnFunction(llvm::Function&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1482:27
    #11 0x50bac07 in llvm::FPPassManager::runOnModule(llvm::Module&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1518:16
    #12 0x50bba71 in runOnModule /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1583:27
    #13 0x50bba71 in llvm::legacy::PassManagerImpl::run(llvm::Module&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1695:44
    #14 0x9802a6 in compileModule(char**, llvm::LLVMContext&) /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llc/llc.cpp:617:8
    #15 0x979a1f in main /b/sanitizer-x86_64-linux-fast/build/llvm-project/llvm/tools/llc/llc.cpp:356:22
    #16 0x7f1f109472e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)</span></pre></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 18 Feb 2020 at 14:55, Aditya Nandakumar via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.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"><br>
Author: Aditya Nandakumar<br>
Date: 2020-02-18T14:54:57-08:00<br>
New Revision: b91d9ec0bb8caedcdd1ddf0506fc19d6c55efae3<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/b91d9ec0bb8caedcdd1ddf0506fc19d6c55efae3" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/b91d9ec0bb8caedcdd1ddf0506fc19d6c55efae3</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/b91d9ec0bb8caedcdd1ddf0506fc19d6c55efae3.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/b91d9ec0bb8caedcdd1ddf0506fc19d6c55efae3.diff</a><br>
<br>
LOG: [GlobalISel]: Fix some non determinism exposed in CSE due to not notifying observers about mutations + add verification for CSE<br>
<br>
<a href="https://reviews.llvm.org/D67133" rel="noreferrer" target="_blank">https://reviews.llvm.org/D67133</a><br>
<br>
While investigating some non determinism (CSE doesn't produce wrong<br>
code, it just doesn't CSE some times) in GISel CSE on an out of tree<br>
target, I realized that the core issue was that there were lots of code<br>
that mutates (setReg, setRegClass etc), but doesn't notify observers<br>
(CSE in this case but this could be any other observer). In order to<br>
make the Observer be available in various parts of code and to avoid<br>
having to thread it through various API, the MachineFunction now has the<br>
observer as field. This allows it to be easily used in helper functions<br>
such as constrainOperandRegClass.<br>
Also added some invariant verification method in CSEInfo which can<br>
catch these issues (when CSE is enabled).<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/include/llvm/CodeGen/GlobalISel/CSEInfo.h<br>
    llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h<br>
    llvm/include/llvm/CodeGen/MachineFunction.h<br>
    llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp<br>
    llvm/lib/CodeGen/GlobalISel/GISelChangeObserver.cpp<br>
    llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp<br>
    llvm/lib/CodeGen/GlobalISel/Legalizer.cpp<br>
    llvm/lib/CodeGen/GlobalISel/Utils.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/CodeGen/GlobalISel/CSEInfo.h b/llvm/include/llvm/CodeGen/GlobalISel/CSEInfo.h<br>
index 13082e440d40..a3720eb35668 100644<br>
--- a/llvm/include/llvm/CodeGen/GlobalISel/CSEInfo.h<br>
+++ b/llvm/include/llvm/CodeGen/GlobalISel/CSEInfo.h<br>
@@ -120,6 +120,8 @@ class GISelCSEInfo : public GISelChangeObserver {<br>
<br>
   void setMF(MachineFunction &MF);<br>
<br>
+  Error verify();<br>
+<br>
   /// Records a newly created inst in a list and lazily insert it to the CSEMap.<br>
   /// Sometimes, this method might be called with a partially constructed<br>
   /// MachineInstr,<br>
<br>
diff  --git a/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h b/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h<br>
index e5691cb35174..d8fe4b3103db 100644<br>
--- a/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h<br>
+++ b/llvm/include/llvm/CodeGen/GlobalISel/GISelChangeObserver.h<br>
@@ -101,7 +101,7 @@ class GISelObserverWrapper : public MachineFunction::Delegate,<br>
   void MF_HandleRemoval(MachineInstr &MI) override { erasingInstr(MI); }<br>
 };<br>
<br>
-/// A simple RAII based CSEInfo installer.<br>
+/// A simple RAII based Delegate installer.<br>
 /// Use this in a scope to install a delegate to the MachineFunction and reset<br>
 /// it at the end of the scope.<br>
 class RAIIDelegateInstaller {<br>
@@ -113,5 +113,27 @@ class RAIIDelegateInstaller {<br>
   ~RAIIDelegateInstaller();<br>
 };<br>
<br>
+/// A simple RAII based Observer installer.<br>
+/// Use this in a scope to install the Observer to the MachineFunction and reset<br>
+/// it at the end of the scope.<br>
+class RAIIMFObserverInstaller {<br>
+  MachineFunction &MF;<br>
+<br>
+public:<br>
+  RAIIMFObserverInstaller(MachineFunction &MF, GISelChangeObserver &Observer);<br>
+  ~RAIIMFObserverInstaller();<br>
+};<br>
+<br>
+/// Class to install both of the above.<br>
+class RAIIMFObsDelInstaller {<br>
+  RAIIDelegateInstaller DelI;<br>
+  RAIIMFObserverInstaller ObsI;<br>
+<br>
+public:<br>
+  RAIIMFObsDelInstaller(MachineFunction &MF, GISelObserverWrapper &Wrapper)<br>
+      : DelI(MF, &Wrapper), ObsI(MF, Wrapper) {}<br>
+  ~RAIIMFObsDelInstaller() = default;<br>
+};<br>
+<br>
 } // namespace llvm<br>
 #endif<br>
<br>
diff  --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h<br>
index 1ec1b4b2864f..171abf05d67e 100644<br>
--- a/llvm/include/llvm/CodeGen/MachineFunction.h<br>
+++ b/llvm/include/llvm/CodeGen/MachineFunction.h<br>
@@ -72,6 +72,7 @@ class TargetRegisterClass;<br>
 class TargetSubtargetInfo;<br>
 struct WasmEHFuncInfo;<br>
 struct WinEHFuncInfo;<br>
+class GISelChangeObserver;<br>
<br>
 template <> struct ilist_alloc_traits<MachineBasicBlock> {<br>
   void deleteNode(MachineBasicBlock *MBB);<br>
@@ -396,6 +397,7 @@ class MachineFunction {<br>
<br>
 private:<br>
   Delegate *TheDelegate = nullptr;<br>
+  GISelChangeObserver *Observer = nullptr;<br>
<br>
   using CallSiteInfoMap = DenseMap<const MachineInstr *, CallSiteInfo>;<br>
   /// Map a call instruction to call site arguments forwarding info.<br>
@@ -444,6 +446,10 @@ class MachineFunction {<br>
     TheDelegate = delegate;<br>
   }<br>
<br>
+  void setObserver(GISelChangeObserver *O) { Observer = O; }<br>
+<br>
+  GISelChangeObserver *getObserver() const { return Observer; }<br>
+<br>
   MachineModuleInfo &getMMI() const { return MMI; }<br>
   MCContext &getContext() const { return Ctx; }<br>
<br>
<br>
diff  --git a/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp b/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp<br>
index b12407a4a4f4..0e4fa219d988 100644<br>
--- a/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp<br>
+++ b/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp<br>
@@ -261,6 +261,39 @@ void GISelCSEInfo::releaseMemory() {<br>
 #endif<br>
 }<br>
<br>
+Error GISelCSEInfo::verify() {<br>
+#ifndef NDEBUG<br>
+  handleRecordedInsts();<br>
+  // For each instruction in map from MI -> UMI,<br>
+  // Profile(MI) and make sure UMI is found for that profile.<br>
+  for (auto &It : InstrMapping) {<br>
+    FoldingSetNodeID TmpID;<br>
+    GISelInstProfileBuilder(TmpID, *MRI).addNodeID(It.first);<br>
+    void *InsertPos;<br>
+    UniqueMachineInstr *FoundNode =<br>
+        CSEMap.FindNodeOrInsertPos(TmpID, InsertPos);<br>
+    if (FoundNode != It.second)<br>
+      return createStringError(std::errc::not_supported,<br>
+                               "CSEMap mismatch, InstrMapping has MIs without "<br>
+                               "corresponding Nodes in CSEMap");<br>
+  }<br>
+<br>
+  // For every node in the CSEMap, make sure that the InstrMapping<br>
+  // points to it.<br>
+  for (auto It = CSEMap.begin(), End = CSEMap.end(); It != End; ++It) {<br>
+    const UniqueMachineInstr &UMI = *It;<br>
+    if (!InstrMapping.count(UMI.MI))<br>
+      return createStringError(std::errc::not_supported,<br>
+                               "Node in CSE without InstrMapping", UMI.MI);<br>
+<br>
+    if (InstrMapping[UMI.MI] != &UMI)<br>
+      return createStringError(std::make_error_code(std::errc::not_supported),<br>
+                               "Mismatch in CSE mapping");<br>
+  }<br>
+#endif<br>
+  return Error::success();<br>
+}<br>
+<br>
 void GISelCSEInfo::print() {<br>
   LLVM_DEBUG(for (auto &It<br>
                   : OpcodeHitTable) {<br>
@@ -370,6 +403,7 @@ GISelCSEInfo &<br>
 GISelCSEAnalysisWrapper::get(std::unique_ptr<CSEConfigBase> CSEOpt,<br>
                              bool Recompute) {<br>
   if (!AlreadyComputed || Recompute) {<br>
+    Info.releaseMemory();<br>
     Info.setCSEConfig(std::move(CSEOpt));<br>
     Info.analyze(*MF);<br>
     AlreadyComputed = true;<br>
<br>
diff  --git a/llvm/lib/CodeGen/GlobalISel/GISelChangeObserver.cpp b/llvm/lib/CodeGen/GlobalISel/GISelChangeObserver.cpp<br>
index 62b903c30b89..bdaa6378e901 100644<br>
--- a/llvm/lib/CodeGen/GlobalISel/GISelChangeObserver.cpp<br>
+++ b/llvm/lib/CodeGen/GlobalISel/GISelChangeObserver.cpp<br>
@@ -38,3 +38,11 @@ RAIIDelegateInstaller::RAIIDelegateInstaller(MachineFunction &MF,<br>
 }<br>
<br>
 RAIIDelegateInstaller::~RAIIDelegateInstaller() { MF.resetDelegate(Delegate); }<br>
+<br>
+RAIIMFObserverInstaller::RAIIMFObserverInstaller(MachineFunction &MF,<br>
+                                                 GISelChangeObserver &Observer)<br>
+    : MF(MF) {<br>
+  MF.setObserver(&Observer);<br>
+}<br>
+<br>
+RAIIMFObserverInstaller::~RAIIMFObserverInstaller() { MF.setObserver(nullptr); }<br>
<br>
diff  --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp<br>
index 418002003849..22a1eae3f480 100644<br>
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp<br>
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp<br>
@@ -2381,6 +2381,7 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {<br>
     WrapperObserver.addObserver(&Verifier);<br>
 #endif // ifndef NDEBUG<br>
     RAIIDelegateInstaller DelInstall(*MF, &WrapperObserver);<br>
+    RAIIMFObserverInstaller ObsInstall(*MF, WrapperObserver);<br>
     for (const BasicBlock *BB : RPOT) {<br>
       MachineBasicBlock &MBB = getMBB(*BB);<br>
       // Set the insertion point of all the following translations to<br>
<br>
diff  --git a/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp b/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp<br>
index e789e4a333dc..0c0edc8a7b0c 100644<br>
--- a/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp<br>
+++ b/llvm/lib/CodeGen/GlobalISel/Legalizer.cpp<br>
@@ -28,6 +28,7 @@<br>
 #include "llvm/CodeGen/TargetSubtargetInfo.h"<br>
 #include "llvm/InitializePasses.h"<br>
 #include "llvm/Support/Debug.h"<br>
+#include "llvm/Support/Error.h"<br>
 #include "llvm/Target/TargetMachine.h"<br>
<br>
 #include <iterator><br>
@@ -180,7 +181,7 @@ Legalizer::legalizeMachineFunction(MachineFunction &MF, const LegalizerInfo &LI,<br>
<br>
   // Now install the observer as the delegate to MF.<br>
   // This will keep all the observers notified about new insertions/deletions.<br>
-  RAIIDelegateInstaller DelInstall(MF, &WrapperObserver);<br>
+  RAIIMFObsDelInstaller Installer(MF, WrapperObserver);<br>
   LegalizerHelper Helper(MF, LI, WrapperObserver, MIRBuilder);<br>
   LegalizationArtifactCombiner ArtCombiner(MIRBuilder, MRI, LI);<br>
   auto RemoveDeadInstFromLists = [&WrapperObserver](MachineInstr *DeadMI) {<br>
@@ -305,6 +306,7 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {<br>
     // We want CSEInfo in addition to WorkListObserver to observe all changes.<br>
     AuxObservers.push_back(CSEInfo);<br>
   }<br>
+  assert(!CSEInfo || !errorToBool(CSEInfo->verify()));<br>
<br>
   const LegalizerInfo &LI = *MF.getSubtarget().getLegalizerInfo();<br>
   MFResult Result = legalizeMachineFunction(MF, LI, AuxObservers, *MIRBuilder);<br>
@@ -324,5 +326,11 @@ bool Legalizer::runOnMachineFunction(MachineFunction &MF) {<br>
     reportGISelFailure(MF, TPC, MORE, R);<br>
     return false;<br>
   }<br>
+  // If for some reason CSE was not enabled, make sure that we invalidate the<br>
+  // CSEInfo object (as we currently declare that the analysis is preserved).<br>
+  // The next time get on the wrapper is called, it will force it to recompute<br>
+  // the analysis.<br>
+  if (!EnableCSE)<br>
+    Wrapper.setComputed(false);<br>
   return Result.Changed;<br>
 }<br>
<br>
diff  --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp<br>
index 73bc2a695965..32f866692835 100644<br>
--- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp<br>
+++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp<br>
@@ -12,6 +12,7 @@<br>
 #include "llvm/CodeGen/GlobalISel/Utils.h"<br>
 #include "llvm/ADT/APFloat.h"<br>
 #include "llvm/ADT/Twine.h"<br>
+#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"<br>
 #include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"<br>
 #include "llvm/CodeGen/MachineInstr.h"<br>
 #include "llvm/CodeGen/MachineInstrBuilder.h"<br>
@@ -62,6 +63,15 @@ Register llvm::constrainOperandRegClass(<br>
               TII.get(TargetOpcode::COPY), Reg)<br>
           .addReg(ConstrainedReg);<br>
     }<br>
+  } else {<br>
+    if (GISelChangeObserver *Observer = MF.getObserver()) {<br>
+      if (!RegMO.isDef()) {<br>
+        MachineInstr *RegDef = MRI.getVRegDef(Reg);<br>
+        Observer->changedInstr(*RegDef);<br>
+      }<br>
+      Observer->changingAllUsesOfReg(MRI, Reg);<br>
+      Observer->finishedChangingAllUsesOfReg();<br>
+    }<br>
   }<br>
   return ConstrainedReg;<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</blockquote></div>