ScopDetection: Tighten the check for always executed 'error blocks'

Basic blocks that are always executed can not be error blocks as their execution
can not possibly be an unlikely event. In this commit we tighten the check
if an error block to basic blcoks that do not dominate the exit condition, but
that dominate all exiting blocks of the scop.

llvm-svn: 252726
This commit is contained in:
Tobias Grosser 2015-11-11 13:25:13 +00:00
parent b12b006c4b
commit e3d1f1c0b0
2 changed files with 70 additions and 1 deletions

View File

@ -352,7 +352,14 @@ bool polly::isErrorBlock(BasicBlock &BB, const Region &R, LoopInfo &LI,
if (LI.isLoopHeader(&BB))
return false;
if (DT.dominates(&BB, R.getExit()))
// Basic blocks that are always executed are not considered error blocks,
// as their execution can not be a rare event.
bool DominatesAllPredecessors = true;
for (auto Pred : predecessors(R.getExit()))
if (R.contains(Pred) && !DT.dominates(&BB, Pred))
DominatesAllPredecessors = false;
if (DominatesAllPredecessors)
return false;
// FIXME: This is a simple heuristic to determine if the load is executed

View File

@ -0,0 +1,62 @@
; RUN: opt %loadPolly -polly-code-generator=isl -polly-detect -analyze < %s \
; RUN: | FileCheck %s
;
; CHECK-NOT: Valid Region for Scop:
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.hoge = type { i32, i32, i32, i32 }
; Function Attrs: nounwind uwtable
define void @widget() #0 {
bb13:
%tmp1 = alloca %struct.hoge, align 4
br i1 undef, label %bb14, label %bb19
bb14: ; preds = %bb13
%tmp = load i32, i32* undef, align 4, !tbaa !1
call void @quux() #2
br i1 false, label %bb15, label %bb18
bb15: ; preds = %bb14
%tmp16 = getelementptr inbounds %struct.hoge, %struct.hoge* %tmp1, i64 0, i32 1
%tmp17 = getelementptr inbounds %struct.hoge, %struct.hoge* %tmp1, i64 0, i32 2
br label %bb19
bb18: ; preds = %bb14
br label %bb19
bb19: ; preds = %bb18, %bb15, %bb13
%tmp20 = phi i32 [ undef, %bb13 ], [ %tmp, %bb15 ], [ %tmp, %bb18 ]
unreachable
bb21: ; preds = %bb8
unreachable
bb22: ; preds = %bb8, %bb8, %bb8, %bb8
br label %bb23
bb23: ; preds = %bb22
unreachable
bb24: ; preds = %bb8, %bb8
unreachable
bb25: ; preds = %bb2
unreachable
}
declare void @quux() #1
attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.8.0 (trunk 252700) (llvm/trunk 252705)"}
!1 = !{!2, !2, i64 0}
!2 = !{!"int", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}