Skip to content

Commit 5f86891

Browse files
committed
[X86][APX] Add NF instructions to convertToThreeAddress functions
Since #130488, we have NF instructions when converting to three address instructions.
1 parent cbeae3e commit 5f86891

File tree

2 files changed

+316
-37
lines changed

2 files changed

+316
-37
lines changed

llvm/lib/Target/X86/X86InstrInfo.cpp

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,11 +1283,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
12831283

12841284
MachineInstrBuilder MIB =
12851285
BuildMI(MBB, MBBI, MI.getDebugLoc(), get(Opcode), OutRegLEA);
1286+
#define CASE_NF(OP) \
1287+
case X86::OP: \
1288+
case X86::OP##_NF:
12861289
switch (MIOpc) {
12871290
default:
12881291
llvm_unreachable("Unreachable!");
1289-
case X86::SHL8ri:
1290-
case X86::SHL16ri: {
1292+
CASE_NF(SHL8ri)
1293+
CASE_NF(SHL16ri) {
12911294
unsigned ShAmt = MI.getOperand(2).getImm();
12921295
MIB.addReg(0)
12931296
.addImm(1LL << ShAmt)
@@ -1296,23 +1299,23 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
12961299
.addReg(0);
12971300
break;
12981301
}
1299-
case X86::INC8r:
1300-
case X86::INC16r:
1302+
CASE_NF(INC8r)
1303+
CASE_NF(INC16r)
13011304
addRegOffset(MIB, InRegLEA, true, 1);
13021305
break;
1303-
case X86::DEC8r:
1304-
case X86::DEC16r:
1306+
CASE_NF(DEC8r)
1307+
CASE_NF(DEC16r)
13051308
addRegOffset(MIB, InRegLEA, true, -1);
13061309
break;
1307-
case X86::ADD8ri:
1310+
CASE_NF(ADD8ri)
1311+
CASE_NF(ADD16ri)
13081312
case X86::ADD8ri_DB:
1309-
case X86::ADD16ri:
13101313
case X86::ADD16ri_DB:
13111314
addRegOffset(MIB, InRegLEA, true, MI.getOperand(2).getImm());
13121315
break;
1313-
case X86::ADD8rr:
1316+
CASE_NF(ADD8rr)
1317+
CASE_NF(ADD16rr)
13141318
case X86::ADD8rr_DB:
1315-
case X86::ADD16rr:
13161319
case X86::ADD16rr_DB: {
13171320
Src2 = MI.getOperand(2).getReg();
13181321
Src2SubReg = MI.getOperand(2).getSubReg();
@@ -1449,7 +1452,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
14491452
switch (MIOpc) {
14501453
default:
14511454
llvm_unreachable("Unreachable!");
1452-
case X86::SHL64ri: {
1455+
CASE_NF(SHL64ri) {
14531456
assert(MI.getNumOperands() >= 3 && "Unknown shift instruction!");
14541457
unsigned ShAmt = getTruncatedShiftCount(MI, 2);
14551458
if (!isTruncatedShiftCountForLEA(ShAmt))
@@ -1469,7 +1472,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
14691472
.addReg(0);
14701473
break;
14711474
}
1472-
case X86::SHL32ri: {
1475+
CASE_NF(SHL32ri) {
14731476
assert(MI.getNumOperands() >= 3 && "Unknown shift instruction!");
14741477
unsigned ShAmt = getTruncatedShiftCount(MI, 2);
14751478
if (!isTruncatedShiftCountForLEA(ShAmt))
@@ -1501,20 +1504,20 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
15011504
LV->getVarInfo(SrcReg).Kills.push_back(NewMI);
15021505
break;
15031506
}
1504-
case X86::SHL8ri:
1507+
CASE_NF(SHL8ri)
15051508
Is8BitOp = true;
15061509
[[fallthrough]];
1507-
case X86::SHL16ri: {
1510+
CASE_NF(SHL16ri) {
15081511
assert(MI.getNumOperands() >= 3 && "Unknown shift instruction!");
15091512
unsigned ShAmt = getTruncatedShiftCount(MI, 2);
15101513
if (!isTruncatedShiftCountForLEA(ShAmt))
15111514
return nullptr;
15121515
return convertToThreeAddressWithLEA(MIOpc, MI, LV, LIS, Is8BitOp);
15131516
}
1514-
case X86::INC64r:
1515-
case X86::INC32r: {
1517+
CASE_NF(INC64r)
1518+
CASE_NF(INC32r) {
15161519
assert(MI.getNumOperands() >= 2 && "Unknown inc instruction!");
1517-
unsigned Opc = MIOpc == X86::INC64r
1520+
unsigned Opc = (MIOpc == X86::INC64r || MIOpc == X86::INC64r_NF)
15181521
? X86::LEA64r
15191522
: (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
15201523
bool isKill;
@@ -1536,10 +1539,10 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
15361539
LV->getVarInfo(SrcReg).Kills.push_back(NewMI);
15371540
break;
15381541
}
1539-
case X86::DEC64r:
1540-
case X86::DEC32r: {
1542+
CASE_NF(DEC64r)
1543+
CASE_NF(DEC32r) {
15411544
assert(MI.getNumOperands() >= 2 && "Unknown dec instruction!");
1542-
unsigned Opc = MIOpc == X86::DEC64r
1545+
unsigned Opc = (MIOpc == X86::DEC64r || MIOpc == X86::DEC64r_NF)
15431546
? X86::LEA64r
15441547
: (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
15451548

@@ -1562,20 +1565,21 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
15621565
LV->getVarInfo(SrcReg).Kills.push_back(NewMI);
15631566
break;
15641567
}
1565-
case X86::DEC8r:
1566-
case X86::INC8r:
1568+
CASE_NF(DEC8r)
1569+
CASE_NF(INC8r)
15671570
Is8BitOp = true;
15681571
[[fallthrough]];
1569-
case X86::DEC16r:
1570-
case X86::INC16r:
1572+
CASE_NF(DEC16r)
1573+
CASE_NF(INC16r)
15711574
return convertToThreeAddressWithLEA(MIOpc, MI, LV, LIS, Is8BitOp);
1572-
case X86::ADD64rr:
1575+
CASE_NF(ADD64rr)
1576+
CASE_NF(ADD32rr)
15731577
case X86::ADD64rr_DB:
1574-
case X86::ADD32rr:
15751578
case X86::ADD32rr_DB: {
15761579
assert(MI.getNumOperands() >= 3 && "Unknown add instruction!");
15771580
unsigned Opc;
1578-
if (MIOpc == X86::ADD64rr || MIOpc == X86::ADD64rr_DB)
1581+
if (MIOpc == X86::ADD64rr || MIOpc == X86::ADD64rr_NF ||
1582+
MIOpc == X86::ADD64rr_DB)
15791583
Opc = X86::LEA64r;
15801584
else
15811585
Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
@@ -1620,21 +1624,21 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
16201624
NumRegOperands = 3;
16211625
break;
16221626
}
1623-
case X86::ADD8rr:
1627+
CASE_NF(ADD8rr)
16241628
case X86::ADD8rr_DB:
16251629
Is8BitOp = true;
16261630
[[fallthrough]];
1627-
case X86::ADD16rr:
1631+
CASE_NF(ADD16rr)
16281632
case X86::ADD16rr_DB:
16291633
return convertToThreeAddressWithLEA(MIOpc, MI, LV, LIS, Is8BitOp);
1630-
case X86::ADD64ri32:
1634+
CASE_NF(ADD64ri32)
16311635
case X86::ADD64ri32_DB:
16321636
assert(MI.getNumOperands() >= 3 && "Unknown add instruction!");
16331637
NewMI = addOffset(
16341638
BuildMI(MF, MI.getDebugLoc(), get(X86::LEA64r)).add(Dest).add(Src),
16351639
MI.getOperand(2));
16361640
break;
1637-
case X86::ADD32ri:
1641+
CASE_NF(ADD32ri)
16381642
case X86::ADD32ri_DB: {
16391643
assert(MI.getNumOperands() >= 3 && "Unknown add instruction!");
16401644
unsigned Opc = Is64Bit ? X86::LEA64_32r : X86::LEA32r;
@@ -1659,18 +1663,18 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
16591663
LV->getVarInfo(SrcReg).Kills.push_back(NewMI);
16601664
break;
16611665
}
1662-
case X86::ADD8ri:
1666+
CASE_NF(ADD8ri)
16631667
case X86::ADD8ri_DB:
16641668
Is8BitOp = true;
16651669
[[fallthrough]];
1666-
case X86::ADD16ri:
1670+
CASE_NF(ADD16ri)
16671671
case X86::ADD16ri_DB:
16681672
return convertToThreeAddressWithLEA(MIOpc, MI, LV, LIS, Is8BitOp);
1669-
case X86::SUB8ri:
1670-
case X86::SUB16ri:
1673+
CASE_NF(SUB8ri)
1674+
CASE_NF(SUB16ri)
16711675
/// FIXME: Support these similar to ADD8ri/ADD16ri*.
16721676
return nullptr;
1673-
case X86::SUB32ri: {
1677+
CASE_NF(SUB32ri) {
16741678
if (!MI.getOperand(2).isImm())
16751679
return nullptr;
16761680
int64_t Imm = MI.getOperand(2).getImm();
@@ -1701,7 +1705,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
17011705
break;
17021706
}
17031707

1704-
case X86::SUB64ri32: {
1708+
CASE_NF(SUB64ri32) {
17051709
if (!MI.getOperand(2).isImm())
17061710
return nullptr;
17071711
int64_t Imm = MI.getOperand(2).getImm();
@@ -2034,6 +2038,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
20342038
break;
20352039
}
20362040
}
2041+
#undef CASE_NF
20372042

20382043
if (!NewMI)
20392044
return nullptr;

0 commit comments

Comments
 (0)