<div dir="ltr">Thanks!</div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Feb 23, 2017 at 1:44 PM, Mekhanoshin, Stanislav <span dir="ltr"><<a href="mailto:Stanislav.Mekhanoshin@amd.com" target="_blank">Stanislav.Mekhanoshin@amd.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="RU" link="blue" vlink="purple">
<div class="m_4459546335171753370WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’m going to add this to shut the warning:<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">diff --git a/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h b/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">index 844f031..258de19 100644<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">--- a/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">+++ b/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">@@ -26,6 +26,8 @@ class SISubtarget;<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">class SIMachineFunctionInfo;<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">class SIRegisterInfo final : public AMDGPURegisterInfo {<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">+  using AMDGPUGenRegisterInfo::<wbr>getRegUnitWeight;<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">+<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I will do it as soon as tests pass.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Stas<u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Mekhanoshin, Stanislav
<br>
<b>Sent:</b> Thursday, February 23, 2017 1:08 PM<br>
<b>To:</b> 'Rui Ueyama' <<a href="mailto:ruiu@google.com" target="_blank">ruiu@google.com</a>><br>
<b>Cc:</b> llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>><br>
<b>Subject:</b> RE: [llvm] r296009 - Correct register pressure calculation in presence of subregs<u></u><u></u></span></p>
</div>
</div><span class="">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Hi,<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’m looking into this. Said warning is only issued by clang and hiding was intended here. I’m building with clang instead
 of gcc now to reproduce.<u></u><u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Stas<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
</span><p class="MsoNormal"><b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Rui Ueyama [<a href="mailto:ruiu@google.com" target="_blank">mailto:ruiu@google.com</a>]
<br><span class="">
<b>Sent:</b> Thursday, February 23, 2017 12:50 PM<br>
<b>To:</b> Mekhanoshin, Stanislav <<a href="mailto:Stanislav.Mekhanoshin@amd.com" target="_blank">Stanislav.Mekhanoshin@amd.com</a><wbr>><br>
<b>Cc:</b> llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>><br>
</span><b>Subject:</b> Re: [llvm] r296009 - Correct register pressure calculation in presence of subregs<u></u><u></u></span></p><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<p class="MsoNormal">Hi,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">This seems to have caused this warnings. Can you take a look?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Building CXX object /ssd/b/lib/Target/AMDGPU/<wbr>CMakeFiles/LLVMAMDGPUCodeGen.<wbr>dir/SIOptimizeExecMasking.cpp.<wbr>o<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">In file included from /ssd/llvm-project/llvm/lib/<wbr>Target/AMDGPU/<wbr>SIOptimizeExecMasking.cpp:11:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">In file included from //ssd/llvm-project/llvm/lib/<wbr>Target/AMDGPU/AMDGPUSubtarget.<wbr>h:22:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">In file included from //ssd/llvm-project/llvm/lib/<wbr>Target/AMDGPU/SIInstrInfo.h:<wbr>21:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">//ssd/llvm-project/llvm/lib/<wbr>Target/AMDGPU/SIRegisterInfo.<wbr>h:231:12: warning: 'llvm::SIRegisterInfo::<wbr>getRegUnitWeight' hides overloaded virtual function [-Woverloaded-virtual]<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  unsigned getRegUnitWeight(const MachineRegisterInfo &MRI,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">           ^<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">//ssd/b/lib/Target/AMDGPU/<wbr>AMDGPUGenRegisterInfo.inc:<wbr>17362:12: note: hidden overloaded virtual function 'llvm::AMDGPUGenRegisterInfo::<wbr>getRegUnitWeight' declared here: different number of parameters (1 vs 3)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">  unsigned getRegUnitWeight(unsigned RegUnit) const override;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">           ^<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">1 warning generated.<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Thu, Feb 23, 2017 at 12:19 PM, Stanislav Mekhanoshin via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<p class="MsoNormal">Author: rampitec<br>
Date: Thu Feb 23 14:19:44 2017<br>
New Revision: 296009<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=296009&view=rev" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project?rev=296009&view=rev</a><br>
Log:<br>
Correct register pressure calculation in presence of subregs<br>
<br>
If a subreg is used in an instruction it counts as a whole superreg<br>
for the purpose of register pressure calculation. This patch corrects<br>
improper register pressure calculation by examining operand's lane mask.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D29835" target="_blank">
https://reviews.llvm.org/<wbr>D29835</a><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/schedule-regpressure-<wbr>subregs.mir<br>
Modified:<br>
    llvm/trunk/include/llvm/<wbr>CodeGen/RegisterPressure.h<br>
    llvm/trunk/include/llvm/<wbr>Target/TargetRegisterInfo.h<br>
    llvm/trunk/lib/CodeGen/<wbr>MachineScheduler.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>RegisterPressure.cpp<br>
    llvm/trunk/lib/CodeGen/<wbr>TargetRegisterInfo.cpp<br>
    llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.cpp<br>
    llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h<br>
    llvm/trunk/test/CodeGen/<wbr>AMDGPU/load-global-i32.ll<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>CodeGen/RegisterPressure.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/RegisterPressure.h?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/CodeGen/RegisterPressure.<wbr>h?rev=296009&r1=296008&r2=<wbr>296009&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>CodeGen/RegisterPressure.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>CodeGen/RegisterPressure.h Thu Feb 23 14:19:44 2017<br>
@@ -156,7 +156,7 @@ public:<br>
   const_iterator begin() const { return &PressureChanges[0]; }<br>
   const_iterator end() const { return &PressureChanges[MaxPSets]; }<br>
<br>
-  void addPressureChange(unsigned RegUnit, bool IsDec,<br>
+  void addPressureChange(<wbr>RegisterMaskPair P, bool IsDec,<br>
                          const MachineRegisterInfo *MRI);<br>
<br>
   void dump(const TargetRegisterInfo &TRI) const;<br>
<br>
Modified: llvm/trunk/include/llvm/<wbr>Target/TargetRegisterInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetRegisterInfo.h?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/Target/<wbr>TargetRegisterInfo.h?rev=<wbr>296009&r1=296008&r2=296009&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/<wbr>Target/TargetRegisterInfo.h (original)<br>
+++ llvm/trunk/include/llvm/<wbr>Target/TargetRegisterInfo.h Thu Feb 23 14:19:44 2017<br>
@@ -30,6 +30,7 @@ namespace llvm {<br>
<br>
 class BitVector;<br>
 class MachineFunction;<br>
+class MachineRegisterInfo;<br>
 class RegScavenger;<br>
 template<class T> class SmallVectorImpl;<br>
 class VirtRegMap;<br>
@@ -719,6 +720,12 @@ public:<br>
   /// Get the weight in units of pressure for this register unit.<br>
   virtual unsigned getRegUnitWeight(unsigned RegUnit) const = 0;<br>
<br>
+  /// Get the weight in units of pressure for a sub register of this register<br>
+  /// unit given a lane mask.<br>
+  virtual unsigned getRegUnitWeight(const MachineRegisterInfo &MRI,<br>
+                                    unsigned RegUnit,<br>
+                                    LaneBitmask LaneMask) const;<br>
+<br>
   /// Get the number of dimensions of register pressure.<br>
   virtual unsigned getNumRegPressureSets() const = 0;<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>MachineScheduler.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineScheduler.cpp?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/MachineScheduler.cpp?<wbr>rev=296009&r1=296008&r2=<wbr>296009&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>MachineScheduler.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>MachineScheduler.cpp Thu Feb 23 14:19:44 2017<br>
@@ -1085,7 +1085,7 @@ void ScheduleDAGMILive::<wbr>updatePressureDi<br>
           continue;<br>
<br>
         PressureDiff &PDiff = getPressureDiff(&SU);<br>
-        PDiff.addPressureChange(Reg, Decrement, &MRI);<br>
+        PDiff.addPressureChange(P, Decrement, &MRI);<br>
         DEBUG(<br>
           dbgs() << "  UpdateRegP: SU(" << SU.NodeNum << ") "<br>
                  << PrintReg(Reg, TRI) << ':' << PrintLaneMask(P.LaneMask)<br>
@@ -1123,7 +1123,7 @@ void ScheduleDAGMILive::<wbr>updatePressureDi<br>
               LI.Query(LIS-><wbr>getInstructionIndex(*SU-><wbr>getInstr()));<br>
           if (LRQ.valueIn() == VNI) {<br>
             PressureDiff &PDiff = getPressureDiff(SU);<br>
-            PDiff.addPressureChange(Reg, true, &MRI);<br>
+            PDiff.addPressureChange(P, true, &MRI);<br>
             DEBUG(<br>
               dbgs() << "  UpdateRegP: SU(" << SU->NodeNum << ") "<br>
                      << *SU->getInstr();<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>RegisterPressure.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegisterPressure.cpp?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/RegisterPressure.cpp?<wbr>rev=296009&r1=296008&r2=<wbr>296009&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>RegisterPressure.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>RegisterPressure.cpp Thu Feb 23 14:19:44 2017<br>
@@ -46,16 +46,29 @@<br>
<br>
 using namespace llvm;<br>
<br>
+/// Clamp lane masks to maximum posible value.<br>
+static void clampMasks(const MachineRegisterInfo &MRI, unsigned Reg,<br>
+                       LaneBitmask& LaneMask1, LaneBitmask& LaneMask2) {<br>
+  if (TargetRegisterInfo::<wbr>isVirtualRegister(Reg)) {<br>
+    LaneBitmask Max = MRI.getMaxLaneMaskForVReg(Reg)<wbr>;<br>
+    LaneMask1 &= Max;<br>
+    LaneMask2 &= Max;<br>
+  }<br>
+}<br>
+<br>
 /// Increase pressure for each pressure set provided by TargetRegisterInfo.<br>
 static void increaseSetPressure(std::<wbr>vector<unsigned> &CurrSetPressure,<br>
                                 const MachineRegisterInfo &MRI, unsigned Reg,<br>
                                 LaneBitmask PrevMask, LaneBitmask NewMask) {<br>
   assert((PrevMask & ~NewMask).none() && "Must not remove bits");<br>
-  if (PrevMask.any() || NewMask.none())<br>
+<br>
+  clampMasks(MRI, Reg, PrevMask, NewMask);<br>
+  if ((NewMask & ~PrevMask).none())<br>
     return;<br>
<br>
+  const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();<br>
+  unsigned Weight = TRI->getRegUnitWeight(MRI, Reg, NewMask & ~PrevMask);<br>
   PSetIterator PSetI = MRI.getPressureSets(Reg);<br>
-  unsigned Weight = PSetI.getWeight();<br>
   for (; PSetI.isValid(); ++PSetI)<br>
     CurrSetPressure[*PSetI] += Weight;<br>
 }<br>
@@ -65,11 +78,13 @@ static void decreaseSetPressure(std::vec<br>
                                 const MachineRegisterInfo &MRI, unsigned Reg,<br>
                                 LaneBitmask PrevMask, LaneBitmask NewMask) {<br>
   //assert((NewMask & !PrevMask) == 0 && "Must not add bits");<br>
-  if (NewMask.any() || PrevMask.none())<br>
+  clampMasks(MRI, Reg, PrevMask, NewMask);<br>
+  if ((~NewMask & PrevMask).none())<br>
     return;<br>
<br>
+  const TargetRegisterInfo *TRI = MRI.getTargetRegisterInfo();<br>
+  unsigned Weight = TRI->getRegUnitWeight(MRI, Reg, ~NewMask & PrevMask);<br>
   PSetIterator PSetI = MRI.getPressureSets(Reg);<br>
-  unsigned Weight = PSetI.getWeight();<br>
   for (; PSetI.isValid(); ++PSetI) {<br>
     assert(CurrSetPressure[*<wbr>PSetI] >= Weight && "register pressure underflow");<br>
     CurrSetPressure[*PSetI] -= Weight;<br>
@@ -139,11 +154,14 @@ void PressureDiff::dump(const TargetRegi<br>
 void RegPressureTracker::<wbr>increaseRegPressure(unsigned RegUnit,<br>
                                              LaneBitmask PreviousMask,<br>
                                              LaneBitmask NewMask) {<br>
-  if (PreviousMask.any() || NewMask.none())<br>
+  clampMasks(*MRI, RegUnit, PreviousMask, NewMask);<br>
+  if ((NewMask & ~PreviousMask).none())<br>
     return;<br>
<br>
+  const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();<br>
+  unsigned Weight = TRI->getRegUnitWeight(*MRI, RegUnit,<br>
+                                          NewMask & ~PreviousMask);<br>
   PSetIterator PSetI = MRI->getPressureSets(RegUnit);<br>
-  unsigned Weight = PSetI.getWeight();<br>
   for (; PSetI.isValid(); ++PSetI) {<br>
     CurrSetPressure[*PSetI] += Weight;<br>
     P.MaxSetPressure[*PSetI] =<br>
@@ -644,17 +662,19 @@ void PressureDiffs::addInstruction(<wbr>unsig<br>
   PressureDiff &PDiff = (*this)[Idx];<br>
   assert(!PDiff.begin()-><wbr>isValid() && "stale PDiff");<br>
   for (const RegisterMaskPair &P : RegOpers.Defs)<br>
-    PDiff.addPressureChange(P.<wbr>RegUnit, true, &MRI);<br>
+    PDiff.addPressureChange(P, true, &MRI);<br>
<br>
   for (const RegisterMaskPair &P : RegOpers.Uses)<br>
-    PDiff.addPressureChange(P.<wbr>RegUnit, false, &MRI);<br>
+    PDiff.addPressureChange(P, false, &MRI);<br>
 }<br>
<br>
 /// Add a change in pressure to the pressure diff of a given instruction.<br>
-void PressureDiff::<wbr>addPressureChange(unsigned RegUnit, bool IsDec,<br>
+void PressureDiff::<wbr>addPressureChange(<wbr>RegisterMaskPair P, bool IsDec,<br>
                                      const MachineRegisterInfo *MRI) {<br>
-  PSetIterator PSetI = MRI->getPressureSets(RegUnit);<br>
-  int Weight = IsDec ? -PSetI.getWeight() : PSetI.getWeight();<br>
+  const TargetRegisterInfo *TRI = MRI->getTargetRegisterInfo();<br>
+  int Weight = (int)TRI->getRegUnitWeight(*<wbr>MRI, P.RegUnit, P.LaneMask);<br>
+  PSetIterator PSetI = MRI->getPressureSets(P.<wbr>RegUnit);<br>
+  if (IsDec) Weight = -Weight;<br>
   for (; PSetI.isValid(); ++PSetI) {<br>
     // Find an existing entry in the pressure diff for this PSet.<br>
     PressureDiff::iterator I = nonconst_begin(), E = nonconst_end();<br>
<br>
Modified: llvm/trunk/lib/CodeGen/<wbr>TargetRegisterInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/TargetRegisterInfo.cpp?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/<wbr>CodeGen/TargetRegisterInfo.<wbr>cpp?rev=296009&r1=296008&r2=<wbr>296009&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/CodeGen/<wbr>TargetRegisterInfo.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/<wbr>TargetRegisterInfo.cpp Thu Feb 23 14:19:44 2017<br>
@@ -412,6 +412,15 @@ bool TargetRegisterInfo::<wbr>regmaskSubsetEq<br>
   return true;<br>
 }<br>
<br>
+/// Get the weight in units of pressure for a sub register of this register<br>
+/// unit given a lane mask.<br>
+unsigned TargetRegisterInfo::<wbr>getRegUnitWeight(const MachineRegisterInfo &MRI,<br>
+                                              unsigned RegUnit,<br>
+                                              LaneBitmask LaneMask) const {<br>
+  PSetIterator PSetI = MRI.getPressureSets(RegUnit);<br>
+  return PSetI.getWeight();<br>
+}<br>
+<br>
 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)<br>
 LLVM_DUMP_METHOD<br>
 void TargetRegisterInfo::dumpReg(<wbr>unsigned Reg, unsigned SubRegIndex,<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.cpp?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>AMDGPU/SIRegisterInfo.cpp?rev=<wbr>296009&r1=296008&r2=296009&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.cpp Thu Feb 23 14:19:44 2017<br>
@@ -21,6 +21,7 @@<br>
 #include "llvm/CodeGen/<wbr>RegisterScavenging.h"<br>
 #include "llvm/IR/Function.h"<br>
 #include "llvm/IR/LLVMContext.h"<br>
+#include "llvm/Support/MathExtras.h"<br>
<br>
 using namespace llvm;<br>
<br>
@@ -1408,3 +1409,18 @@ const int *SIRegisterInfo::getRegUnitPre<br>
     return Empty;<br>
   return AMDGPURegisterInfo::<wbr>getRegUnitPressureSets(<wbr>RegUnit);<br>
 }<br>
+<br>
+unsigned SIRegisterInfo::<wbr>getRegUnitWeight(const MachineRegisterInfo &MRI,<br>
+                                          unsigned RegUnit,<br>
+                                          LaneBitmask LaneMask) const {<br>
+  unsigned Weight = TargetRegisterInfo::<wbr>getRegUnitWeight(MRI, RegUnit,<br>
+                                                         LaneMask);<br>
+  if (Weight > 1 && LaneMask.any() && !LaneMask.all() &&<br>
+      isVirtualRegister(RegUnit)) {<br>
+    LaneBitmask Max = MRI.getMaxLaneMaskForVReg(<wbr>RegUnit);<br>
+    if (Max != LaneMask && !Max.all() && !Max.none())<br>
+      Weight = (Weight * countPopulation(LaneMask.<wbr>getAsInteger())) /<br>
+                         countPopulation(Max.<wbr>getAsInteger());<br>
+  }<br>
+  return Weight;<br>
+}<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.h?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>AMDGPU/SIRegisterInfo.h?rev=<wbr>296009&r1=296008&r2=296009&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/<wbr>SIRegisterInfo.h Thu Feb 23 14:19:44 2017<br>
@@ -228,6 +228,10 @@ public:<br>
<br>
   const int *getRegUnitPressureSets(<wbr>unsigned RegUnit) const override;<br>
<br>
+  unsigned getRegUnitWeight(const MachineRegisterInfo &MRI,<br>
+                            unsigned RegUnit,<br>
+                            LaneBitmask LaneMask) const override;<br>
+<br>
 private:<br>
   void buildSpillLoadStore(<wbr>MachineBasicBlock::iterator MI,<br>
                            unsigned LoadStoreOp,<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>AMDGPU/load-global-i32.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/load-global-i32.ll?rev=296009&r1=296008&r2=296009&view=diff" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/load-global-<wbr>i32.ll?rev=296009&r1=296008&<wbr>r2=296009&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/load-global-i32.ll (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/load-global-i32.ll Thu Feb 23 14:19:44 2017<br>
@@ -424,25 +424,25 @@ define void @global_zextload_v16i32_to_v<br>
 ; GCN-NOHSA: buffer_store_dwordx4<br>
 ; GCN-NOHSA: buffer_store_dwordx4<br>
<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
-; GCN-HSA: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
+; GCN-HSA-DAG: flat_store_dwordx4<br>
<br>
 define void @global_sextload_v32i32_to_<wbr>v32i64(<32 x i64> addrspace(1)* %out, <32 x i32> addrspace(1)* %in) #0 {<br>
   %ld = load <32 x i32>, <32 x i32> addrspace(1)* %in<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>AMDGPU/schedule-regpressure-<wbr>subregs.mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/schedule-regpressure-subregs.mir?rev=296009&view=auto" target="_blank">
http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/AMDGPU/schedule-<wbr>regpressure-subregs.mir?rev=<wbr>296009&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>AMDGPU/schedule-regpressure-<wbr>subregs.mir (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>AMDGPU/schedule-regpressure-<wbr>subregs.mir Thu Feb 23 14:19:44 2017<br>
@@ -0,0 +1,67 @@<br>
+# RUN: llc -march=amdgcn -misched=converge -run-pass machine-scheduler -verify-misched %s -o - -debug-only=misched 2>&1 | FileCheck %s<br>
+# REQUIRES: asserts<br>
+<br>
+# CHECK-LABEL: ScheduleDAGMILive::schedule starting<br>
+<br>
+# Check that def and use subregs count with the same weight<br>
+# CHECK: %vreg9:sub1<def> = V_MUL_LO_I32 %vreg6:sub1, 3<br>
+# CHECK: Pressure Diff : {{$}}<br>
+<br>
+# Check that a subreg does not count as a whole superreg<br>
+# CHECK: %vreg9:sub0<def> = V_MUL_LO_I32 %vreg6:sub0, %vreg9:sub1<br>
+# CHECK: Pressure Diff : VGPR_32 1{{$}}<br>
+<br>
+# Check that two subregs of the same register count as a whole register<br>
+# CHECK: DS_WRITE2_B32 %vreg7, %vreg9:sub0, %vreg9:sub1<br>
+# CHECK: Pressure Diff : VGPR_32 3{{$}}<br>
+<br>
+---<br>
+name:            mo_pset<br>
+alignment:       0<br>
+exposesReturnsTwice: false<br>
+legalized:       false<br>
+regBankSelected: false<br>
+selected:        false<br>
+tracksRegLiveness: true<br>
+registers:<br>
+  - { id: 0, class: sreg_128 }<br>
+  - { id: 1, class: sgpr_64 }<br>
+  - { id: 2, class: sreg_32_xm0 }<br>
+  - { id: 3, class: sgpr_32 }<br>
+  - { id: 4, class: vgpr_32 }<br>
+  - { id: 5, class: sreg_32_xm0_xexec }<br>
+  - { id: 6, class: vreg_64 }<br>
+  - { id: 7, class: vgpr_32 }<br>
+  - { id: 8, class: vgpr_32 }<br>
+  - { id: 9, class: vreg_64 }<br>
+liveins:<br>
+  - { reg: '%sgpr4_sgpr5', virtual-reg: '%1' }<br>
+frameInfo:<br>
+  isFrameAddressTaken: false<br>
+  isReturnAddressTaken: false<br>
+  hasStackMap:     false<br>
+  hasPatchPoint:   false<br>
+  stackSize:       0<br>
+  offsetAdjustment: 0<br>
+  maxAlignment:    0<br>
+  adjustsStack:    false<br>
+  hasCalls:        false<br>
+  maxCallFrameSize: 0<br>
+  hasOpaqueSPAdjustment: false<br>
+  hasVAStart:      false<br>
+  hasMustTailInVarArgFunc: false<br>
+body:             |<br>
+  bb.0:<br>
+    liveins: %sgpr4_sgpr5<br>
+<br>
+    %1 = COPY %sgpr4_sgpr5<br>
+    %5 = S_LOAD_DWORD_IMM %1, 0, 0 :: (non-temporal dereferenceable invariant load 4 from `i32 addrspace(2)* undef`)<br>
+    %m0 = S_MOV_B32 -1<br>
+    %7 = COPY %5<br>
+    %6 = DS_READ2_B32 %7, 0, 1, 0, implicit %m0, implicit %exec<br>
+    undef %9.sub1 = V_MUL_LO_I32 %6.sub1, 3, implicit %exec<br>
+    %9.sub0 = V_MUL_LO_I32 %6.sub0, %9.sub1, implicit %exec<br>
+    DS_WRITE2_B32 %7, %9.sub0, %9.sub1, 4, 5, 0, implicit killed %m0, implicit %exec<br>
+    S_ENDPGM<br>
+<br>
+...<br>
<br>
<br>
______________________________<wbr>_________________<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="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div>
</div>

</blockquote></div><br></div>