mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[InstructionCombining] prepareICWorklistFromFunction halts in infinite loop with instructions of token type
Summary: This patch fixes a bug in prepareICWorklistFromFunction, where the loop becomes infinite with instructions of token type. The patch checks if the instruction is token type, and if so it updates EndInst with the current instruction. Reviewers: reames, majnemer Subscribers: llvm-commits, sanjoy Differential Revision: http://reviews.llvm.org/D15859 llvm-svn: 256792
This commit is contained in:
parent
e81d5fcd14
commit
10e521338c
@ -3021,7 +3021,7 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
||||
Instruction *Inst = &*--EndInst->getIterator();
|
||||
if (!Inst->use_empty() && !Inst->getType()->isTokenTy())
|
||||
Inst->replaceAllUsesWith(UndefValue::get(Inst->getType()));
|
||||
if (Inst->isEHPad()) {
|
||||
if (Inst->isEHPad() || Inst->getType()->isTokenTy()) {
|
||||
EndInst = Inst;
|
||||
continue;
|
||||
}
|
||||
@ -3029,7 +3029,6 @@ static bool prepareICWorklistFromFunction(Function &F, const DataLayout &DL,
|
||||
++NumDeadInst;
|
||||
MadeIRChange = true;
|
||||
}
|
||||
if (!Inst->getType()->isTokenTy())
|
||||
Inst->eraseFromParent();
|
||||
}
|
||||
}
|
||||
|
@ -85,5 +85,22 @@ unreachable:
|
||||
; CHECK: %Y = zext i8 %B to i32
|
||||
; CHECK: %phi = phi i32 [ %X, %bb ], [ %Y, %cont ], [ %Y, %cont2 ]
|
||||
|
||||
declare void @foo()
|
||||
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
|
||||
|
||||
define void @test4(i8 addrspace(1)* %obj) gc "statepoint-example" {
|
||||
bb:
|
||||
unreachable
|
||||
|
||||
unreachable:
|
||||
call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
|
||||
ret void
|
||||
}
|
||||
|
||||
; CHECK-LABEL: define void @test4(
|
||||
; CHECK: unreachable:
|
||||
; CHECK: call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0)
|
||||
; CHECK: ret void
|
||||
|
||||
|
||||
declare void @g(i32)
|
||||
|
Loading…
x
Reference in New Issue
Block a user