Commit 5e75e3f3 authored by Tobias Grosser's avatar Tobias Grosser
Browse files

independent blocks: when moving Values, invalidate SCEV cached info

parent e5ecf9c5
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -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()));
+22 −0
Original line number Diff line number Diff line
; 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
}