@@ -3536,6 +3536,7 @@ bool CodeGenPatternMatch::MatchCanonicalizeInstruction(llvm::Instruction &I) {
3536
3536
}
3537
3537
3538
3538
bool CodeGenPatternMatch::MatchBranch (llvm::BranchInst &I) {
3539
+ using namespace llvm ::PatternMatch;
3539
3540
struct CondBrInstPattern : Pattern {
3540
3541
SSource cond;
3541
3542
llvm::BranchInst *inst;
@@ -3553,9 +3554,24 @@ bool CodeGenPatternMatch::MatchBranch(llvm::BranchInst &I) {
3553
3554
pattern->inst = &I;
3554
3555
3555
3556
if (!I.isUnconditional ()) {
3557
+ Value *orSrc0 = nullptr ;
3558
+ Value *orSrc1 = nullptr ;
3556
3559
Value *cond = I.getCondition ();
3557
3560
if (dyn_cast<GenIntrinsicInst>(cond, GenISAIntrinsic::GenISA_UpdateDiscardMask)) {
3558
3561
pattern->isDiscardBranch = true ;
3562
+ } else if (match (cond, m_Or (m_Value (orSrc0), m_Value (orSrc1)))) {
3563
+ // %6 = call i1 @llvm.genx.GenISA.UpdateDiscardMask(i1 %0, i1 %2)
3564
+ // %7 = or i1 %6, %2 (or: %7 = or i1 %2, %6)
3565
+ // br i1 %7, label %DiscardRet, label %PostDiscard
3566
+ if (auto intr = dyn_cast<GenIntrinsicInst>(orSrc0, GenISAIntrinsic::GenISA_UpdateDiscardMask)) {
3567
+ if (intr->getOperand (1 ) == orSrc1) {
3568
+ pattern->isDiscardBranch = true ;
3569
+ }
3570
+ } else if (auto intr = dyn_cast<GenIntrinsicInst>(orSrc1, GenISAIntrinsic::GenISA_UpdateDiscardMask)) {
3571
+ if (intr->getOperand (1 ) == orSrc0) {
3572
+ pattern->isDiscardBranch = true ;
3573
+ }
3574
+ }
3559
3575
}
3560
3576
pattern->cond = GetSource (I.getCondition (), false , false , IsSourceOfSample (&I));
3561
3577
}
0 commit comments