forked from OSchip/llvm-project
[InstCombine] Add a peephole for redundant assumes
Two or more identical assumes are occasionally next to each other in a basic block. While our generic machinery will turn a redundant assume into a no-op, it is not super cheap. We can perform a simpler check to achieve the same result for this case. llvm-svn: 265801
This commit is contained in:
parent
60c6abc3cc
commit
fcc5811797
|
@ -1943,11 +1943,16 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
|||
break;
|
||||
}
|
||||
case Intrinsic::assume: {
|
||||
Value *IIOperand = II->getArgOperand(0);
|
||||
// Remove an assume if it is immediately followed by an identical assume.
|
||||
if (match(II->getNextNode(),
|
||||
m_Intrinsic<Intrinsic::assume>(m_Specific(IIOperand))))
|
||||
return eraseInstFromFunction(CI);
|
||||
|
||||
// Canonicalize assume(a && b) -> assume(a); assume(b);
|
||||
// Note: New assumption intrinsics created here are registered by
|
||||
// the InstCombineIRInserter object.
|
||||
Value *IIOperand = II->getArgOperand(0), *A, *B,
|
||||
*AssumeIntrinsic = II->getCalledValue();
|
||||
Value *AssumeIntrinsic = II->getCalledValue(), *A, *B;
|
||||
if (match(IIOperand, m_And(m_Value(A), m_Value(B)))) {
|
||||
Builder->CreateCall(AssumeIntrinsic, A, II->getName());
|
||||
Builder->CreateCall(AssumeIntrinsic, B, II->getName());
|
||||
|
|
Loading…
Reference in New Issue