nv50/ir/opt: don't replace conditional definitions in CSE
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 7 Feb 2012 19:45:03 +0000 (20:45 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 14 Apr 2012 19:54:02 +0000 (21:54 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir.h
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp

index b582a468b31d969fd4d289d11b2d0cc5bcb00fa8..93e3008cf0df228a6acfea1561bab8c036e4359b 100644 (file)
@@ -616,6 +616,7 @@ public:
    bool setPredicate(CondCode ccode, Value *);
    inline Value *getPredicate() const;
    bool writesPredicate() const;
+   inline bool isPredicated() const { return predSrc >= 0; }
 
    inline void setFlagsSrc(int s, Value *);
    inline void setFlagsDef(int d, Value *);
index c2c33e20bf166f23d2d8e7d7479a2dd1509b7443..5f974436e9454ee83eeb12944115a99fe50f3f14 100644 (file)
@@ -2009,6 +2009,8 @@ GlobalCSE::visit(BasicBlock *bb)
    Instruction *phi, *next, *ik;
    int s;
 
+   // TODO: maybe do this with OP_UNION, too
+
    for (phi = bb->getPhi(); phi && phi->op == OP_PHI; phi = next) {
       next = phi->next;
       if (phi->getSrc(0)->refCount() > 1)
@@ -2040,8 +2042,14 @@ bool
 LocalCSE::tryReplace(Instruction **ptr, Instruction *i)
 {
    Instruction *old = *ptr;
+
+   // TODO: maybe relax this later (causes trouble with OP_UNION)
+   if (i->isPredicated())
+      return false;
+
    if (!old->isResultEqual(i))
       return false;
+
    for (int d = 0; old->defExists(d); ++d)
       old->def(d).replace(i->getDef(d), false);
    delete_Instruction(prog, old);
@@ -2241,6 +2249,7 @@ Program::optimizeSSA(int level)
    RUN_PASS(2, MemoryOpt, run);
    RUN_PASS(2, LocalCSE, run);
    RUN_PASS(0, DeadCodeElim, buryAll);
+
    return true;
 }