[llvm-commits] [polly] r150431 - /polly/trunk/lib/CodeGeneration.cpp

Tobias Grosser grosser at fim.uni-passau.de
Mon Feb 13 15:31:44 PST 2012


Author: grosser
Date: Mon Feb 13 17:31:43 2012
New Revision: 150431

URL: http://llvm.org/viewvc/llvm-project?rev=150431&view=rev
Log:
Revert "CodeGen: Maintain a valid CFG during code generation"

This commit contained some bugs. Revert it until I get around to fix them.

Modified:
    polly/trunk/lib/CodeGeneration.cpp

Modified: polly/trunk/lib/CodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGeneration.cpp?rev=150431&r1=150430&r2=150431&view=diff
==============================================================================
--- polly/trunk/lib/CodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGeneration.cpp Mon Feb 13 17:31:43 2012
@@ -97,18 +97,18 @@
 // @param UB      The upper bound of the loop iv.
 // @param Stride  The number by which the loop iv is incremented after every
 //                iteration.
-static Value *createLoop(IRBuilder<> *Builder, Value *LB, Value *UB,
-                         APInt Stride, DominatorTree *DT, Pass *P) {
+static void createLoop(IRBuilder<> *Builder, Value *LB, Value *UB, APInt Stride,
+                PHINode*& IV, BasicBlock*& AfterBB, Value*& IncrementedIV,
+                DominatorTree *DT) {
   Function *F = Builder->GetInsertBlock()->getParent();
   LLVMContext &Context = F->getContext();
 
   BasicBlock *PreheaderBB = Builder->GetInsertBlock();
   BasicBlock *HeaderBB = BasicBlock::Create(Context, "polly.loop_header", F);
   BasicBlock *BodyBB = BasicBlock::Create(Context, "polly.loop_body", F);
-  BasicBlock *AfterBB = SplitBlock(PreheaderBB, Builder->GetInsertPoint()++, P);
-  AfterBB->setName("polly.loop_after");
+  AfterBB = BasicBlock::Create(Context, "polly.after_loop", F);
 
-  PreheaderBB->getTerminator()->setSuccessor(0, HeaderBB);
+  Builder->CreateBr(HeaderBB);
   DT->addNewBlock(HeaderBB, PreheaderBB);
 
   Builder->SetInsertPoint(HeaderBB);
@@ -121,35 +121,27 @@
   assert(LoopIVType && "UB is not integer?");
 
   // IV
-  PHINode *IV = Builder->CreatePHI(LoopIVType, 2, "polly.loopiv");
+  IV = Builder->CreatePHI(LoopIVType, 2, "polly.loopiv");
   IV->addIncoming(LB, PreheaderBB);
 
   // IV increment.
   Value *StrideValue = ConstantInt::get(LoopIVType,
                                         Stride.zext(LoopIVType->getBitWidth()));
-  Value *IncrementedIV = Builder->CreateAdd(IV, StrideValue,
-                                            "polly.next_loopiv");
+  IncrementedIV = Builder->CreateAdd(IV, StrideValue, "polly.next_loopiv");
 
   // Exit condition.
-  Value *CMP;
   if (AtLeastOnce) { // At least on iteration.
     UB = Builder->CreateAdd(UB, Builder->getInt64(1));
-    CMP = Builder->CreateICmpNE(IV, UB);
+    Value *CMP = Builder->CreateICmpEQ(IV, UB);
+    Builder->CreateCondBr(CMP, AfterBB, BodyBB);
   } else { // Maybe not executed at all.
-    CMP = Builder->CreateICmpSLE(IV, UB);
+    Value *CMP = Builder->CreateICmpSLE(IV, UB);
+    Builder->CreateCondBr(CMP, BodyBB, AfterBB);
   }
-
-  Builder->CreateCondBr(CMP, BodyBB, AfterBB);
   DT->addNewBlock(BodyBB, HeaderBB);
+  DT->addNewBlock(AfterBB, HeaderBB);
 
   Builder->SetInsertPoint(BodyBB);
-  Builder->CreateBr(HeaderBB);
-  IV->addIncoming(IncrementedIV, BodyBB);
-  DT->changeImmediateDominator(AfterBB, HeaderBB);
-
-  Builder->SetInsertPoint(BodyBB->begin());
-
-  return IV;
 }
 
 class BlockGenerator {
@@ -271,7 +263,7 @@
   //                is used to update the operands of the statements.
   //                For new statements a relation old->new is inserted in this
   //                map.
-  void copyBB(BasicBlock *BB, Pass *P);
+  void copyBB(BasicBlock *BB, DominatorTree *DT);
 };
 
 BlockGenerator::BlockGenerator(IRBuilder<> &B, ValueMapT &vmap,
@@ -699,11 +691,15 @@
   copyInstScalar(Inst, BBMap);
 }
 
-void BlockGenerator::copyBB(BasicBlock *BB, Pass *P) {
-  BasicBlock *CopyBB = SplitBlock(Builder.GetInsertBlock(),
-                                  Builder.GetInsertPoint(), P);
-  CopyBB->setName("polly." + BB->getName() + ".stmt");
-  Builder.SetInsertPoint(CopyBB->begin());
+void BlockGenerator::copyBB(BasicBlock *BB, DominatorTree *DT) {
+  Function *F = Builder.GetInsertBlock()->getParent();
+  LLVMContext &Context = F->getContext();
+  BasicBlock *CopyBB = BasicBlock::Create(Context,
+                                          "polly." + BB->getName() + ".stmt",
+                                          F);
+  Builder.CreateBr(CopyBB);
+  DT->addNewBlock(CopyBB, Builder.GetInsertBlock());
+  Builder.SetInsertPoint(CopyBB);
 
   // Create two maps that store the mapping from the original instructions of
   // the old basic block to their copies in the new basic block. Those maps
@@ -893,7 +889,6 @@
   ScopDetection *SD;
   Dependences *DP;
   TargetData *TD;
-  Pass *P;
 
   // The Builder specifies the current location to code generate at.
   IRBuilder<> &Builder;
@@ -1003,7 +998,7 @@
 
   ClastStmtCodeGen(Scop *scop, ScalarEvolution &se, DominatorTree *dt,
                    ScopDetection *sd, Dependences *dp, TargetData *td,
-                   IRBuilder<> &B, Pass *P);
+                   IRBuilder<> &B);
 };
 }
 
@@ -1074,7 +1069,7 @@
 
   BlockGenerator Generator(Builder, ValueMap, VectorValueMap, *Statement,
                            scatteringDomain);
-  Generator.copyBB(BB, P);
+  Generator.copyBB(BB, DT);
 }
 
 void ClastStmtCodeGen::codegen(const clast_block *b) {
@@ -1086,6 +1081,9 @@
                                             Value *LowerBound,
                                             Value *UpperBound) {
   APInt Stride;
+  PHINode *IV;
+  Value *IncrementedIV;
+  BasicBlock *AfterBB, *HeaderBB, *LastBodyBB;
   Type *IntPtrTy;
 
   Stride = APInt_from_MPZ(f->stride);
@@ -1101,7 +1099,8 @@
     UpperBound = ExpGen.codegen(f->UB, IntPtrTy);
   }
 
-  Value *IV = createLoop(&Builder, LowerBound, UpperBound, Stride, DT, P);
+  createLoop(&Builder, LowerBound, UpperBound, Stride, IV, AfterBB,
+             IncrementedIV, DT);
 
   // Add loop iv to symbols.
   (*clastVars)[f->iterator] = IV;
@@ -1111,6 +1110,12 @@
 
   // Loop is finished, so remove its iv from the live symbols.
   clastVars->erase(f->iterator);
+
+  HeaderBB = *pred_begin(AfterBB);
+  LastBodyBB = Builder.GetInsertBlock();
+  Builder.CreateBr(HeaderBB);
+  IV->addIncoming(IncrementedIV, LastBodyBB);
+  Builder.SetInsertPoint(AfterBB);
 }
 
 Function *ClastStmtCodeGen::addOpenMPSubfunction(Module *M) {
@@ -1197,7 +1202,6 @@
   IntegerType *intPtrTy = TD->getIntPtrType(Context);
 
   // Store the previous basic block.
-  BasicBlock::iterator PrevInsertPoint = Builder.GetInsertPoint();
   BasicBlock *PrevBB = Builder.GetInsertBlock();
 
   // Create basic blocks.
@@ -1251,22 +1255,22 @@
   clastVars = &clastVarsOMP;
   ExpGen.setIVS(&clastVarsOMP);
 
-  Builder.CreateBr(checkNextBB);
-  Builder.SetInsertPoint(--Builder.GetInsertPoint());
   codegenForSequential(f, lowerBound, upperBound);
 
   // Restore the old clastVars.
   clastVars = oldClastVars;
   ExpGen.setIVS(oldClastVars);
 
+  Builder.CreateBr(checkNextBB);
+
   // Add code to terminate this openmp subfunction.
   Builder.SetInsertPoint(ExitBB);
   Function *endnowaitFunction = M->getFunction("GOMP_loop_end_nowait");
   Builder.CreateCall(endnowaitFunction);
   Builder.CreateRetVoid();
 
-  // Restore the previous insert point.
-  Builder.SetInsertPoint(PrevInsertPoint);
+  // Restore the builder back to previous basic block.
+  Builder.SetInsertPoint(PrevBB);
 }
 
 void ClastStmtCodeGen::codegenForOpenMP(const clast_for *f) {
@@ -1440,20 +1444,10 @@
 void ClastStmtCodeGen::codegen(const clast_guard *g) {
   Function *F = Builder.GetInsertBlock()->getParent();
   LLVMContext &Context = F->getContext();
-
-  BasicBlock *CondBB = SplitBlock(Builder.GetInsertBlock(),
-                                      Builder.GetInsertPoint(), P);
-  CondBB->setName("polly.cond");
-  BasicBlock *MergeBB = SplitBlock(CondBB, CondBB->begin(), P);
-  MergeBB->setName("polly.merge");
   BasicBlock *ThenBB = BasicBlock::Create(Context, "polly.then", F);
-
-  DT->addNewBlock(ThenBB, CondBB);
-  DT->changeImmediateDominator(MergeBB, CondBB);
-
-  CondBB->getTerminator()->eraseFromParent();
-
-  Builder.SetInsertPoint(CondBB);
+  BasicBlock *MergeBB = BasicBlock::Create(Context, "polly.merge", F);
+  DT->addNewBlock(ThenBB, Builder.GetInsertBlock());
+  DT->addNewBlock(MergeBB, Builder.GetInsertBlock());
 
   Value *Predicate = codegen(&(g->eq[0]));
 
@@ -1464,10 +1458,11 @@
 
   Builder.CreateCondBr(Predicate, ThenBB, MergeBB);
   Builder.SetInsertPoint(ThenBB);
-  Builder.CreateBr(MergeBB);
-  Builder.SetInsertPoint(ThenBB->begin());
 
   codegen(g->then);
+
+  Builder.CreateBr(MergeBB);
+  Builder.SetInsertPoint(MergeBB);
 }
 
 void ClastStmtCodeGen::codegen(const clast_stmt *stmt) {
@@ -1491,6 +1486,12 @@
 void ClastStmtCodeGen::addParameters(const CloogNames *names) {
   SCEVExpander Rewriter(SE, "polly");
 
+  // Create an instruction that specifies the location where the parameters
+  // are expanded.
+  CastInst::CreateIntegerCast(ConstantInt::getTrue(Builder.getContext()),
+                              Builder.getInt16Ty(), false, "insertInst",
+                              Builder.GetInsertBlock());
+
   int i = 0;
   for (Scop::param_iterator PI = S->param_begin(), PE = S->param_end();
        PI != PE; ++PI) {
@@ -1524,8 +1525,8 @@
 ClastStmtCodeGen::ClastStmtCodeGen(Scop *scop, ScalarEvolution &se,
                                    DominatorTree *dt, ScopDetection *sd,
                                    Dependences *dp, TargetData *td,
-                                  IRBuilder<> &B, Pass *P) :
-    S(scop), SE(se), DT(dt), SD(sd), DP(dp), TD(td), P(P), Builder(B),
+                                  IRBuilder<> &B) :
+    S(scop), SE(se), DT(dt), SD(sd), DP(dp), TD(td), Builder(B),
     ExpGen(Builder, NULL) {}
 
 namespace {
@@ -1721,12 +1722,8 @@
 
     // The builder will be set to startBlock.
     BasicBlock *splitBlock = addSplitAndStartBlock(&builder);
-    BasicBlock *StartBlock = builder.GetInsertBlock();
-
-    mergeControlFlow(splitBlock, &builder);
-    builder.SetInsertPoint(StartBlock->begin());
 
-    ClastStmtCodeGen CodeGen(S, *SE, DT, SD, DP, TD, builder, this);
+    ClastStmtCodeGen CodeGen(S, *SE, DT, SD, DP, TD, builder);
     CloogInfo &C = getAnalysis<CloogInfo>();
     CodeGen.codegen(C.getClast());
 
@@ -1734,6 +1731,8 @@
                          CodeGen.getParallelLoops().begin(),
                          CodeGen.getParallelLoops().end());
 
+    mergeControlFlow(splitBlock, &builder);
+
     return true;
   }
 





More information about the llvm-commits mailing list