nv50/ir: fix Instruction::isCommutationLegal for WAW
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 8 Apr 2012 21:38:55 +0000 (23:38 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 14 Apr 2012 19:54:03 +0000 (21:54 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir.cpp

index d80fc85126a7baa21982d5782821043adb6d2bc0..19a90806c70d13705401cbc9da774b865b44d283 100644 (file)
@@ -815,7 +815,7 @@ Instruction::writesPredicate() const
 }
 
 static bool
-insnCheckCommutation(const Instruction *a, const Instruction *b)
+insnCheckCommutationDefSrc(const Instruction *a, const Instruction *b)
 {
    for (int d = 0; a->defExists(d); ++d)
       for (int s = 0; b->srcExists(s); ++s)
@@ -824,12 +824,22 @@ insnCheckCommutation(const Instruction *a, const Instruction *b)
    return true;
 }
 
+static bool
+insnCheckCommutationDefDef(const Instruction *a, const Instruction *b)
+{
+   for (int d = 0; a->defExists(d); ++d)
+      for (int c = 0; b->defExists(c); ++c)
+         if (a->getDef(d)->interfers(b->getDef(c)))
+            return false;
+   return true;
+}
+
 bool
 Instruction::isCommutationLegal(const Instruction *i) const
 {
-   bool ret = true;
-   ret = ret && insnCheckCommutation(this, i);
-   ret = ret && insnCheckCommutation(i, this);
+   bool ret = insnCheckCommutationDefDef(this, i);
+   ret = ret && insnCheckCommutationDefSrc(this, i);
+   ret = ret && insnCheckCommutationDefSrc(i, this);
    return ret;
 }