aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2013-06-06 02:48:21 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2013-06-06 02:48:21 +0000
commit5e75e3f3fb693e4ff41b765358cdaa305b900168 (patch)
tree92cf8562d26f6ad111fd3a6a68a9e14e5f454604
parente5ecf9c5f118cdb163d7e353b6927ef02ee6a061 (diff)
downloadllvm-5e75e3f3fb693e4ff41b765358cdaa305b900168.zip
llvm-5e75e3f3fb693e4ff41b765358cdaa305b900168.tar.gz
llvm-5e75e3f3fb693e4ff41b765358cdaa305b900168.tar.bz2
independent blocks: when moving Values, invalidate SCEV cached info
Merged from: https://llvm.org/svn/llvm-project/polly/trunk@182310 llvm-svn: 183377
-rw-r--r--polly/lib/IndependentBlocks.cpp9
-rw-r--r--polly/test/IndependentBlocks/scev-invalidated.ll22
2 files changed, 28 insertions, 3 deletions
diff --git a/polly/lib/IndependentBlocks.cpp b/polly/lib/IndependentBlocks.cpp
index 7760b98..69d7942 100644
--- a/polly/lib/IndependentBlocks.cpp
+++ b/polly/lib/IndependentBlocks.cpp
@@ -160,8 +160,10 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R,
DEBUG(dbgs() << "Checking Operand of Node:\n" << *CurInst << "\n------>\n");
if (It == CurInst->op_end()) {
// Insert the new instructions in topological order.
- if (!CurInst->getParent())
+ if (!CurInst->getParent()) {
CurInst->insertBefore(InsertPos);
+ SE->forgetValue(CurInst);
+ }
WorkStack.pop_back();
} else {
@@ -213,8 +215,7 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R,
DEBUG(dbgs() << "Moved.\n");
Instruction *MovedOp = At->second;
It->set(MovedOp);
- // Skip all its children as we already processed them.
- continue;
+ SE->forgetValue(MovedOp);
} else {
// Note that NewOp is not inserted in any BB now, we will insert it when
// it popped form the work stack, so it will be inserted in topological
@@ -224,6 +225,8 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R,
DEBUG(dbgs() << "Move to " << *NewOp << "\n");
It->set(NewOp);
ReplacedMap.insert(std::make_pair(Operand, NewOp));
+ SE->forgetValue(Operand);
+
// Process its operands, but do not visit an instuction twice.
if (VisitedSet.insert(NewOp).second)
WorkStack.push_back(std::make_pair(NewOp, NewOp->op_begin()));
diff --git a/polly/test/IndependentBlocks/scev-invalidated.ll b/polly/test/IndependentBlocks/scev-invalidated.ll
new file mode 100644
index 0000000..18d888f
--- /dev/null
+++ b/polly/test/IndependentBlocks/scev-invalidated.ll
@@ -0,0 +1,22 @@
+; RUN: opt %loadPolly -polly-codegen-scev -polly-independent < %s
+target datalayout ="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @arc_either() {
+entry:
+ %ang2.2.reg2mem = alloca i64
+ br i1 undef, label %return, label %if.then6
+
+if.then6:
+ %rem7 = srem i64 undef, 1474560
+ br i1 false, label %if.else, label %return
+
+if.else:
+ %add16 = add nsw i64 %rem7, 1474560
+ %rem7.add16 = select i1 undef, i64 %rem7, i64 %add16
+ store i64 %rem7.add16, i64* %ang2.2.reg2mem
+ br label %return
+
+return:
+ ret void
+}