diff options
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 64117f5a85b..5be321b7b47 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -2989,6 +2989,18 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { GuardB->setCallingConv(CC); return eraseInstFromFunction(*II); } + + // guard(!(a || b)) -> guard(!a); guard(!b); + if (match(IIOperand, m_Not(m_Or(m_Value(A), m_Value(B))))) { + CallInst *GuardA = Builder->CreateCall( + GuardIntrinsic, Builder->CreateNot(A), {DeoptOB}, II->getName()); + CallInst *GuardB = Builder->CreateCall( + GuardIntrinsic, Builder->CreateNot(B), {DeoptOB}, II->getName()); + auto CC = II->getCallingConv(); + GuardA->setCallingConv(CC); + GuardB->setCallingConv(CC); + return eraseInstFromFunction(*II); + } break; } } |

