forked from OSchip/llvm-project
Fixed assertion in SROA if block has ho successors
BasicBlock::isLegalToHoistInto() asserts if block does not have successors. The case is degenarate but assertion still needs to be avoided. https://bugs.llvm.org/show_bug.cgi?id=46280 Differential Revision: https://reviews.llvm.org/D81674
This commit is contained in:
parent
c525168190
commit
a98d618f6e
|
@ -3481,6 +3481,7 @@ private:
|
||||||
llvm::any_of(PHI->incoming_values(), [](Value *In)
|
llvm::any_of(PHI->incoming_values(), [](Value *In)
|
||||||
{ Instruction *I = dyn_cast<Instruction>(In);
|
{ Instruction *I = dyn_cast<Instruction>(In);
|
||||||
return !I || isa<GetElementPtrInst>(I) || isa<PHINode>(I) ||
|
return !I || isa<GetElementPtrInst>(I) || isa<PHINode>(I) ||
|
||||||
|
succ_empty(I->getParent()) ||
|
||||||
!I->getParent()->isLegalToHoistInto();
|
!I->getParent()->isLegalToHoistInto();
|
||||||
}))
|
}))
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -416,6 +416,42 @@ end:
|
||||||
ret i32 %load
|
ret i32 %load
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define void @unreachable_term() {
|
||||||
|
; CHECK-LABEL: @unreachable_term(
|
||||||
|
; CHECK-NEXT: [[A_SROA_0:%.*]] = alloca i32, align 4
|
||||||
|
; CHECK-NEXT: [[A_SROA_0_0_A_SROA_CAST1:%.*]] = bitcast i32* [[A_SROA_0]] to [3 x i32]*
|
||||||
|
; CHECK-NEXT: unreachable
|
||||||
|
; CHECK: bb1:
|
||||||
|
; CHECK-NEXT: br label [[BB1_I:%.*]]
|
||||||
|
; CHECK: bb1.i:
|
||||||
|
; CHECK-NEXT: [[PHI:%.*]] = phi [3 x i32]* [ [[A_SROA_0_0_A_SROA_CAST1]], [[BB1:%.*]] ], [ null, [[BB1_I]] ]
|
||||||
|
; CHECK-NEXT: [[GEP:%.*]] = getelementptr [3 x i32], [3 x i32]* [[PHI]], i64 0, i64 0
|
||||||
|
; CHECK-NEXT: store i32 0, i32* [[GEP]], align 1
|
||||||
|
; CHECK-NEXT: br i1 undef, label [[BB1_I]], label [[EXIT:%.*]]
|
||||||
|
; CHECK: exit:
|
||||||
|
; CHECK-NEXT: br label [[BB2:%.*]]
|
||||||
|
; CHECK: bb2:
|
||||||
|
; CHECK-NEXT: ret void
|
||||||
|
;
|
||||||
|
%a = alloca [3 x i32], align 1
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
bb1:
|
||||||
|
br label %bb1.i
|
||||||
|
|
||||||
|
bb1.i:
|
||||||
|
%phi = phi [3 x i32]* [ %a, %bb1 ], [ null, %bb1.i ]
|
||||||
|
%gep = getelementptr [3 x i32], [3 x i32]* %phi, i64 0, i64 0
|
||||||
|
store i32 0, i32* %gep, align 1
|
||||||
|
br i1 undef, label %bb1.i, label %exit
|
||||||
|
|
||||||
|
exit:
|
||||||
|
br label %bb2
|
||||||
|
|
||||||
|
bb2:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
declare %pair* @foo()
|
declare %pair* @foo()
|
||||||
|
|
||||||
declare i32 @__gxx_personality_v0(...)
|
declare i32 @__gxx_personality_v0(...)
|
||||||
|
|
Loading…
Reference in New Issue