diff options
author | Tobias Grosser <grosser@fim.uni-passau.de> | 2013-06-06 02:48:21 +0000 |
---|---|---|
committer | Tobias Grosser <grosser@fim.uni-passau.de> | 2013-06-06 02:48:21 +0000 |
commit | 5e75e3f3fb693e4ff41b765358cdaa305b900168 (patch) | |
tree | 92cf8562d26f6ad111fd3a6a68a9e14e5f454604 | |
parent | e5ecf9c5f118cdb163d7e353b6927ef02ee6a061 (diff) | |
download | llvm-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.cpp | 9 | ||||
-rw-r--r-- | polly/test/IndependentBlocks/scev-invalidated.ll | 22 |
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 +} |