Index: lib/Support/ScopHelper.cpp =================================================================== --- lib/Support/ScopHelper.cpp +++ lib/Support/ScopHelper.cpp @@ -473,9 +473,15 @@ return false; bool DominatesAllPredecessors = true; - for (auto Pred : predecessors(R.getExit())) - if (R.contains(Pred) && !DT.dominates(&BB, Pred)) - DominatesAllPredecessors = false; + if (R.isTopLevelRegion()) { + for (BasicBlock &I : *R.getEntry()->getParent()) + if (isa(I.getTerminator()) && !DT.dominates(&BB, &I)) + DominatesAllPredecessors = false; + } else { + for (auto Pred : predecessors(R.getExit())) + if (R.contains(Pred) && !DT.dominates(&BB, Pred)) + DominatesAllPredecessors = false; + } if (!DominatesAllPredecessors) continue; Index: test/ScopDetect/tlr_is_hoistable_load.ll =================================================================== --- /dev/null +++ test/ScopDetect/tlr_is_hoistable_load.ll @@ -0,0 +1,55 @@ +; RUN: opt %loadPolly -analyze -polly-scops -polly-process-unprofitable \ +; RUN: -polly-invariant-load-hoisting -polly-scops \ +; RUN: -polly-detect-full-functions < %s | FileCheck %s +; +; void test() { +; int A[] = {1, 2, 3, 4, 5}; +; int len = (sizeof A) / sizeof(int); +; for (int i = 0; i < len; ++i) { +; A[i] = A[i] * 2; +; } +; } +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +@test.A = private unnamed_addr constant [5 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5], align 16 + +define void @test() { +entry: + %A = alloca [5 x i32], align 16 + %len = alloca i32, align 4 + %i = alloca i32, align 4 + %0 = bitcast [5 x i32]* %A to i8* + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast ([5 x i32]* @test.A to i8*), i64 20, i32 16, i1 false) + store i32 5, i32* %len, align 4 + store i32 0, i32* %i, align 4 + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %1 = load i32, i32* %i, align 4 + %2 = load i32, i32* %len, align 4 + %cmp = icmp slt i32 %1, %2 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + %3 = load i32, i32* %i, align 4 + %idxprom = sext i32 %3 to i64 + %arrayidx = getelementptr inbounds [5 x i32], [5 x i32]* %A, i64 0, i64 %idxprom + %4 = load i32, i32* %arrayidx, align 4 + %mul = mul nsw i32 %4, 2 + %5 = load i32, i32* %i, align 4 + %idxprom1 = sext i32 %5 to i64 + %arrayidx2 = getelementptr inbounds [5 x i32], [5 x i32]* %A, i64 0, i64 %idxprom1 + store i32 %mul, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %for.body + %6 = load i32, i32* %i, align 4 + %inc = add nsw i32 %6, 1 + store i32 %inc, i32* %i, align 4 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #1 \ No newline at end of file