@@ -6390,8 +6390,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6390
6390
if (TrueValue.isZero () && FalseValue.isOne ()) {
6391
6391
MatchInfo = [=](MachineIRBuilder &B) {
6392
6392
B.setInstrAndDebugLoc (*Select);
6393
- Register Inner = MRI.createGenericVirtualRegister (CondTy);
6394
- B.buildNot (Inner, Cond);
6393
+ auto Inner = B.buildNot (CondTy, Cond);
6395
6394
B.buildZExtOrTrunc (Dest, Inner);
6396
6395
};
6397
6396
return true ;
@@ -6401,8 +6400,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6401
6400
if (TrueValue.isZero () && FalseValue.isAllOnes ()) {
6402
6401
MatchInfo = [=](MachineIRBuilder &B) {
6403
6402
B.setInstrAndDebugLoc (*Select);
6404
- Register Inner = MRI.createGenericVirtualRegister (CondTy);
6405
- B.buildNot (Inner, Cond);
6403
+ auto Inner = B.buildNot (CondTy, Cond);
6406
6404
B.buildSExtOrTrunc (Dest, Inner);
6407
6405
};
6408
6406
return true ;
@@ -6412,8 +6410,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6412
6410
if (TrueValue - 1 == FalseValue) {
6413
6411
MatchInfo = [=](MachineIRBuilder &B) {
6414
6412
B.setInstrAndDebugLoc (*Select);
6415
- Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6416
- B.buildZExtOrTrunc (Inner, Cond);
6413
+ auto Inner = B.buildZExtOrTrunc (TrueTy, Cond);
6417
6414
B.buildAdd (Dest, Inner, False);
6418
6415
};
6419
6416
return true ;
@@ -6423,8 +6420,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6423
6420
if (TrueValue + 1 == FalseValue) {
6424
6421
MatchInfo = [=](MachineIRBuilder &B) {
6425
6422
B.setInstrAndDebugLoc (*Select);
6426
- Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6427
- B.buildSExtOrTrunc (Inner, Cond);
6423
+ auto Inner = B.buildSExtOrTrunc (TrueTy, Cond);
6428
6424
B.buildAdd (Dest, Inner, False);
6429
6425
};
6430
6426
return true ;
@@ -6434,8 +6430,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6434
6430
if (TrueValue.isPowerOf2 () && FalseValue.isZero ()) {
6435
6431
MatchInfo = [=](MachineIRBuilder &B) {
6436
6432
B.setInstrAndDebugLoc (*Select);
6437
- Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6438
- B.buildZExtOrTrunc (Inner, Cond);
6433
+ auto Inner = B.buildZExtOrTrunc (TrueTy, Cond);
6439
6434
// The shift amount must be scalar.
6440
6435
LLT ShiftTy = TrueTy.isVector () ? TrueTy.getElementType () : TrueTy;
6441
6436
auto ShAmtC = B.buildConstant (ShiftTy, TrueValue.exactLogBase2 ());
@@ -6447,8 +6442,7 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6447
6442
if (TrueValue.isAllOnes ()) {
6448
6443
MatchInfo = [=](MachineIRBuilder &B) {
6449
6444
B.setInstrAndDebugLoc (*Select);
6450
- Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6451
- B.buildSExtOrTrunc (Inner, Cond);
6445
+ auto Inner = B.buildSExtOrTrunc (TrueTy, Cond);
6452
6446
B.buildOr (Dest, Inner, False, Flags);
6453
6447
};
6454
6448
return true ;
@@ -6458,10 +6452,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6458
6452
if (FalseValue.isAllOnes ()) {
6459
6453
MatchInfo = [=](MachineIRBuilder &B) {
6460
6454
B.setInstrAndDebugLoc (*Select);
6461
- Register Not = MRI.createGenericVirtualRegister (CondTy);
6462
- B.buildNot (Not, Cond);
6463
- Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6464
- B.buildSExtOrTrunc (Inner, Not);
6455
+ auto Not = B.buildNot (CondTy, Cond);
6456
+ auto Inner = B.buildSExtOrTrunc (TrueTy, Not);
6465
6457
B.buildOr (Dest, Inner, True, Flags);
6466
6458
};
6467
6459
return true ;
@@ -6496,8 +6488,7 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6496
6488
if ((Cond == True) || isOneOrOneSplat (True, /* AllowUndefs */ true )) {
6497
6489
MatchInfo = [=](MachineIRBuilder &B) {
6498
6490
B.setInstrAndDebugLoc (*Select);
6499
- Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6500
- B.buildZExtOrTrunc (Ext, Cond);
6491
+ auto Ext = B.buildZExtOrTrunc (TrueTy, Cond);
6501
6492
B.buildOr (DstReg, Ext, False, Flags);
6502
6493
};
6503
6494
return true ;
@@ -6508,8 +6499,7 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6508
6499
if ((Cond == False) || isZeroOrZeroSplat (False, /* AllowUndefs */ true )) {
6509
6500
MatchInfo = [=](MachineIRBuilder &B) {
6510
6501
B.setInstrAndDebugLoc (*Select);
6511
- Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6512
- B.buildZExtOrTrunc (Ext, Cond);
6502
+ auto Ext = B.buildZExtOrTrunc (TrueTy, Cond);
6513
6503
B.buildAnd (DstReg, Ext, True);
6514
6504
};
6515
6505
return true ;
@@ -6520,11 +6510,9 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6520
6510
MatchInfo = [=](MachineIRBuilder &B) {
6521
6511
B.setInstrAndDebugLoc (*Select);
6522
6512
// First the not.
6523
- Register Inner = MRI.createGenericVirtualRegister (CondTy);
6524
- B.buildNot (Inner, Cond);
6513
+ auto Inner = B.buildNot (CondTy, Cond);
6525
6514
// Then an ext to match the destination register.
6526
- Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6527
- B.buildZExtOrTrunc (Ext, Inner);
6515
+ auto Ext = B.buildZExtOrTrunc (TrueTy, Inner);
6528
6516
B.buildOr (DstReg, Ext, True, Flags);
6529
6517
};
6530
6518
return true ;
@@ -6535,11 +6523,9 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6535
6523
MatchInfo = [=](MachineIRBuilder &B) {
6536
6524
B.setInstrAndDebugLoc (*Select);
6537
6525
// First the not.
6538
- Register Inner = MRI.createGenericVirtualRegister (CondTy);
6539
- B.buildNot (Inner, Cond);
6526
+ auto Inner = B.buildNot (CondTy, Cond);
6540
6527
// Then an ext to match the destination register.
6541
- Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6542
- B.buildZExtOrTrunc (Ext, Inner);
6528
+ auto Ext = B.buildZExtOrTrunc (TrueTy, Inner);
6543
6529
B.buildAnd (DstReg, Ext, False);
6544
6530
};
6545
6531
return true ;
@@ -6548,6 +6534,54 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6548
6534
return false ;
6549
6535
}
6550
6536
6537
+ bool CombinerHelper::tryFoldSelectOfBinOps (GSelect *Select,
6538
+ BuildFnTy &MatchInfo) {
6539
+ Register DstReg = Select->getReg (0 );
6540
+ Register Cond = Select->getCondReg ();
6541
+ Register False = Select->getFalseReg ();
6542
+ Register True = Select->getTrueReg ();
6543
+ LLT DstTy = MRI.getType (DstReg);
6544
+
6545
+ GBinOp *LHS = getOpcodeDef<GBinOp>(True, MRI);
6546
+ GBinOp *RHS = getOpcodeDef<GBinOp>(False, MRI);
6547
+
6548
+ // We need two binops of the same kind on the true/false registers.
6549
+ if (!LHS || !RHS || LHS->getOpcode () != RHS->getOpcode ())
6550
+ return false ;
6551
+
6552
+ // Note that there are no constraints on CondTy.
6553
+ unsigned Flags = (LHS->getFlags () & RHS->getFlags ()) | Select->getFlags ();
6554
+ unsigned Opcode = LHS->getOpcode ();
6555
+
6556
+ // Fold select(cond, binop(x, y), binop(z, y))
6557
+ // --> binop(select(cond, x, z), y)
6558
+ if (LHS->getRHSReg () == RHS->getRHSReg ()) {
6559
+ MatchInfo = [=](MachineIRBuilder &B) {
6560
+ B.setInstrAndDebugLoc (*Select);
6561
+ auto Sel = B.buildSelect (DstTy, Cond, LHS->getLHSReg (), RHS->getLHSReg (),
6562
+ Select->getFlags ());
6563
+ B.buildInstr (Opcode, {DstReg}, {Sel, LHS->getRHSReg ()}, Flags);
6564
+ };
6565
+ return true ;
6566
+ }
6567
+
6568
+ // Fold select(cond, binop(x, y), binop(x, z))
6569
+ // --> binop(x, select(cond, y, z))
6570
+ if (LHS->getLHSReg () == RHS->getLHSReg ()) {
6571
+ MatchInfo = [=](MachineIRBuilder &B) {
6572
+ B.setInstrAndDebugLoc (*Select);
6573
+ auto Sel = B.buildSelect (DstTy, Cond, LHS->getRHSReg (), RHS->getRHSReg (),
6574
+ Select->getFlags ());
6575
+ B.buildInstr (Opcode, {DstReg}, {LHS->getLHSReg (), Sel}, Flags);
6576
+ };
6577
+ return true ;
6578
+ }
6579
+
6580
+ // FIXME: use isCommutable().
6581
+
6582
+ return false ;
6583
+ }
6584
+
6551
6585
bool CombinerHelper::matchSelect (MachineInstr &MI, BuildFnTy &MatchInfo) {
6552
6586
GSelect *Select = cast<GSelect>(&MI);
6553
6587
@@ -6557,5 +6591,8 @@ bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) {
6557
6591
if (tryFoldBoolSelectToLogic (Select, MatchInfo))
6558
6592
return true ;
6559
6593
6594
+ if (tryFoldSelectOfBinOps (Select, MatchInfo))
6595
+ return true ;
6596
+
6560
6597
return false ;
6561
6598
}
0 commit comments