|
61 | 61 | // %6:fpr128 = IMPLICIT_DEF
|
62 | 62 | // %7:fpr128 = INSERT_SUBREG %6:fpr128(tied-def 0), %1:fpr64, %subreg.dsub
|
63 | 63 | //
|
| 64 | +// 8. Remove redundant CSELs that select between identical registers, by |
| 65 | +// replacing them with unconditional moves. |
| 66 | +// |
64 | 67 | //===----------------------------------------------------------------------===//
|
65 | 68 |
|
66 | 69 | #include "AArch64ExpandImm.h"
|
@@ -124,6 +127,7 @@ struct AArch64MIPeepholeOpt : public MachineFunctionPass {
|
124 | 127 | template <typename T>
|
125 | 128 | bool visitAND(unsigned Opc, MachineInstr &MI);
|
126 | 129 | bool visitORR(MachineInstr &MI);
|
| 130 | + bool visitCSEL(MachineInstr &MI); |
127 | 131 | bool visitINSERT(MachineInstr &MI);
|
128 | 132 | bool visitINSviGPR(MachineInstr &MI, unsigned Opc);
|
129 | 133 | bool visitINSvi64lane(MachineInstr &MI);
|
@@ -283,6 +287,26 @@ bool AArch64MIPeepholeOpt::visitORR(MachineInstr &MI) {
|
283 | 287 | return true;
|
284 | 288 | }
|
285 | 289 |
|
| 290 | +bool AArch64MIPeepholeOpt::visitCSEL(MachineInstr &MI) { |
| 291 | + // Replace CSEL with MOV when both inputs are the same register. |
| 292 | + if (MI.getOperand(1).getReg() != MI.getOperand(2).getReg()) |
| 293 | + return false; |
| 294 | + |
| 295 | + auto ZeroReg = |
| 296 | + MI.getOpcode() == AArch64::CSELXr ? AArch64::XZR : AArch64::WZR; |
| 297 | + auto OrOpcode = |
| 298 | + MI.getOpcode() == AArch64::CSELXr ? AArch64::ORRXrs : AArch64::ORRWrs; |
| 299 | + |
| 300 | + BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), TII->get(OrOpcode)) |
| 301 | + .addReg(MI.getOperand(0).getReg(), RegState::Define) |
| 302 | + .addReg(ZeroReg) |
| 303 | + .addReg(MI.getOperand(1).getReg()) |
| 304 | + .addImm(0); |
| 305 | + |
| 306 | + MI.eraseFromParent(); |
| 307 | + return true; |
| 308 | +} |
| 309 | + |
286 | 310 | bool AArch64MIPeepholeOpt::visitINSERT(MachineInstr &MI) {
|
287 | 311 | // Check this INSERT_SUBREG comes from below zero-extend pattern.
|
288 | 312 | //
|
@@ -788,6 +812,10 @@ bool AArch64MIPeepholeOpt::runOnMachineFunction(MachineFunction &MF) {
|
788 | 812 | visitADDSSUBS<uint64_t>({AArch64::SUBXri, AArch64::SUBSXri},
|
789 | 813 | {AArch64::ADDXri, AArch64::ADDSXri}, MI);
|
790 | 814 | break;
|
| 815 | + case AArch64::CSELWr: |
| 816 | + case AArch64::CSELXr: |
| 817 | + Changed |= visitCSEL(MI); |
| 818 | + break; |
791 | 819 | case AArch64::INSvi64gpr:
|
792 | 820 | Changed |= visitINSviGPR(MI, AArch64::INSvi64lane);
|
793 | 821 | break;
|
|
0 commit comments