mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-20 19:42:54 +02:00
[GuardWidening] Ignore guards with trivial conditions
Guard widening should not spend efforts on dealing with guards with trivial true/false conditions. Such guards can easily be eliminated by any further cleanup pass like instcombine. However we should not unconditionally delete them because it may be profitable to widen other conditions into such guards. Differential Revision: https://reviews.llvm.org/D50247 Reviewed By: fedor.sergeev llvm-svn: 340381
This commit is contained in:
parent
8c95eeae9d
commit
c8eea01630
@ -347,6 +347,12 @@ bool GuardWideningImpl::eliminateGuardViaWidening(
|
||||
Instruction *GuardInst, const df_iterator<DomTreeNode *> &DFSI,
|
||||
const DenseMap<BasicBlock *, SmallVector<Instruction *, 8>> &
|
||||
GuardsInBlock, bool InvertCondition) {
|
||||
// Ignore trivial true or false conditions. These instructions will be
|
||||
// trivially eliminated by any cleanup pass. Do not erase them because other
|
||||
// guards can possibly be widened into them.
|
||||
if (isa<ConstantInt>(getCondition(GuardInst)))
|
||||
return false;
|
||||
|
||||
Instruction *BestSoFar = nullptr;
|
||||
auto BestScoreSoFar = WS_IllegalOrNegative;
|
||||
auto *GuardInstLoop = LI.getLoopFor(GuardInst->getParent());
|
||||
|
@ -379,3 +379,29 @@ left:
|
||||
right:
|
||||
ret void
|
||||
}
|
||||
|
||||
; Make sure we do not widen guard by trivial true conditions into something.
|
||||
define void @f_15(i1 %cond_0, i1 %cond_1) {
|
||||
; CHECK-LABEL: @f_15(
|
||||
entry:
|
||||
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
||||
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ]
|
||||
; CHECK: ret void
|
||||
|
||||
call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
||||
call void(i1, ...) @llvm.experimental.guard(i1 true) [ "deopt"() ]
|
||||
ret void
|
||||
}
|
||||
|
||||
; Make sure we do not widen guard by trivial false conditions into something.
|
||||
define void @f_16(i1 %cond_0, i1 %cond_1) {
|
||||
; CHECK-LABEL: @f_16(
|
||||
entry:
|
||||
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
||||
; CHECK: call void (i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
|
||||
; CHECK: ret void
|
||||
|
||||
call void(i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
|
||||
call void(i1, ...) @llvm.experimental.guard(i1 false) [ "deopt"() ]
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user