diff options
| -rw-r--r-- | polly/lib/IndependentBlocks.cpp | 12 | ||||
| -rw-r--r-- | polly/test/ScopInfo/independent-blocks-never-stop-on-big-scop.ll | 201 |
2 files changed, 208 insertions, 5 deletions
diff --git a/polly/lib/IndependentBlocks.cpp b/polly/lib/IndependentBlocks.cpp index 8de9762fb8a..fe78ef3f694 100644 --- a/polly/lib/IndependentBlocks.cpp +++ b/polly/lib/IndependentBlocks.cpp @@ -159,6 +159,7 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R, std::vector<std::pair<Instruction*, ChildIt> > WorkStack; WorkStack.push_back(std::make_pair(Inst, Inst->op_begin())); + DenseSet<Instruction*> VisitedSet; while (!WorkStack.empty()) { Instruction *CurInst = WorkStack.back().first; @@ -204,11 +205,11 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R, // Do not need to move instruction if it contained in the same BB with // the root instruction. - // FIXME: Remember this in visited Map. if (Operand->getParent() == CurBB) { DEBUG(dbgs() << "No need to move.\n"); - // Try to move its operand. - WorkStack.push_back(std::make_pair(Operand, Operand->op_begin())); + // Try to move its operand, but do not visit an instuction twice. + if (VisitedSet.insert(Operand).second) + WorkStack.push_back(std::make_pair(Operand, Operand->op_begin())); continue; } @@ -230,8 +231,9 @@ void IndependentBlocks::moveOperandTree(Instruction *Inst, const Region *R, DEBUG(dbgs() << "Move to " << *NewOp << "\n"); It->set(NewOp); ReplacedMap.insert(std::make_pair(Operand, NewOp)); - // Process its operands. - WorkStack.push_back(std::make_pair(NewOp, NewOp->op_begin())); + // 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/ScopInfo/independent-blocks-never-stop-on-big-scop.ll b/polly/test/ScopInfo/independent-blocks-never-stop-on-big-scop.ll new file mode 100644 index 00000000000..f6a73ec1f56 --- /dev/null +++ b/polly/test/ScopInfo/independent-blocks-never-stop-on-big-scop.ll @@ -0,0 +1,201 @@ +; RUN: opt %loadPolly %defaultOpts -polly-independent %s +; ModuleID = '/tmp/webcompile/_31514_0.bc' +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 i32 @main() nounwind uwtable readnone { + %arr = alloca [100 x i32], align 16 + br label %1 + +; <label>:1 ; preds = %1, %0 + %indvars.iv3 = phi i64 [ 0, %0 ], [ %indvars.iv.next4, %1 ] + %2 = getelementptr inbounds [100 x i32]* %arr, i64 0, i64 %indvars.iv3 + %3 = trunc i64 %indvars.iv3 to i32 + store i32 %3, i32* %2, align 4, !tbaa !0 + %indvars.iv.next4 = add i64 %indvars.iv3, 1 + %lftr.wideiv5 = trunc i64 %indvars.iv.next4 to i32 + %exitcond6 = icmp eq i32 %lftr.wideiv5, 100 + br i1 %exitcond6, label %.preheader, label %1 + +.preheader: ; preds = %.preheader, %1 + %indvars.iv = phi i64 [ %indvars.iv.next, %.preheader ], [ 0, %1 ] + %4 = getelementptr inbounds [100 x i32]* %arr, i64 0, i64 %indvars.iv + %5 = load i32* %4, align 4, !tbaa !0 + %6 = xor i32 %5, -1 + %7 = shl i32 %5, 15 + %8 = add nsw i32 %7, %6 + %9 = ashr i32 %8, 12 + %10 = xor i32 %9, %8 + %11 = mul i32 %10, 9 + %12 = ashr i32 %11, 4 + %13 = xor i32 %12, %11 + %14 = mul nsw i32 %13, 20571 + %15 = ashr i32 %14, 16 + %16 = xor i32 %15, %14 + %17 = xor i32 %16, -1 + %18 = shl i32 %16, 15 + %19 = add nsw i32 %18, %17 + %20 = ashr i32 %19, 12 + %21 = xor i32 %20, %19 + %22 = mul i32 %21, 5 + %23 = ashr i32 %22, 4 + %24 = xor i32 %23, %22 + %25 = mul nsw i32 %24, 20576 + %26 = ashr i32 %25, 16 + %27 = xor i32 %26, %25 + %28 = xor i32 %27, -1 + %29 = shl i32 %27, 15 + %30 = add nsw i32 %29, %28 + %31 = ashr i32 %30, 12 + %32 = xor i32 %31, %30 + %33 = mul i32 %32, 5 + %34 = ashr i32 %33, 4 + %35 = xor i32 %34, %33 + %36 = mul nsw i32 %35, 2057 + %37 = ashr i32 %36, 16 + %38 = xor i32 %37, %36 + %39 = xor i32 %38, -1 + %40 = shl i32 %38, 15 + %41 = add nsw i32 %40, %39 + %42 = ashr i32 %41, 12 + %43 = xor i32 %42, %41 + %44 = mul i32 %43, 5 + %45 = ashr i32 %44, 4 + %46 = xor i32 %45, %44 + %47 = mul nsw i32 %46, 20572 + %48 = ashr i32 %47, 16 + %49 = xor i32 %48, %47 + %50 = xor i32 %49, -1 + %51 = shl i32 %49, 15 + %52 = add nsw i32 %51, %50 + %53 = ashr i32 %52, 12 + %54 = xor i32 %53, %52 + %55 = mul i32 %54, 5 + %56 = ashr i32 %55, 4 + %57 = xor i32 %56, %55 + %58 = mul nsw i32 %57, 2051 + %59 = ashr i32 %58, 16 + %60 = xor i32 %59, %58 + %61 = xor i32 %60, -1 + %62 = shl i32 %60, 15 + %63 = add nsw i32 %62, %61 + %64 = ashr i32 %63, 12 + %65 = xor i32 %64, %63 + %66 = mul i32 %65, 5 + %67 = ashr i32 %66, 4 + %68 = xor i32 %67, %66 + %69 = mul nsw i32 %68, 2057 + %70 = ashr i32 %69, 16 + %71 = xor i32 %70, %69 + %72 = xor i32 %71, -1 + %73 = shl i32 %71, 15 + %74 = add nsw i32 %73, %72 + %75 = ashr i32 %74, 12 + %76 = xor i32 %75, %74 + %77 = mul i32 %76, 5 + %78 = ashr i32 %77, 4 + %79 = xor i32 %78, %77 + %80 = mul nsw i32 %79, 205 + %81 = ashr i32 %80, 17 + %82 = xor i32 %81, %80 + %83 = xor i32 %82, -1 + %84 = shl i32 %82, 15 + %85 = add nsw i32 %84, %83 + %86 = ashr i32 %85, 12 + %87 = xor i32 %86, %85 + %88 = mul i32 %87, 5 + %89 = ashr i32 %88, 4 + %90 = xor i32 %89, %88 + %91 = mul nsw i32 %90, 2057 + %92 = ashr i32 %91, 16 + %93 = xor i32 %92, %91 + %94 = xor i32 %93, -1 + %95 = shl i32 %93, 15 + %96 = add nsw i32 %95, %94 + %97 = ashr i32 %96, 12 + %98 = xor i32 %97, %96 + %99 = mul i32 %98, 5 + %100 = ashr i32 %99, 3 + %101 = xor i32 %100, %99 + %102 = mul nsw i32 %101, 20571 + %103 = ashr i32 %102, 16 + %104 = xor i32 %103, %102 + %105 = xor i32 %104, -1 + %106 = shl i32 %104, 15 + %107 = add nsw i32 %106, %105 + %108 = ashr i32 %107, 12 + %109 = xor i32 %108, %107 + %110 = mul i32 %109, 5 + %111 = ashr i32 %110, 4 + %112 = xor i32 %111, %110 + %113 = mul nsw i32 %112, 2057 + %114 = ashr i32 %113, 16 + %115 = xor i32 %114, %113 + %116 = xor i32 %115, -1 + %117 = shl i32 %115, 15 + %118 = add nsw i32 %117, %116 + %119 = ashr i32 %118, 12 + %120 = xor i32 %119, %118 + %121 = mul i32 %120, 5 + %122 = ashr i32 %121, 4 + %123 = xor i32 %122, %121 + %124 = mul nsw i32 %123, 20572 + %125 = ashr i32 %124, 16 + %126 = xor i32 %125, %124 + %127 = xor i32 %126, -1 + %128 = shl i32 %126, 15 + %129 = add nsw i32 %128, %127 + %130 = ashr i32 %129, 12 + %131 = xor i32 %130, %129 + %132 = mul i32 %131, 5 + %133 = ashr i32 %132, 4 + %134 = xor i32 %133, %132 + %135 = mul nsw i32 %134, 2057 + %136 = ashr i32 %135, 16 + %137 = xor i32 %136, %135 + %138 = xor i32 %137, -1 + %139 = shl i32 %137, 15 + %140 = add nsw i32 %139, %138 + %141 = ashr i32 %140, 12 + %142 = xor i32 %141, %140 + %143 = mul i32 %142, 5 + %144 = ashr i32 %143, 4 + %145 = xor i32 %144, %143 + %146 = mul nsw i32 %145, 2057 + %147 = ashr i32 %146, 16 + %148 = xor i32 %147, %146 + %149 = xor i32 %148, -1 + %150 = shl i32 %148, 15 + %151 = add nsw i32 %150, %149 + %152 = ashr i32 %151, 12 + %153 = xor i32 %152, %151 + %154 = mul i32 %153, 5 + %155 = ashr i32 %154, 4 + %156 = xor i32 %155, %154 + %157 = mul nsw i32 %156, 2057 + %158 = ashr i32 %157, 16 + %159 = xor i32 %158, %157 + %160 = xor i32 %159, -1 + %161 = shl i32 %159, 15 + %162 = add nsw i32 %161, %160 + %163 = ashr i32 %162, 12 + %164 = xor i32 %163, %162 + %165 = mul i32 %164, 5 + %166 = ashr i32 %165, 4 + %167 = xor i32 %166, %165 + %168 = mul nsw i32 %167, 2057 + %169 = ashr i32 %168, 16 + %170 = xor i32 %169, %168 + store i32 %170, i32* %4, align 4, !tbaa !0 + %indvars.iv.next = add i64 %indvars.iv, 1 + %lftr.wideiv = trunc i64 %indvars.iv.next to i32 + %exitcond = icmp eq i32 %lftr.wideiv, 100 + br i1 %exitcond, label %171, label %.preheader + +; <label>:171 ; preds = %.preheader + ret i32 0 +} + +!0 = metadata !{metadata !"int", metadata !1} +!1 = metadata !{metadata !"omnipotent char", metadata !2} +!2 = metadata !{metadata !"Simple C/C++ TBAA", null} |

