Skip to content

Commit f7b61f8

Browse files
authored
[X86][CodeGen] Transform NDD SUB to CMP if dest reg is dead (llvm#79135)
1 parent 218bb21 commit f7b61f8

File tree

4 files changed

+146
-194
lines changed

4 files changed

+146
-194
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 80 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -2268,72 +2268,44 @@ MachineInstr *X86InstrInfo::commuteInstructionImpl(MachineInstr &MI, bool NewMI,
22682268
MachineInstr *WorkingMI = nullptr;
22692269
unsigned Opc = MI.getOpcode();
22702270

2271+
#define CASE_ND(OP) \
2272+
case X86::OP: \
2273+
case X86::OP##_ND:
2274+
22712275
switch (Opc) {
22722276
// SHLD B, C, I <-> SHRD C, B, (BitWidth - I)
2273-
case X86::SHRD16rri8:
2274-
case X86::SHLD16rri8:
2275-
case X86::SHRD32rri8:
2276-
case X86::SHLD32rri8:
2277-
case X86::SHRD64rri8:
2278-
case X86::SHLD64rri8:
2279-
case X86::SHRD16rri8_ND:
2280-
case X86::SHLD16rri8_ND:
2281-
case X86::SHRD32rri8_ND:
2282-
case X86::SHLD32rri8_ND:
2283-
case X86::SHRD64rri8_ND:
2284-
case X86::SHLD64rri8_ND: {
2277+
CASE_ND(SHRD16rri8)
2278+
CASE_ND(SHLD16rri8)
2279+
CASE_ND(SHRD32rri8)
2280+
CASE_ND(SHLD32rri8)
2281+
CASE_ND(SHRD64rri8)
2282+
CASE_ND(SHLD64rri8) {
22852283
unsigned Size;
22862284
switch (Opc) {
22872285
default:
22882286
llvm_unreachable("Unreachable!");
2289-
case X86::SHRD16rri8:
2290-
Size = 16;
2291-
Opc = X86::SHLD16rri8;
2292-
break;
2293-
case X86::SHLD16rri8:
2294-
Size = 16;
2295-
Opc = X86::SHRD16rri8;
2296-
break;
2297-
case X86::SHRD32rri8:
2298-
Size = 32;
2299-
Opc = X86::SHLD32rri8;
2300-
break;
2301-
case X86::SHLD32rri8:
2302-
Size = 32;
2303-
Opc = X86::SHRD32rri8;
2304-
break;
2305-
case X86::SHRD64rri8:
2306-
Size = 64;
2307-
Opc = X86::SHLD64rri8;
2308-
break;
2309-
case X86::SHLD64rri8:
2310-
Size = 64;
2311-
Opc = X86::SHRD64rri8;
2312-
break;
2313-
case X86::SHRD16rri8_ND:
2314-
Size = 16;
2315-
Opc = X86::SHLD16rri8_ND;
2316-
break;
2317-
case X86::SHLD16rri8_ND:
2318-
Size = 16;
2319-
Opc = X86::SHRD16rri8_ND;
2320-
break;
2321-
case X86::SHRD32rri8_ND:
2322-
Size = 32;
2323-
Opc = X86::SHLD32rri8_ND;
2324-
break;
2325-
case X86::SHLD32rri8_ND:
2326-
Size = 32;
2327-
Opc = X86::SHRD32rri8_ND;
2328-
break;
2329-
case X86::SHRD64rri8_ND:
2330-
Size = 64;
2331-
Opc = X86::SHLD64rri8_ND;
2332-
break;
2333-
case X86::SHLD64rri8_ND:
2334-
Size = 64;
2335-
Opc = X86::SHRD64rri8_ND;
2336-
break;
2287+
#define FROM_TO_SIZE(A, B, S) \
2288+
case X86::A: \
2289+
Opc = X86::B; \
2290+
Size = S; \
2291+
break; \
2292+
case X86::A##_ND: \
2293+
Opc = X86::B##_ND; \
2294+
Size = S; \
2295+
break; \
2296+
case X86::B: \
2297+
Opc = X86::A; \
2298+
Size = S; \
2299+
break; \
2300+
case X86::B##_ND: \
2301+
Opc = X86::A##_ND; \
2302+
Size = S; \
2303+
break;
2304+
2305+
FROM_TO_SIZE(SHRD16rri8, SHLD16rri8, 16)
2306+
FROM_TO_SIZE(SHRD32rri8, SHLD32rri8, 32)
2307+
FROM_TO_SIZE(SHRD64rri8, SHLD64rri8, 64)
2308+
#undef FROM_TO_SIZE
23372309
}
23382310
WorkingMI = CloneIfNew(MI);
23392311
WorkingMI->setDesc(get(Opc));
@@ -4684,28 +4656,28 @@ bool X86InstrInfo::analyzeCompare(const MachineInstr &MI, Register &SrcReg,
46844656
}
46854657
return true;
46864658
// A SUB can be used to perform comparison.
4687-
case X86::SUB64rm:
4688-
case X86::SUB32rm:
4689-
case X86::SUB16rm:
4690-
case X86::SUB8rm:
4659+
CASE_ND(SUB64rm)
4660+
CASE_ND(SUB32rm)
4661+
CASE_ND(SUB16rm)
4662+
CASE_ND(SUB8rm)
46914663
SrcReg = MI.getOperand(1).getReg();
46924664
SrcReg2 = 0;
46934665
CmpMask = 0;
46944666
CmpValue = 0;
46954667
return true;
4696-
case X86::SUB64rr:
4697-
case X86::SUB32rr:
4698-
case X86::SUB16rr:
4699-
case X86::SUB8rr:
4668+
CASE_ND(SUB64rr)
4669+
CASE_ND(SUB32rr)
4670+
CASE_ND(SUB16rr)
4671+
CASE_ND(SUB8rr)
47004672
SrcReg = MI.getOperand(1).getReg();
47014673
SrcReg2 = MI.getOperand(2).getReg();
47024674
CmpMask = 0;
47034675
CmpValue = 0;
47044676
return true;
4705-
case X86::SUB64ri32:
4706-
case X86::SUB32ri:
4707-
case X86::SUB16ri:
4708-
case X86::SUB8ri:
4677+
CASE_ND(SUB64ri32)
4678+
CASE_ND(SUB32ri)
4679+
CASE_ND(SUB16ri)
4680+
CASE_ND(SUB8ri)
47094681
SrcReg = MI.getOperand(1).getReg();
47104682
SrcReg2 = 0;
47114683
if (MI.getOperand(2).isImm()) {
@@ -4750,10 +4722,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
47504722
case X86::CMP32rr:
47514723
case X86::CMP16rr:
47524724
case X86::CMP8rr:
4753-
case X86::SUB64rr:
4754-
case X86::SUB32rr:
4755-
case X86::SUB16rr:
4756-
case X86::SUB8rr: {
4725+
CASE_ND(SUB64rr)
4726+
CASE_ND(SUB32rr)
4727+
CASE_ND(SUB16rr)
4728+
CASE_ND(SUB8rr) {
47574729
Register OISrcReg;
47584730
Register OISrcReg2;
47594731
int64_t OIMask;
@@ -4775,10 +4747,10 @@ bool X86InstrInfo::isRedundantFlagInstr(const MachineInstr &FlagI,
47754747
case X86::CMP32ri:
47764748
case X86::CMP16ri:
47774749
case X86::CMP8ri:
4778-
case X86::SUB64ri32:
4779-
case X86::SUB32ri:
4780-
case X86::SUB16ri:
4781-
case X86::SUB8ri:
4750+
CASE_ND(SUB64ri32)
4751+
CASE_ND(SUB32ri)
4752+
CASE_ND(SUB16ri)
4753+
CASE_ND(SUB8ri)
47824754
case X86::TEST64rr:
47834755
case X86::TEST32rr:
47844756
case X86::TEST16rr:
@@ -5110,62 +5082,42 @@ bool X86InstrInfo::optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
51105082
switch (CmpInstr.getOpcode()) {
51115083
default:
51125084
break;
5113-
case X86::SUB64ri32:
5114-
case X86::SUB32ri:
5115-
case X86::SUB16ri:
5116-
case X86::SUB8ri:
5117-
case X86::SUB64rm:
5118-
case X86::SUB32rm:
5119-
case X86::SUB16rm:
5120-
case X86::SUB8rm:
5121-
case X86::SUB64rr:
5122-
case X86::SUB32rr:
5123-
case X86::SUB16rr:
5124-
case X86::SUB8rr: {
5085+
CASE_ND(SUB64ri32)
5086+
CASE_ND(SUB32ri)
5087+
CASE_ND(SUB16ri)
5088+
CASE_ND(SUB8ri)
5089+
CASE_ND(SUB64rm)
5090+
CASE_ND(SUB32rm)
5091+
CASE_ND(SUB16rm)
5092+
CASE_ND(SUB8rm)
5093+
CASE_ND(SUB64rr)
5094+
CASE_ND(SUB32rr)
5095+
CASE_ND(SUB16rr)
5096+
CASE_ND(SUB8rr) {
51255097
if (!MRI->use_nodbg_empty(CmpInstr.getOperand(0).getReg()))
51265098
return false;
51275099
// There is no use of the destination register, we can replace SUB with CMP.
51285100
unsigned NewOpcode = 0;
5101+
#define FROM_TO(A, B) \
5102+
CASE_ND(A) NewOpcode = X86::B; \
5103+
break;
51295104
switch (CmpInstr.getOpcode()) {
51305105
default:
51315106
llvm_unreachable("Unreachable!");
5132-
case X86::SUB64rm:
5133-
NewOpcode = X86::CMP64rm;
5134-
break;
5135-
case X86::SUB32rm:
5136-
NewOpcode = X86::CMP32rm;
5137-
break;
5138-
case X86::SUB16rm:
5139-
NewOpcode = X86::CMP16rm;
5140-
break;
5141-
case X86::SUB8rm:
5142-
NewOpcode = X86::CMP8rm;
5143-
break;
5144-
case X86::SUB64rr:
5145-
NewOpcode = X86::CMP64rr;
5146-
break;
5147-
case X86::SUB32rr:
5148-
NewOpcode = X86::CMP32rr;
5149-
break;
5150-
case X86::SUB16rr:
5151-
NewOpcode = X86::CMP16rr;
5152-
break;
5153-
case X86::SUB8rr:
5154-
NewOpcode = X86::CMP8rr;
5155-
break;
5156-
case X86::SUB64ri32:
5157-
NewOpcode = X86::CMP64ri32;
5158-
break;
5159-
case X86::SUB32ri:
5160-
NewOpcode = X86::CMP32ri;
5161-
break;
5162-
case X86::SUB16ri:
5163-
NewOpcode = X86::CMP16ri;
5164-
break;
5165-
case X86::SUB8ri:
5166-
NewOpcode = X86::CMP8ri;
5167-
break;
5107+
FROM_TO(SUB64rm, CMP64rm)
5108+
FROM_TO(SUB32rm, CMP32rm)
5109+
FROM_TO(SUB16rm, CMP16rm)
5110+
FROM_TO(SUB8rm, CMP8rm)
5111+
FROM_TO(SUB64rr, CMP64rr)
5112+
FROM_TO(SUB32rr, CMP32rr)
5113+
FROM_TO(SUB16rr, CMP16rr)
5114+
FROM_TO(SUB8rr, CMP8rr)
5115+
FROM_TO(SUB64ri32, CMP64ri32)
5116+
FROM_TO(SUB32ri, CMP32ri)
5117+
FROM_TO(SUB16ri, CMP16ri)
5118+
FROM_TO(SUB8ri, CMP8ri)
51685119
}
5120+
#undef FROM_TO
51695121
CmpInstr.setDesc(get(NewOpcode));
51705122
CmpInstr.removeOperand(0);
51715123
// Mutating this instruction invalidates any debug data associated with it.

0 commit comments

Comments
 (0)