Simplify branch handling. Prepare for proper decleration extraction.
authorZack Rusin <zack@tungstengraphics.com>
Wed, 24 Oct 2007 23:20:19 +0000 (19:20 -0400)
committerZack Rusin <zack@tungstengraphics.com>
Wed, 24 Oct 2007 23:20:32 +0000 (19:20 -0400)
src/mesa/pipe/llvm/instructions.cpp
src/mesa/pipe/llvm/llvmtgsi.cpp
src/mesa/pipe/llvm/storage.cpp
src/mesa/pipe/llvm/storage.h

index 6ded3f1249d1ec4eea7024c98713dbb409794f1b..622d420f64dcb4526e580dab1f8c28a83899cc3f 100644 (file)
@@ -968,7 +968,7 @@ void Instructions::ifop(llvm::Value *in)
                                                   m_block);
    FCmpInst *xcmp = new FCmpInst(FCmpInst::FCMP_UNE, x, float0,
                                  name("xcmp"), m_block);
-   new BranchInst(ifend, ifthen, xcmp, m_block);
+   new BranchInst(ifthen, ifend, xcmp, m_block);
    //m_block = yblock;
 
 
index b8e4e3931627e561b139d40af98d542ff6ca7fcb..ec284a624af24d90b568400edfa89987ff53d010 100644 (file)
@@ -139,9 +139,24 @@ static inline void AddStandardCompilePasses(PassManager &PM) {
 
 static void
 translate_declaration(llvm::Module *module,
+                      Storage *storage,
                       struct tgsi_full_declaration *decl,
                       struct tgsi_full_declaration *fd)
 {
+   if (decl->Declaration.File == TGSI_FILE_TEMPORARY) {
+      switch( decl->Declaration.Declare ) {
+      case TGSI_DECLARE_RANGE: {
+         int start = decl->u.DeclarationRange.First;
+         int end   = decl->u.DeclarationRange.Last;
+         for (int i = start; i <= end; ++i) {
+            storage->declareTemp(i);
+         }
+      }
+         break;
+      default:
+         assert( 0 );
+      }
+   }
 }
 
 
@@ -180,8 +195,10 @@ translate_instruction(llvm::Module *module,
          val = storage->inputElement(src->SrcRegister.Index, indIdx);
       } else if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) {
          val = storage->tempElement(src->SrcRegister.Index);
+      } else if (src->SrcRegister.File == TGSI_FILE_TEMPORARY) {
+         fprintf(stderr, "FIXME: do somethign with immediates?\n");
       } else {
-         fprintf(stderr, "ERROR: not supported llvm source\n");
+         fprintf(stderr, "ERROR: not supported llvm source %d\n", src->SrcRegister.File);
          return;
       }
 
@@ -447,7 +464,6 @@ translate_instruction(llvm::Module *module,
    case TGSI_OPCODE_ENDIF: {
       instr->endif();
       storage->setCurrentBlock(instr->currentBlock());
-      storage->popPhiNode();
       return; //just update the state
    }
       break;
@@ -642,7 +658,7 @@ tgsi_to_llvm(struct gallivm_prog *prog, const struct tgsi_token *tokens)
 
       switch (parse.FullToken.Token.Type) {
       case TGSI_TOKEN_TYPE_DECLARATION:
-         translate_declaration(mod,
+         translate_declaration(mod, &storage,
                                &parse.FullToken.FullDeclaration,
                                &fd);
          break;
index 75ee18567df6d20e7f176e8ead666b366023a9ba..6721f387c812536974ef74d386e7be1b1ba5fd99 100644 (file)
@@ -192,31 +192,29 @@ llvm::Value *Storage::shuffleVector(llvm::Value *vec, int shuffle)
 }
 
 
-llvm::Value *Storage::tempElement(int idx) const
+llvm::Value *Storage::tempElement(int idx)
 {
-   Value *ret = m_temps[idx];
-   if (!ret)
+   Value *ptr = m_temps[idx];
+   if (!ptr)
       return m_undefFloatVec;
-   return ret;
+   llvm::LoadInst *li = new LoadInst(ptr, name("temp"),
+                                     false, m_block);
+   li->setAlignment(8);
+   return li;
 }
 
 void Storage::setTempElement(int idx, llvm::Value *val, int mask)
 {
    if (mask != TGSI_WRITEMASK_XYZW) {
-      llvm::Value *templ = m_temps[idx];
+      llvm::Value *templ = 0;
+      if (m_temps[idx])
+         templ = tempElement(idx);
       val = maskWrite(val, mask, templ);
    }
-   llvm::Value *templ = m_temps[idx];
-   if (templ) {
-      BasicBlock *block = m_varBlocks[templ];
-      if (block != m_block) {
-         addPhiNode(idx, val, m_block, templ, block);
-      } else
-         updatePhiNode(idx, val);
-   }
-
-   m_temps[idx] = val;
-   m_varBlocks[val] = m_block;
+   llvm::Value *ptr = m_temps[idx];
+   assert(ptr);
+   StoreInst *st = new StoreInst(val, ptr, false, m_block);
+   st->setAlignment(8);
 }
 
 void Storage::store(int dstIdx, llvm::Value *val, int mask)
@@ -308,39 +306,7 @@ void Storage::setCurrentBlock(llvm::BasicBlock *block)
    m_block = block;
 }
 
-void Storage::addPhiNode(int idx, llvm::Value *val1, llvm::BasicBlock *blk1,
-                         llvm::Value *val2, llvm::BasicBlock *blk2)
-{
-   PhiNode node;
-   node.val1 = val1;
-   node.block1 = blk1;
-   node.val2 = val2;
-   node.block2 = blk2;
-   m_phiNodes[idx] = node;
-}
-
-void Storage::updatePhiNode(int idx, llvm::Value *val1)
-{
-   if (m_phiNodes.find(idx) == m_phiNodes.end())
-      return;
-   PhiNode node = m_phiNodes[idx];
-   node.val1 = val1;
-   m_phiNodes[idx] = node;
-}
-
-void Storage::popPhiNode()
+void Storage::declareTemp(int idx)
 {
-   if (!m_phiNodes.empty()) {
-      std::map<int, PhiNode>::const_iterator itr;
-      for (itr = m_phiNodes.begin(); itr != m_phiNodes.end(); ++itr) {
-         PhiNode node = (*itr).second;
-         PHINode *dest = new PHINode(m_floatVecType,
-                                     name("phiDest"), m_block);
-         dest->reserveOperandSpace(2);
-         dest->addIncoming(node.val1, node.block1);
-         dest->addIncoming(node.val2, node.block2);
-         m_temps[(*itr).first] = dest;
-      }
-   }
-   m_phiNodes.clear();
+    m_temps[idx] = new AllocaInst(m_floatVecType, name("temp"), m_block);
 }
index bc8cffdf66b561b4c4f952030b13abfb183f48cb..26b2579b07067d0ca187548c835f668417098379 100644 (file)
@@ -60,8 +60,9 @@ public:
    llvm::Value *inputElement(int idx, llvm::Value *indIdx =0);
    llvm::Value *constElement(int idx, llvm::Value *indIdx =0);
 
-   llvm::Value *tempElement(int idx) const;
+   llvm::Value *tempElement(int idx);
    void setTempElement(int idx, llvm::Value *val, int mask);
+   void declareTemp(int idx);
 
    llvm::Value *addrElement(int idx) const;
    void setAddrElement(int idx, llvm::Value *val, int mask);
@@ -72,8 +73,6 @@ public:
 
    void store(int dstIdx, llvm::Value *val, int mask);
 
-   void popPhiNode();
-
    int numConsts() const;
 private:
    llvm::Value *maskWrite(llvm::Value *src, int mask, llvm::Value *templ);
@@ -104,19 +103,6 @@ private:
    int         m_idx;
 
    int         m_numConsts;
-
-   void addPhiNode(int, llvm::Value*, llvm::BasicBlock*,
-                   llvm::Value*, llvm::BasicBlock*);
-   void updatePhiNode(int, llvm::Value*);
-   struct PhiNode {
-      llvm::Value      *val1;
-      llvm::BasicBlock *block1;
-      llvm::Value      *val2;
-      llvm::BasicBlock *block2;
-   };
-
-   std::map<llvm::Value*, llvm::BasicBlock*> m_varBlocks;
-   std::map<int, PhiNode> m_phiNodes;
 };
 
 #endif