forked from OSchip/llvm-project
ScopDetection: Do not allow blocks to reference operands in error blocks
r252713 introduced a couple of regressions due to later basic blocks refering to instructions defined in error blocks which have not yet been modeled. This commit is currently just encoding limitations of our modeling and code generation backends to ensure correctness. In theory, we should be able to generate and optimize such regions, as everything that is dominated by an error region is assumed to not be executed anyhow. We currently just lack the code to make this happen in practice. llvm-svn: 252725
This commit is contained in:
parent
e76a7c41e9
commit
b12b006c4b
|
@ -729,6 +729,16 @@ bool ScopDetection::isValidMemoryAccess(Instruction &Inst,
|
|||
|
||||
bool ScopDetection::isValidInstruction(Instruction &Inst,
|
||||
DetectionContext &Context) const {
|
||||
for (auto &Op : Inst.operands()) {
|
||||
auto *OpInst = dyn_cast<Instruction>(&Op);
|
||||
|
||||
if (!OpInst)
|
||||
continue;
|
||||
|
||||
if (isErrorBlock(*OpInst->getParent(), Context.CurRegion, *LI, *DT))
|
||||
return false;
|
||||
}
|
||||
|
||||
// We only check the call instruction but not invoke instruction.
|
||||
if (CallInst *CI = dyn_cast<CallInst>(&Inst)) {
|
||||
if (isValidCallInst(*CI))
|
||||
|
|
|
@ -368,6 +368,9 @@ bool polly::isErrorBlock(BasicBlock &BB, const Region &R, LoopInfo &LI,
|
|||
|
||||
for (Instruction &Inst : BB)
|
||||
if (CallInst *CI = dyn_cast<CallInst>(&Inst)) {
|
||||
if (isIgnoredIntrinsic(CI))
|
||||
return false;
|
||||
|
||||
if (!CI->doesNotAccessMemory())
|
||||
return true;
|
||||
if (CI->doesNotReturn())
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
; 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"
|
||||
|
||||
; Function Attrs: nounwind uwtable
|
||||
define void @hoge() #0 {
|
||||
bb:
|
||||
br label %bb1
|
||||
|
||||
bb1: ; preds = %bb
|
||||
br i1 undef, label %bb2, label %bb7
|
||||
|
||||
bb2: ; preds = %bb1
|
||||
%tmp = load i32, i32* undef, align 8, !tbaa !1
|
||||
%tmp3 = tail call i32 @widget() #2
|
||||
br i1 false, label %bb4, label %bb5
|
||||
|
||||
bb4: ; preds = %bb2
|
||||
br label %bb8
|
||||
|
||||
bb5: ; preds = %bb2
|
||||
%tmp6 = sub i32 %tmp, %tmp3
|
||||
br label %bb8
|
||||
|
||||
bb7: ; preds = %bb1
|
||||
br label %bb8
|
||||
|
||||
bb8: ; preds = %bb7, %bb5, %bb4
|
||||
ret void
|
||||
}
|
||||
|
||||
; Function Attrs: inlinehint nounwind readonly uwtable
|
||||
declare i32 @widget() #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 = { inlinehint nounwind readonly 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 #2 = { nounwind readonly }
|
||||
|
||||
!llvm.ident = !{!0}
|
||||
|
||||
!0 = !{!"clang version 3.8.0 (trunk 252700) (llvm/trunk 252705)"}
|
||||
!1 = !{!2, !7, i64 8}
|
||||
!2 = !{!"cli_target_info", !3, i64 0, !6, i64 8, !4, i64 32}
|
||||
!3 = !{!"long", !4, i64 0}
|
||||
!4 = !{!"omnipotent char", !5, i64 0}
|
||||
!5 = !{!"Simple C/C++ TBAA"}
|
||||
!6 = !{!"cli_exe_info", !7, i64 0, !8, i64 4, !3, i64 8, !9, i64 16}
|
||||
!7 = !{!"int", !4, i64 0}
|
||||
!8 = !{!"short", !4, i64 0}
|
||||
!9 = !{!"any pointer", !4, i64 0}
|
Loading…
Reference in New Issue