Signed-off-by: Lu Guanqun <[email protected]>
---
 backend/src/backend/gen_reg_allocation.cpp |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/backend/src/backend/gen_reg_allocation.cpp 
b/backend/src/backend/gen_reg_allocation.cpp
index 30f9e38..a52c46c 100644
--- a/backend/src/backend/gen_reg_allocation.cpp
+++ b/backend/src/backend/gen_reg_allocation.cpp
@@ -76,6 +76,8 @@ namespace gbe
     bool createGenReg(const GenRegInterval &interval);
     /*! Indicate if the registers are already allocated in vectors */
     bool isAllocated(const SelectionVector *vector) const;
+    /*! Indicate if a virtual register is uniquely mapped to a physical 
register file */
+    bool isUniquelyMapped(const ir::Register reg) const;
     /*! Reallocate registers if needed to make the registers in the vector
      *  contigous in memory
      */
@@ -209,6 +211,18 @@ namespace gbe
     return true;
   }
 
+  bool GenRegAllocator::Opaque::isUniquelyMapped(const ir::Register reg) const 
{
+    const auto it = RA.find(reg);
+    GBE_ASSERT(it != RA.end());
+
+    for (auto pair = RA.begin(); pair != RA.end(); ++pair) {
+      if (pair->first != reg && pair->second == it->second)
+        return false;
+    }
+
+    return true;
+  }
+
   void GenRegAllocator::Opaque::coalesce(Selection &selection, SelectionVector 
*vector) {
     for (uint32_t regID = 0; regID < vector->regNum; ++regID) {
       const ir::Register reg = vector->reg[regID].reg();
@@ -307,6 +321,12 @@ namespace gbe
         this->expiringID++;
         continue;
       }
+
+      if (!isUniquelyMapped(reg)) {
+        this->expiringID++;
+        continue;
+      }
+
       // Case 1 - it does not belong to a vector. Just remove it
         ctx.deallocate(it->second);
         this->expiringID++;

_______________________________________________
Beignet mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/beignet

Reply via email to