@@ -1810,7 +1810,7 @@ bool AArch64InstructionSelector::selectCompareBranchFedByICmp(
1810
1810
1811
1811
// Couldn't optimize. Emit a compare + a Bcc.
1812
1812
MachineBasicBlock *DestMBB = I.getOperand (1 ).getMBB ();
1813
- auto PredOp = ICmp.getOperand (1 );
1813
+ auto & PredOp = ICmp.getOperand (1 );
1814
1814
emitIntegerCompare (ICmp.getOperand (2 ), ICmp.getOperand (3 ), PredOp, MIB);
1815
1815
const AArch64CC::CondCode CC = changeICMPPredToAArch64CC (
1816
1816
static_cast <CmpInst::Predicate>(PredOp.getPredicate ()));
@@ -2506,12 +2506,12 @@ bool AArch64InstructionSelector::earlySelect(MachineInstr &I) {
2506
2506
return false ;
2507
2507
}
2508
2508
auto &PredOp = Cmp->getOperand (1 );
2509
- auto Pred = static_cast <CmpInst::Predicate>(PredOp.getPredicate ());
2510
- const AArch64CC::CondCode InvCC =
2511
- changeICMPPredToAArch64CC (CmpInst::getInversePredicate (Pred));
2512
2509
MIB.setInstrAndDebugLoc (I);
2513
2510
emitIntegerCompare (/* LHS=*/ Cmp->getOperand (2 ),
2514
2511
/* RHS=*/ Cmp->getOperand (3 ), PredOp, MIB);
2512
+ auto Pred = static_cast <CmpInst::Predicate>(PredOp.getPredicate ());
2513
+ const AArch64CC::CondCode InvCC =
2514
+ changeICMPPredToAArch64CC (CmpInst::getInversePredicate (Pred));
2515
2515
emitCSINC (/* Dst=*/ AddDst, /* Src =*/ AddLHS, /* Src2=*/ AddLHS, InvCC, MIB);
2516
2516
I.eraseFromParent ();
2517
2517
return true ;
@@ -3574,10 +3574,11 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
3574
3574
return false ;
3575
3575
}
3576
3576
3577
- auto Pred = static_cast <CmpInst::Predicate>(I.getOperand (1 ).getPredicate ());
3577
+ auto &PredOp = I.getOperand (1 );
3578
+ emitIntegerCompare (I.getOperand (2 ), I.getOperand (3 ), PredOp, MIB);
3579
+ auto Pred = static_cast <CmpInst::Predicate>(PredOp.getPredicate ());
3578
3580
const AArch64CC::CondCode InvCC =
3579
3581
changeICMPPredToAArch64CC (CmpInst::getInversePredicate (Pred));
3580
- emitIntegerCompare (I.getOperand (2 ), I.getOperand (3 ), I.getOperand (1 ), MIB);
3581
3582
emitCSINC (/* Dst=*/ I.getOperand (0 ).getReg (), /* Src1=*/ AArch64::WZR,
3582
3583
/* Src2=*/ AArch64::WZR, InvCC, MIB);
3583
3584
I.eraseFromParent ();
@@ -5096,11 +5097,11 @@ bool AArch64InstructionSelector::tryOptSelect(GSelect &I) {
5096
5097
5097
5098
AArch64CC::CondCode CondCode;
5098
5099
if (CondOpc == TargetOpcode::G_ICMP) {
5099
- auto Pred =
5100
- static_cast <CmpInst::Predicate>(CondDef->getOperand (1 ).getPredicate ());
5100
+ auto &PredOp = CondDef->getOperand (1 );
5101
+ emitIntegerCompare (CondDef->getOperand (2 ), CondDef->getOperand (3 ), PredOp,
5102
+ MIB);
5103
+ auto Pred = static_cast <CmpInst::Predicate>(PredOp.getPredicate ());
5101
5104
CondCode = changeICMPPredToAArch64CC (Pred);
5102
- emitIntegerCompare (CondDef->getOperand (2 ), CondDef->getOperand (3 ),
5103
- CondDef->getOperand (1 ), MIB);
5104
5105
} else {
5105
5106
// Get the condition code for the select.
5106
5107
auto Pred =
@@ -5148,29 +5149,37 @@ MachineInstr *AArch64InstructionSelector::tryFoldIntegerCompare(
5148
5149
MachineInstr *LHSDef = getDefIgnoringCopies (LHS.getReg (), MRI);
5149
5150
MachineInstr *RHSDef = getDefIgnoringCopies (RHS.getReg (), MRI);
5150
5151
auto P = static_cast <CmpInst::Predicate>(Predicate.getPredicate ());
5152
+
5151
5153
// Given this:
5152
5154
//
5153
5155
// x = G_SUB 0, y
5154
- // G_ICMP x, z
5156
+ // G_ICMP z, x
5155
5157
//
5156
5158
// Produce this:
5157
5159
//
5158
- // cmn y, z
5159
- if (isCMN (LHSDef , P, MRI))
5160
- return emitCMN (LHSDef ->getOperand (2 ), RHS , MIRBuilder);
5160
+ // cmn z, y
5161
+ if (isCMN (RHSDef , P, MRI))
5162
+ return emitCMN (LHS, RHSDef ->getOperand (2 ), MIRBuilder);
5161
5163
5162
- // Same idea here, but with the RHS of the compare instead:
5164
+ // Same idea here, but with the LHS of the compare instead:
5163
5165
//
5164
5166
// Given this:
5165
5167
//
5166
5168
// x = G_SUB 0, y
5167
- // G_ICMP z, x
5169
+ // G_ICMP x, z
5168
5170
//
5169
5171
// Produce this:
5170
5172
//
5171
- // cmn z, y
5172
- if (isCMN (RHSDef, P, MRI))
5173
- return emitCMN (LHS, RHSDef->getOperand (2 ), MIRBuilder);
5173
+ // cmn y, z
5174
+ //
5175
+ // But be careful! We need to swap the predicate!
5176
+ if (isCMN (LHSDef, P, MRI)) {
5177
+ if (!CmpInst::isEquality (P)) {
5178
+ P = CmpInst::getSwappedPredicate (P);
5179
+ Predicate = MachineOperand::CreatePredicate (P);
5180
+ }
5181
+ return emitCMN (LHSDef->getOperand (2 ), RHS, MIRBuilder);
5182
+ }
5174
5183
5175
5184
// Given this:
5176
5185
//
0 commit comments