nv50/ir: fix size adjustment for sched info for multiple functions
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 28 Feb 2013 18:00:02 +0000 (19:00 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 12 Mar 2013 11:55:36 +0000 (12:55 +0100)
src/gallium/drivers/nv50/codegen/nv50_ir_target.cpp

index 92552a0efe5ddce6681658bd96183e5b733a4592..1b6d1830ee51ed1d8f9f384a1a057102cb0e0407 100644 (file)
@@ -197,18 +197,23 @@ CodeEmitter::prepareEmission(Program *prog)
 
       // adjust sizes & positions for schedulding info:
       if (prog->getTarget()->hasSWSched) {
+         uint32_t adjPos = func->binPos;
          BasicBlock *bb = NULL;
          for (int i = 0; i < func->bbCount; ++i) {
             bb = func->bbArray[i];
-            const uint32_t oldPos = bb->binPos;
-            const uint32_t oldEnd = bb->binPos + bb->binSize;
-            uint32_t adjPos = oldPos + sizeToBundlesNVE4(oldPos) * 8;
-            uint32_t adjEnd = oldEnd + sizeToBundlesNVE4(oldEnd) * 8;
+            int32_t adjSize = bb->binSize;
+            if (adjPos % 64) {
+               adjSize -= 64 - adjPos % 64;
+               if (adjSize < 0)
+                  adjSize = 0;
+            }
+            adjSize = bb->binSize + sizeToBundlesNVE4(adjSize) * 8;
             bb->binPos = adjPos;
-            bb->binSize = adjEnd - adjPos;
+            bb->binSize = adjSize;
+            adjPos += adjSize;
          }
          if (bb)
-            func->binSize = bb->binPos + bb->binSize;
+            func->binSize = adjPos - func->binPos;
       }
 
       prog->binSize += func->binSize;