<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="RU" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US">Submitted r296021.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Stas<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D;mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<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 [mailto:ruiu@google.com]
<br>
<b>Sent:</b> Thursday, February 23, 2017 1:46 PM<br>
<b>To:</b> Mekhanoshin, Stanislav <Stanislav.Mekhanoshin@amd.com><br>
<b>Cc:</b> llvm-commits <llvm-commits@lists.llvm.org><br>
<b>Subject:</b> Re: [llvm] r296009 - Correct register pressure calculation in presence of subregs<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Thanks!<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Thu, Feb 23, 2017 at 1:44 PM, Mekhanoshin, Stanislav <<a href="mailto:Stanislav.Mekhanoshin@amd.com" target="_blank">Stanislav.Mekhanoshin@amd.com</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">diff --git a/lib/Target/AMDGPU/SIRegisterInfo.h b/lib/Target/AMDGPU/SIRegisterInfo.h</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">index 844f031..258de19 100644</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">--- a/lib/Target/AMDGPU/SIRegisterInfo.h</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">+++ b/lib/Target/AMDGPU/SIRegisterInfo.h</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">@@ -26,6 +26,8 @@ class SISubtarget;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">class SIMachineFunctionInfo;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">class SIRegisterInfo final : public AMDGPURegisterInfo {</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">+  using AMDGPUGenRegisterInfo::getRegUnitWeight;</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">+</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Stas</span><o:p></o:p></p>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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</span><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Hi,</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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.</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-US" style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Stas</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><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>
<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>><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</span><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Hi,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">This seems to have caused this warnings. Can you take a look?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">Building CXX object /ssd/b/lib/Target/AMDGPU/CMakeFiles/LLVMAMDGPUCodeGen.dir/SIOptimizeExecMasking.cpp.o<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">In file included from /ssd/llvm-project/llvm/lib/Target/AMDGPU/SIOptimizeExecMasking.cpp:11:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">In file included from //ssd/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.h:22:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">In file included from //ssd/llvm-project/llvm/lib/Target/AMDGPU/SIInstrInfo.h:21:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">//ssd/llvm-project/llvm/lib/Target/AMDGPU/SIRegisterInfo.h:231:12: warning: 'llvm::SIRegisterInfo::getRegUnitWeight' hides overloaded virtual function [-Woverloaded-virtual]<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">  unsigned getRegUnitWeight(const MachineRegisterInfo &MRI,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           ^<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">//ssd/b/lib/Target/AMDGPU/AMDGPUGenRegisterInfo.inc:17362:12: note: hidden overloaded virtual function 'llvm::AMDGPUGenRegisterInfo::getRegUnitWeight' declared here: different number
 of parameters (1 vs 3)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">  unsigned getRegUnitWeight(unsigned RegUnit) const override;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">           ^<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">1 warning generated.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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:<o:p></o:p></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" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto">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-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/D29835</a><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/AMDGPU/schedule-regpressure-subregs.mir<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/RegisterPressure.h<br>
    llvm/trunk/include/llvm/Target/TargetRegisterInfo.h<br>
    llvm/trunk/lib/CodeGen/MachineScheduler.cpp<br>
    llvm/trunk/lib/CodeGen/RegisterPressure.cpp<br>
    llvm/trunk/lib/CodeGen/TargetRegisterInfo.cpp<br>
    llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.cpp<br>
    llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.h<br>
    llvm/trunk/test/CodeGen/AMDGPU/load-global-i32.ll<br>
<br>
Modified: llvm/trunk/include/llvm/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-project/llvm/trunk/include/llvm/CodeGen/RegisterPressure.h?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/RegisterPressure.h (original)<br>
+++ llvm/trunk/include/llvm/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(RegisterMaskPair P, bool IsDec,<br>
                          const MachineRegisterInfo *MRI);<br>
<br>
   void dump(const TargetRegisterInfo &TRI) const;<br>
<br>
Modified: llvm/trunk/include/llvm/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-project/llvm/trunk/include/llvm/Target/TargetRegisterInfo.h?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/Target/TargetRegisterInfo.h (original)<br>
+++ llvm/trunk/include/llvm/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/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-project/llvm/trunk/lib/CodeGen/MachineScheduler.cpp?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MachineScheduler.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MachineScheduler.cpp Thu Feb 23 14:19:44 2017<br>
@@ -1085,7 +1085,7 @@ void ScheduleDAGMILive::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::updatePressureDi<br>
               LI.Query(LIS->getInstructionIndex(*SU->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/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-project/llvm/trunk/lib/CodeGen/RegisterPressure.cpp?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/RegisterPressure.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/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::isVirtualRegister(Reg)) {<br>
+    LaneBitmask Max = MRI.getMaxLaneMaskForVReg(Reg);<br>
+    LaneMask1 &= Max;<br>
+    LaneMask2 &= Max;<br>
+  }<br>
+}<br>
+<br>
 /// Increase pressure for each pressure set provided by TargetRegisterInfo.<br>
 static void increaseSetPressure(std::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[*PSetI] >= Weight && "register pressure underflow");<br>
     CurrSetPressure[*PSetI] -= Weight;<br>
@@ -139,11 +154,14 @@ void PressureDiff::dump(const TargetRegi<br>
 void RegPressureTracker::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(unsig<br>
   PressureDiff &PDiff = (*this)[Idx];<br>
   assert(!PDiff.begin()->isValid() && "stale PDiff");<br>
   for (const RegisterMaskPair &P : RegOpers.Defs)<br>
-    PDiff.addPressureChange(P.RegUnit, true, &MRI);<br>
+    PDiff.addPressureChange(P, true, &MRI);<br>
<br>
   for (const RegisterMaskPair &P : RegOpers.Uses)<br>
-    PDiff.addPressureChange(P.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::addPressureChange(unsigned RegUnit, bool IsDec,<br>
+void PressureDiff::addPressureChange(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(*MRI, P.RegUnit, P.LaneMask);<br>
+  PSetIterator PSetI = MRI->getPressureSets(P.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/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-project/llvm/trunk/lib/CodeGen/TargetRegisterInfo.cpp?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/TargetRegisterInfo.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/TargetRegisterInfo.cpp Thu Feb 23 14:19:44 2017<br>
@@ -412,6 +412,15 @@ bool TargetRegisterInfo::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::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(unsigned Reg, unsigned SubRegIndex,<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/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-project/llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.cpp?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.cpp Thu Feb 23 14:19:44 2017<br>
@@ -21,6 +21,7 @@<br>
 #include "llvm/CodeGen/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::getRegUnitPressureSets(RegUnit);<br>
 }<br>
+<br>
+unsigned SIRegisterInfo::getRegUnitWeight(const MachineRegisterInfo &MRI,<br>
+                                          unsigned RegUnit,<br>
+                                          LaneBitmask LaneMask) const {<br>
+  unsigned Weight = TargetRegisterInfo::getRegUnitWeight(MRI, RegUnit,<br>
+                                                         LaneMask);<br>
+  if (Weight > 1 && LaneMask.any() && !LaneMask.all() &&<br>
+      isVirtualRegister(RegUnit)) {<br>
+    LaneBitmask Max = MRI.getMaxLaneMaskForVReg(RegUnit);<br>
+    if (Max != LaneMask && !Max.all() && !Max.none())<br>
+      Weight = (Weight * countPopulation(LaneMask.getAsInteger())) /<br>
+                         countPopulation(Max.getAsInteger());<br>
+  }<br>
+  return Weight;<br>
+}<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/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-project/llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.h?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.h (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIRegisterInfo.h Thu Feb 23 14:19:44 2017<br>
@@ -228,6 +228,10 @@ public:<br>
<br>
   const int *getRegUnitPressureSets(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(MachineBasicBlock::iterator MI,<br>
                            unsigned LoadStoreOp,<br>
<br>
Modified: llvm/trunk/test/CodeGen/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-project/llvm/trunk/test/CodeGen/AMDGPU/load-global-i32.ll?rev=296009&r1=296008&r2=296009&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/AMDGPU/load-global-i32.ll (original)<br>
+++ llvm/trunk/test/CodeGen/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_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/AMDGPU/schedule-regpressure-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-project/llvm/trunk/test/CodeGen/AMDGPU/schedule-regpressure-subregs.mir?rev=296009&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/AMDGPU/schedule-regpressure-subregs.mir (added)<br>
+++ llvm/trunk/test/CodeGen/AMDGPU/schedule-regpressure-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>
_______________________________________________<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/mailman/listinfo/llvm-commits</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"> <o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>