forked from OSchip/llvm-project
[InstSimplify] guard against unreachable code (PR43218)
This would crash: https://bugs.llvm.org/show_bug.cgi?id=43218 llvm-svn: 370911
This commit is contained in:
parent
433927595d
commit
4a2cd7be5a
|
@ -34,6 +34,11 @@ static bool runImpl(Function &F, const SimplifyQuery &SQ,
|
|||
|
||||
do {
|
||||
for (BasicBlock &BB : F) {
|
||||
// Unreachable code can take on strange forms that we are not prepared to
|
||||
// handle. For example, an instruction may have itself as an operand.
|
||||
if (!SQ.DT->isReachableFromEntry(&BB))
|
||||
continue;
|
||||
|
||||
SmallVector<Instruction *, 8> DeadInstsInBB;
|
||||
for (Instruction &I : BB) {
|
||||
// The first time through the loop, ToSimplify is empty and we try to
|
||||
|
@ -87,7 +92,7 @@ struct InstSimplifyLegacyPass : public FunctionPass {
|
|||
AU.addRequired<OptimizationRemarkEmitterWrapperPass>();
|
||||
}
|
||||
|
||||
/// runOnFunction - Remove instructions that simplify.
|
||||
/// Remove instructions that simplify.
|
||||
bool runOnFunction(Function &F) override {
|
||||
if (skipFunction(F))
|
||||
return false;
|
||||
|
|
|
@ -67,3 +67,26 @@ define <8 x i8> @extract_insert_same_vec_and_index2(<8 x i8> %in, i32 %index) {
|
|||
%vec = insertelement <8 x i8> %in, i8 %val, i32 %index
|
||||
ret <8 x i8> %vec
|
||||
}
|
||||
|
||||
; The insert is in an unreachable block, so it is allowed to point to itself.
|
||||
; This would crash via stack overflow.
|
||||
|
||||
define void @PR43218() {
|
||||
; CHECK-LABEL: @PR43218(
|
||||
; CHECK-NEXT: end:
|
||||
; CHECK-NEXT: ret void
|
||||
; CHECK: unreachable_infloop:
|
||||
; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <2 x i64> [[BOGUS:%.*]], i32 0
|
||||
; CHECK-NEXT: [[T0:%.*]] = inttoptr i64 [[EXTRACT]] to i16****
|
||||
; CHECK-NEXT: [[BOGUS]] = insertelement <2 x i64> [[BOGUS]], i64 undef, i32 1
|
||||
; CHECK-NEXT: br label [[UNREACHABLE_INFLOOP:%.*]]
|
||||
;
|
||||
end:
|
||||
ret void
|
||||
|
||||
unreachable_infloop:
|
||||
%extract = extractelement <2 x i64> %bogus, i32 0
|
||||
%t0 = inttoptr i64 %extract to i16****
|
||||
%bogus = insertelement <2 x i64> %bogus, i64 undef, i32 1
|
||||
br label %unreachable_infloop
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue