From 8293f7434577e23a07284686f5b54079e22e6a91 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Thu, 21 Nov 2019 15:06:01 -0800 Subject: Further cleanup manipulation of widenable branches [NFC] This is a follow on to aaea24802bf5. In post commit discussion, Artur and I realized we could cleanup the code using Uses; this patch does so. --- llvm/lib/Transforms/Utils/GuardUtils.cpp | 40 ++++++++++++++------------------ 1 file changed, 18 insertions(+), 22 deletions(-) (limited to 'llvm/lib/Transforms/Utils/GuardUtils.cpp') diff --git a/llvm/lib/Transforms/Utils/GuardUtils.cpp b/llvm/lib/Transforms/Utils/GuardUtils.cpp index 241bfbf80bd..4cfc9358499 100644 --- a/llvm/lib/Transforms/Utils/GuardUtils.cpp +++ b/llvm/lib/Transforms/Utils/GuardUtils.cpp @@ -87,23 +87,20 @@ void llvm::widenWidenableBranch(BranchInst *WidenableBR, Value *NewCond) { // condition, but that doesn't match the pattern parseWidenableBranch expects // so we have to be more sophisticated. - if (match(WidenableBR->getCondition(), - m_Intrinsic())) { + Use *C, *WC; + BasicBlock *IfTrueBB, *IfFalseBB; + parseWidenableBranch(WidenableBR, C, WC, IfTrueBB, IfFalseBB); + if (!C) { + // br (wc()), ... form IRBuilder<> B(WidenableBR); - WidenableBR->setCondition(B.CreateAnd(NewCond, - WidenableBR->getCondition())); + WidenableBR->setCondition(B.CreateAnd(NewCond, WC->get())); } else { + // br (wc & C), ... form + IRBuilder<> B(WidenableBR); + C->set(B.CreateAnd(NewCond, C->get())); Instruction *WCAnd = cast(WidenableBR->getCondition()); // Condition is only guaranteed to dominate branch - WCAnd->moveBefore(WidenableBR); - IRBuilder<> B(WCAnd); - const bool Op0IsWC = - match(WCAnd->getOperand(0), - m_Intrinsic()); - const unsigned CondOpIdx = Op0IsWC ? 1 : 0; - Value *OldCond = WCAnd->getOperand(CondOpIdx); - NewCond = B.CreateAnd(NewCond, OldCond); - WCAnd->setOperand(CondOpIdx, NewCond); + WCAnd->moveBefore(WidenableBR); } assert(isWidenableBranch(WidenableBR) && "preserve widenabiliy"); } @@ -111,20 +108,19 @@ void llvm::widenWidenableBranch(BranchInst *WidenableBR, Value *NewCond) { void llvm::setWidenableBranchCond(BranchInst *WidenableBR, Value *NewCond) { assert(isWidenableBranch(WidenableBR) && "precondition"); - if (match(WidenableBR->getCondition(), - m_Intrinsic())) { + Use *C, *WC; + BasicBlock *IfTrueBB, *IfFalseBB; + parseWidenableBranch(WidenableBR, C, WC, IfTrueBB, IfFalseBB); + if (!C) { + // br (wc()), ... form IRBuilder<> B(WidenableBR); - WidenableBR->setCondition(B.CreateAnd(NewCond, - WidenableBR->getCondition())); + WidenableBR->setCondition(B.CreateAnd(NewCond, WC->get())); } else { + // br (wc & C), ... form Instruction *WCAnd = cast(WidenableBR->getCondition()); // Condition is only guaranteed to dominate branch WCAnd->moveBefore(WidenableBR); - const bool Op0IsWC = - match(WCAnd->getOperand(0), - m_Intrinsic()); - const unsigned CondOpIdx = Op0IsWC ? 1 : 0; - WCAnd->setOperand(CondOpIdx, NewCond); + C->set(NewCond); } assert(isWidenableBranch(WidenableBR) && "preserve widenabiliy"); } -- cgit v1.2.3