[polly] r202000 - codegen: Update LoopInfo correctly

Tobias Grosser tobias at grosser.es
Sun Feb 23 16:50:50 PST 2014


Author: grosser
Date: Sun Feb 23 18:50:49 2014
New Revision: 202000

URL: http://llvm.org/viewvc/llvm-project?rev=202000&view=rev
Log:
codegen: Update LoopInfo correctly

Add the 'polly.start' basic block to the loop that surrounds the scop we just
codegenerate.

This fixes PR13441

Added:
    polly/trunk/test/Isl/CodeGen/create-conditional-scop.ll
Modified:
    polly/trunk/lib/CodeGen/Utils.cpp

Modified: polly/trunk/lib/CodeGen/Utils.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/Utils.cpp?rev=202000&r1=201999&r2=202000&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/Utils.cpp (original)
+++ polly/trunk/lib/CodeGen/Utils.cpp Sun Feb 23 18:50:49 2014
@@ -13,6 +13,7 @@
 
 #include "polly/CodeGen/Utils.h"
 #include "polly/ScopInfo.h"
+#include "llvm/Analysis/LoopInfo.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
@@ -26,6 +27,7 @@ BasicBlock *polly::executeScopConditiona
   DominatorTree &DT =
       PassInfo->getAnalysis<DominatorTreeWrapperPass>().getDomTree();
   RegionInfo &RI = PassInfo->getAnalysis<RegionInfo>();
+  LoopInfo &LI = PassInfo->getAnalysis<LoopInfo>();
 
   // Split the entry edge of the region and generate a new basic block on this
   // edge. This function also updates ScopInfo and RegionInfo.
@@ -58,6 +60,8 @@ BasicBlock *polly::executeScopConditiona
   SplitBlock->getTerminator()->eraseFromParent();
   Builder.SetInsertPoint(SplitBlock);
   Builder.CreateCondBr(Builder.getTrue(), StartBlock, R.getEntry());
+  if (Loop *L = LI.getLoopFor(SplitBlock))
+    L->addBasicBlockToLoop(StartBlock, LI.getBase());
   DT.addNewBlock(StartBlock, SplitBlock);
   Builder.SetInsertPoint(StartBlock);
 

Added: polly/trunk/test/Isl/CodeGen/create-conditional-scop.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/create-conditional-scop.ll?rev=202000&view=auto
==============================================================================
--- polly/trunk/test/Isl/CodeGen/create-conditional-scop.ll (added)
+++ polly/trunk/test/Isl/CodeGen/create-conditional-scop.ll Sun Feb 23 18:50:49 2014
@@ -0,0 +1,29 @@
+; RUN: opt %loadPolly -basicaa -polly-codegen-isl -verify-loop-info < %s -S | FileCheck %s
+
+target datalayout = "e-p:32:32:32-i64:64:64-i32:32:32-i16:16:16-i1:32:32-f64:64:64-f32:32:32-a0:0-n32"
+target triple = "hexagon-unknown-linux-gnu"
+
+; This test case used to fail, because we did not add the newly generated basic
+; block %polly.start as a basic block to the surrounding loop.
+define void @foo() nounwind {
+entry:
+  br i1 undef, label %while.cond14.preheader, label %for.body7.single_entry.single_entry
+
+while.cond14.preheader:                           ; preds = %for.inc12, %for.body7.single_entry.single_entry, %entry
+  ret void
+
+for.body7.single_entry.single_entry:              ; preds = %for.inc12, %entry
+  br i1 undef, label %while.cond14.preheader, label %while.body
+
+while.body:                                       ; preds = %while.body, %for.body7.single_entry.single_entry
+  %indvar35 = phi i32 [ %0, %while.body ], [ 0, %for.body7.single_entry.single_entry ]
+  %0 = add i32 %indvar35, 1
+  %exitcond2 = icmp eq i32 %0, 0
+  br i1 %exitcond2, label %for.inc12, label %while.body
+
+for.inc12:                                        ; preds = %while.body
+  br i1 undef, label %while.cond14.preheader, label %for.body7.single_entry.single_entry
+}
+
+; CHECK: polly.split_new_and_old
+; CHECK: br i1 true, label %polly.start, label %while.body





More information about the llvm-commits mailing list