Author: hans
Date: Mon Feb 27 14:53:28 2017
New Revision: 296380

URL: http://llvm.org/viewvc/llvm-project?rev=296380&view=rev
Log:
Merging r296093 and r296260:
------------------------------------------------------------------------
r296093 | ctopper | 2017-02-23 22:38:24 -0800 (Thu, 23 Feb 2017) | 1 line

[ExecutionDepsFix] Use range-based for loop. NFC
------------------------------------------------------------------------

------------------------------------------------------------------------
r296260 | ctopper | 2017-02-25 10:12:25 -0800 (Sat, 25 Feb 2017) | 18 lines

[ExecutionDepsFix] Don't make copies of LiveReg objects when collecting 
operands for soft instructions

Summary:
While collecting operands we make copies of the LiveReg objects which are 
stored in the LiveRegs array. If the instruction uses the same register 
multiple times we end up with multiple copies. Later we iterate through the 
collected list of LiveReg objects and merge DomainValues. In the process of 
doing this the merge function can change the contents of the original LiveReg 
object in the LiveRegs array, but not the copies that have been made. So when 
we get to the second usage of the register we end up seeing a stale copy of the 
LiveReg object.

To fix this I've stopped copying and now just store a pointer to the original 
LiveReg object. Another option might be to avoid adding the same register to 
the Regs array twice, but this approach seemed simpler.

The included test case exposes this bug due to an AVX-512 masked OR instruction 
using the same register for the passthru operand and one of the inputs to the 
OR operation.

Fixes PR30284.

Reviewers: RKSimon, stoklund, MatzeB, spatel, myatsina

Reviewed By: RKSimon

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D30242
------------------------------------------------------------------------

Added:
    llvm/branches/release_40/test/CodeGen/X86/pr30284.ll
      - copied, changed from r296260, llvm/trunk/test/CodeGen/X86/pr30284.ll
Modified:
    llvm/branches/release_40/   (props changed)
    llvm/branches/release_40/lib/CodeGen/ExecutionDepsFix.cpp

Propchange: llvm/branches/release_40/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Feb 27 14:53:28 2017
@@ -1,3 +1,3 @@
 /llvm/branches/Apple/Pertwee:110850,110961
 /llvm/branches/type-system-rewrite:133420-134817
-/llvm/trunk:155241,291858-291859,291863,291875,291909,291918,291966,291968,291979,292117,292133,292167,292169-292170,292242,292254-292255,292280,292323,292444,292467,292516,292583,292624-292625,292641,292651,292667,292711-292713,292758,292949,293017,293021,293025,293124,293230,293259,293273,293291,293293,293309,293345,293417,293522,293542,293629,293635,293658,293673,293727,293730,294003,294102,294129,294203,294267,294318,294348-294349,294357,294527,294551,294982,295018,295116,295213,295215,295230,295486,295490,295512,295762,295990,296003,296030
+/llvm/trunk:155241,291858-291859,291863,291875,291909,291918,291966,291968,291979,292117,292133,292167,292169-292170,292242,292254-292255,292280,292323,292444,292467,292516,292583,292624-292625,292641,292651,292667,292711-292713,292758,292949,293017,293021,293025,293124,293230,293259,293273,293291,293293,293309,293345,293417,293522,293542,293629,293635,293658,293673,293727,293730,294003,294102,294129,294203,294267,294318,294348-294349,294357,294527,294551,294982,295018,295116,295213,295215,295230,295486,295490,295512,295762,295990,296003,296030,296093,296260

Modified: llvm/branches/release_40/lib/CodeGen/ExecutionDepsFix.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/branches/release_40/lib/CodeGen/ExecutionDepsFix.cpp?rev=296380&r1=296379&r2=296380&view=diff
==============================================================================
--- llvm/branches/release_40/lib/CodeGen/ExecutionDepsFix.cpp (original)
+++ llvm/branches/release_40/lib/CodeGen/ExecutionDepsFix.cpp Mon Feb 27 
14:53:28 2017
@@ -707,9 +707,8 @@ void ExeDepsFix::visitSoftInstr(MachineI
 
   // Kill off any remaining uses that don't match available, and build a list 
of
   // incoming DomainValues that we want to merge.
-  SmallVector<LiveReg, 4> Regs;
-  for (SmallVectorImpl<int>::iterator i=used.begin(), e=used.end(); i!=e; ++i) 
{
-    int rx = *i;
+  SmallVector<const LiveReg *, 4> Regs;
+  for (int rx : used) {
     assert(LiveRegs && "no space allocated for live registers");
     const LiveReg &LR = LiveRegs[rx];
     // This useless DomainValue could have been missed above.
@@ -718,16 +717,11 @@ void ExeDepsFix::visitSoftInstr(MachineI
       continue;
     }
     // Sorted insertion.
-    bool Inserted = false;
-    for (SmallVectorImpl<LiveReg>::iterator i = Regs.begin(), e = Regs.end();
-           i != e && !Inserted; ++i) {
-      if (LR.Def < i->Def) {
-        Inserted = true;
-        Regs.insert(i, LR);
-      }
-    }
-    if (!Inserted)
-      Regs.push_back(LR);
+    auto I = std::upper_bound(Regs.begin(), Regs.end(), &LR,
+                              [](const LiveReg *LHS, const LiveReg *RHS) {
+                                return LHS->Def < RHS->Def;
+                              });
+    Regs.insert(I, &LR);
   }
 
   // doms are now sorted in order of appearance. Try to merge them all, giving
@@ -735,14 +729,14 @@ void ExeDepsFix::visitSoftInstr(MachineI
   DomainValue *dv = nullptr;
   while (!Regs.empty()) {
     if (!dv) {
-      dv = Regs.pop_back_val().Value;
+      dv = Regs.pop_back_val()->Value;
       // Force the first dv to match the current instruction.
       dv->AvailableDomains = dv->getCommonDomains(available);
       assert(dv->AvailableDomains && "Domain should have been filtered");
       continue;
     }
 
-    DomainValue *Latest = Regs.pop_back_val().Value;
+    DomainValue *Latest = Regs.pop_back_val()->Value;
     // Skip already merged values.
     if (Latest == dv || Latest->Next)
       continue;

Copied: llvm/branches/release_40/test/CodeGen/X86/pr30284.ll (from r296260, 
llvm/trunk/test/CodeGen/X86/pr30284.ll)
URL: 
http://llvm.org/viewvc/llvm-project/llvm/branches/release_40/test/CodeGen/X86/pr30284.ll?p2=llvm/branches/release_40/test/CodeGen/X86/pr30284.ll&p1=llvm/trunk/test/CodeGen/X86/pr30284.ll&r1=296260&r2=296380&rev=296380&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/pr30284.ll (original)
+++ llvm/branches/release_40/test/CodeGen/X86/pr30284.ll Mon Feb 27 14:53:28 
2017
@@ -7,10 +7,11 @@ define void @f_f___un_3C_unf_3E_un_3C_un
 ; CHECK-NEXT:    vmovapd 0, %zmm0
 ; CHECK-NEXT:    vmovapd 64, %zmm1
 ; CHECK-NEXT:    vmovapd {{.*#+}} zmm2 = 
[0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16]
-; CHECK-NEXT:    vorpd %zmm2, %zmm0, %zmm0 {%k1}
+; CHECK-NEXT:    kshiftrw $8, %k0, %k1
 ; CHECK-NEXT:    vorpd %zmm2, %zmm1, %zmm1 {%k1}
-; CHECK-NEXT:    vmovapd %zmm1, 64
+; CHECK-NEXT:    vorpd %zmm2, %zmm0, %zmm0 {%k1}
 ; CHECK-NEXT:    vmovapd %zmm0, 0
+; CHECK-NEXT:    vmovapd %zmm1, 64
 ; CHECK-NEXT:    retl
   %a_load22 = load <16 x i64>, <16 x i64>* null, align 1
   %bitop = or <16 x i64> %a_load22, <i64 68719476736, i64 68719476736, i64 
68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 
68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 
68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 
68719476736, i64 68719476736>


_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to