@@ -6390,7 +6390,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6390
6390
if (TrueValue.isZero () && FalseValue.isOne ()) {
6391
6391
MatchInfo = [=](MachineIRBuilder &B) {
6392
6392
B.setInstrAndDebugLoc (*Select);
6393
- auto Inner = B.buildNot (CondTy, Cond);
6393
+ Register Inner = MRI.createGenericVirtualRegister (CondTy);
6394
+ B.buildNot (Inner, Cond);
6394
6395
B.buildZExtOrTrunc (Dest, Inner);
6395
6396
};
6396
6397
return true ;
@@ -6400,7 +6401,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6400
6401
if (TrueValue.isZero () && FalseValue.isAllOnes ()) {
6401
6402
MatchInfo = [=](MachineIRBuilder &B) {
6402
6403
B.setInstrAndDebugLoc (*Select);
6403
- auto Inner = B.buildNot (CondTy, Cond);
6404
+ Register Inner = MRI.createGenericVirtualRegister (CondTy);
6405
+ B.buildNot (Inner, Cond);
6404
6406
B.buildSExtOrTrunc (Dest, Inner);
6405
6407
};
6406
6408
return true ;
@@ -6410,7 +6412,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6410
6412
if (TrueValue - 1 == FalseValue) {
6411
6413
MatchInfo = [=](MachineIRBuilder &B) {
6412
6414
B.setInstrAndDebugLoc (*Select);
6413
- auto Inner = B.buildZExtOrTrunc (TrueTy, Cond);
6415
+ Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6416
+ B.buildZExtOrTrunc (Inner, Cond);
6414
6417
B.buildAdd (Dest, Inner, False);
6415
6418
};
6416
6419
return true ;
@@ -6420,7 +6423,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6420
6423
if (TrueValue + 1 == FalseValue) {
6421
6424
MatchInfo = [=](MachineIRBuilder &B) {
6422
6425
B.setInstrAndDebugLoc (*Select);
6423
- auto Inner = B.buildSExtOrTrunc (TrueTy, Cond);
6426
+ Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6427
+ B.buildSExtOrTrunc (Inner, Cond);
6424
6428
B.buildAdd (Dest, Inner, False);
6425
6429
};
6426
6430
return true ;
@@ -6430,7 +6434,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6430
6434
if (TrueValue.isPowerOf2 () && FalseValue.isZero ()) {
6431
6435
MatchInfo = [=](MachineIRBuilder &B) {
6432
6436
B.setInstrAndDebugLoc (*Select);
6433
- auto Inner = B.buildZExtOrTrunc (TrueTy, Cond);
6437
+ Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6438
+ B.buildZExtOrTrunc (Inner, Cond);
6434
6439
// The shift amount must be scalar.
6435
6440
LLT ShiftTy = TrueTy.isVector () ? TrueTy.getElementType () : TrueTy;
6436
6441
auto ShAmtC = B.buildConstant (ShiftTy, TrueValue.exactLogBase2 ());
@@ -6442,7 +6447,8 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6442
6447
if (TrueValue.isAllOnes ()) {
6443
6448
MatchInfo = [=](MachineIRBuilder &B) {
6444
6449
B.setInstrAndDebugLoc (*Select);
6445
- auto Inner = B.buildSExtOrTrunc (TrueTy, Cond);
6450
+ Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6451
+ B.buildSExtOrTrunc (Inner, Cond);
6446
6452
B.buildOr (Dest, Inner, False, Flags);
6447
6453
};
6448
6454
return true ;
@@ -6452,8 +6458,10 @@ bool CombinerHelper::tryFoldSelectOfConstants(GSelect *Select,
6452
6458
if (FalseValue.isAllOnes ()) {
6453
6459
MatchInfo = [=](MachineIRBuilder &B) {
6454
6460
B.setInstrAndDebugLoc (*Select);
6455
- auto Not = B.buildNot (CondTy, Cond);
6456
- auto Inner = B.buildSExtOrTrunc (TrueTy, Not);
6461
+ Register Not = MRI.createGenericVirtualRegister (CondTy);
6462
+ B.buildNot (Not, Cond);
6463
+ Register Inner = MRI.createGenericVirtualRegister (TrueTy);
6464
+ B.buildSExtOrTrunc (Inner, Not);
6457
6465
B.buildOr (Dest, Inner, True, Flags);
6458
6466
};
6459
6467
return true ;
@@ -6488,7 +6496,8 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6488
6496
if ((Cond == True) || isOneOrOneSplat (True, /* AllowUndefs */ true )) {
6489
6497
MatchInfo = [=](MachineIRBuilder &B) {
6490
6498
B.setInstrAndDebugLoc (*Select);
6491
- auto Ext = B.buildZExtOrTrunc (TrueTy, Cond);
6499
+ Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6500
+ B.buildZExtOrTrunc (Ext, Cond);
6492
6501
B.buildOr (DstReg, Ext, False, Flags);
6493
6502
};
6494
6503
return true ;
@@ -6499,7 +6508,8 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6499
6508
if ((Cond == False) || isZeroOrZeroSplat (False, /* AllowUndefs */ true )) {
6500
6509
MatchInfo = [=](MachineIRBuilder &B) {
6501
6510
B.setInstrAndDebugLoc (*Select);
6502
- auto Ext = B.buildZExtOrTrunc (TrueTy, Cond);
6511
+ Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6512
+ B.buildZExtOrTrunc (Ext, Cond);
6503
6513
B.buildAnd (DstReg, Ext, True);
6504
6514
};
6505
6515
return true ;
@@ -6510,9 +6520,11 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6510
6520
MatchInfo = [=](MachineIRBuilder &B) {
6511
6521
B.setInstrAndDebugLoc (*Select);
6512
6522
// First the not.
6513
- auto Inner = B.buildNot (CondTy, Cond);
6523
+ Register Inner = MRI.createGenericVirtualRegister (CondTy);
6524
+ B.buildNot (Inner, Cond);
6514
6525
// Then an ext to match the destination register.
6515
- auto Ext = B.buildZExtOrTrunc (TrueTy, Inner);
6526
+ Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6527
+ B.buildZExtOrTrunc (Ext, Inner);
6516
6528
B.buildOr (DstReg, Ext, True, Flags);
6517
6529
};
6518
6530
return true ;
@@ -6523,9 +6535,11 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6523
6535
MatchInfo = [=](MachineIRBuilder &B) {
6524
6536
B.setInstrAndDebugLoc (*Select);
6525
6537
// First the not.
6526
- auto Inner = B.buildNot (CondTy, Cond);
6538
+ Register Inner = MRI.createGenericVirtualRegister (CondTy);
6539
+ B.buildNot (Inner, Cond);
6527
6540
// Then an ext to match the destination register.
6528
- auto Ext = B.buildZExtOrTrunc (TrueTy, Inner);
6541
+ Register Ext = MRI.createGenericVirtualRegister (TrueTy);
6542
+ B.buildZExtOrTrunc (Ext, Inner);
6529
6543
B.buildAnd (DstReg, Ext, False);
6530
6544
};
6531
6545
return true ;
@@ -6534,54 +6548,6 @@ bool CombinerHelper::tryFoldBoolSelectToLogic(GSelect *Select,
6534
6548
return false ;
6535
6549
}
6536
6550
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
-
6585
6551
bool CombinerHelper::matchSelect (MachineInstr &MI, BuildFnTy &MatchInfo) {
6586
6552
GSelect *Select = cast<GSelect>(&MI);
6587
6553
@@ -6591,8 +6557,5 @@ bool CombinerHelper::matchSelect(MachineInstr &MI, BuildFnTy &MatchInfo) {
6591
6557
if (tryFoldBoolSelectToLogic (Select, MatchInfo))
6592
6558
return true ;
6593
6559
6594
- if (tryFoldSelectOfBinOps (Select, MatchInfo))
6595
- return true ;
6596
-
6597
6560
return false ;
6598
6561
}
0 commit comments