@@ -1158,8 +1158,9 @@ static bool findRedundantFlagInstr(MachineInstr &CmpInstr,
1158
1158
1159
1159
bool X86InstrInfo::classifyLEAReg (MachineInstr &MI, const MachineOperand &Src,
1160
1160
unsigned Opc, bool AllowSP, Register &NewSrc,
1161
- bool &isKill, MachineOperand &ImplicitOp,
1162
- LiveVariables *LV, LiveIntervals *LIS) const {
1161
+ unsigned &NewSrcSubReg, bool &isKill,
1162
+ MachineOperand &ImplicitOp, LiveVariables *LV,
1163
+ LiveIntervals *LIS) const {
1163
1164
MachineFunction &MF = *MI.getParent ()->getParent ();
1164
1165
const TargetRegisterClass *RC;
1165
1166
if (AllowSP) {
@@ -1168,12 +1169,16 @@ bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
1168
1169
RC = Opc != X86::LEA32r ? &X86::GR64_NOSPRegClass : &X86::GR32_NOSPRegClass;
1169
1170
}
1170
1171
Register SrcReg = Src.getReg ();
1172
+ unsigned SubReg = Src.getSubReg ();
1171
1173
isKill = MI.killsRegister (SrcReg, /* TRI=*/ nullptr );
1172
1174
1175
+ NewSrcSubReg = X86::NoSubRegister;
1176
+
1173
1177
// For both LEA64 and LEA32 the register already has essentially the right
1174
1178
// type (32-bit or 64-bit) we may just need to forbid SP.
1175
1179
if (Opc != X86::LEA64_32r) {
1176
1180
NewSrc = SrcReg;
1181
+ NewSrcSubReg = SubReg;
1177
1182
assert (!Src.isUndef () && " Undef op doesn't need optimization" );
1178
1183
1179
1184
if (NewSrc.isVirtual () && !MF.getRegInfo ().constrainRegClass (NewSrc, RC))
@@ -1189,16 +1194,18 @@ bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
1189
1194
ImplicitOp.setImplicit ();
1190
1195
1191
1196
NewSrc = getX86SubSuperRegister (SrcReg, 64 );
1197
+ assert (!SubReg && " no superregister for source" );
1192
1198
assert (NewSrc.isValid () && " Invalid Operand" );
1193
1199
assert (!Src.isUndef () && " Undef op doesn't need optimization" );
1194
1200
} else {
1195
1201
// Virtual register of the wrong class, we have to create a temporary 64-bit
1196
1202
// vreg to feed into the LEA.
1197
1203
NewSrc = MF.getRegInfo ().createVirtualRegister (RC);
1204
+ NewSrcSubReg = X86::NoSubRegister;
1198
1205
MachineInstr *Copy =
1199
1206
BuildMI (*MI.getParent (), MI, MI.getDebugLoc (), get (TargetOpcode::COPY))
1200
1207
.addReg (NewSrc, RegState::Define | RegState::Undef, X86::sub_32bit)
1201
- .addReg (SrcReg, getKillRegState (isKill));
1208
+ .addReg (SrcReg, getKillRegState (isKill), SubReg );
1202
1209
1203
1210
// Which is obviously going to be dead after we're done with it.
1204
1211
isKill = true ;
@@ -1258,7 +1265,9 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1258
1265
MachineBasicBlock::iterator MBBI = MI.getIterator ();
1259
1266
Register Dest = MI.getOperand (0 ).getReg ();
1260
1267
Register Src = MI.getOperand (1 ).getReg ();
1268
+ unsigned SrcSubReg = MI.getOperand (1 ).getSubReg ();
1261
1269
Register Src2;
1270
+ unsigned Src2SubReg;
1262
1271
bool IsDead = MI.getOperand (0 ).isDead ();
1263
1272
bool IsKill = MI.getOperand (1 ).isKill ();
1264
1273
unsigned SubReg = Is8BitOp ? X86::sub_8bit : X86::sub_16bit;
@@ -1268,7 +1277,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1268
1277
MachineInstr *InsMI =
1269
1278
BuildMI (MBB, MBBI, MI.getDebugLoc (), get (TargetOpcode::COPY))
1270
1279
.addReg (InRegLEA, RegState::Define, SubReg)
1271
- .addReg (Src, getKillRegState (IsKill));
1280
+ .addReg (Src, getKillRegState (IsKill), SrcSubReg );
1272
1281
MachineInstr *ImpDef2 = nullptr ;
1273
1282
MachineInstr *InsMI2 = nullptr ;
1274
1283
@@ -1306,12 +1315,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1306
1315
case X86::ADD16rr:
1307
1316
case X86::ADD16rr_DB: {
1308
1317
Src2 = MI.getOperand (2 ).getReg ();
1318
+ Src2SubReg = MI.getOperand (2 ).getSubReg ();
1309
1319
bool IsKill2 = MI.getOperand (2 ).isKill ();
1310
1320
assert (!MI.getOperand (2 ).isUndef () && " Undef op doesn't need optimization" );
1311
1321
if (Src == Src2) {
1312
1322
// ADD8rr/ADD16rr killed %reg1028, %reg1028
1313
1323
// just a single insert_subreg.
1314
- addRegReg (MIB, InRegLEA, true , InRegLEA, false );
1324
+ addRegReg (MIB, InRegLEA, true , X86::NoSubRegister, InRegLEA, false ,
1325
+ X86::NoSubRegister);
1315
1326
} else {
1316
1327
if (Subtarget.is64Bit ())
1317
1328
InRegLEA2 = RegInfo.createVirtualRegister (&X86::GR64_NOSPRegClass);
@@ -1323,8 +1334,9 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1323
1334
InRegLEA2);
1324
1335
InsMI2 = BuildMI (MBB, &*MIB, MI.getDebugLoc (), get (TargetOpcode::COPY))
1325
1336
.addReg (InRegLEA2, RegState::Define, SubReg)
1326
- .addReg (Src2, getKillRegState (IsKill2));
1327
- addRegReg (MIB, InRegLEA, true , InRegLEA2, true );
1337
+ .addReg (Src2, getKillRegState (IsKill2), Src2SubReg);
1338
+ addRegReg (MIB, InRegLEA, true , X86::NoSubRegister, InRegLEA2, true ,
1339
+ X86::NoSubRegister);
1328
1340
}
1329
1341
if (LV && IsKill2 && InsMI2)
1330
1342
LV->replaceKillInstruction (Src2, MI, *InsMI2);
@@ -1428,6 +1440,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1428
1440
1429
1441
MachineInstr *NewMI = nullptr ;
1430
1442
Register SrcReg, SrcReg2;
1443
+ unsigned SrcSubReg, SrcSubReg2;
1431
1444
bool Is64Bit = Subtarget.is64Bit ();
1432
1445
1433
1446
bool Is8BitOp = false ;
@@ -1467,17 +1480,18 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1467
1480
// LEA can't handle ESP.
1468
1481
bool isKill;
1469
1482
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1470
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1471
- ImplicitOp, LV, LIS))
1483
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1484
+ isKill, ImplicitOp, LV, LIS))
1472
1485
return nullptr ;
1473
1486
1474
- MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
1475
- .add (Dest)
1476
- .addReg (0 )
1477
- .addImm (1LL << ShAmt)
1478
- .addReg (SrcReg, getKillRegState (isKill))
1479
- .addImm (0 )
1480
- .addReg (0 );
1487
+ MachineInstrBuilder MIB =
1488
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1489
+ .add (Dest)
1490
+ .addReg (0 )
1491
+ .addImm (1LL << ShAmt)
1492
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg)
1493
+ .addImm (0 )
1494
+ .addReg (0 );
1481
1495
if (ImplicitOp.getReg () != 0 )
1482
1496
MIB.add (ImplicitOp);
1483
1497
NewMI = MIB;
@@ -1505,8 +1519,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1505
1519
: (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
1506
1520
bool isKill;
1507
1521
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1508
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1509
- ImplicitOp, LV, LIS))
1522
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1523
+ isKill, ImplicitOp, LV, LIS))
1510
1524
return nullptr ;
1511
1525
1512
1526
MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
@@ -1531,8 +1545,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1531
1545
1532
1546
bool isKill;
1533
1547
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1534
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1535
- ImplicitOp, LV, LIS))
1548
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1549
+ isKill, ImplicitOp, LV, LIS))
1536
1550
return nullptr ;
1537
1551
1538
1552
MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
@@ -1569,8 +1583,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1569
1583
const MachineOperand &Src2 = MI.getOperand (2 );
1570
1584
bool isKill2;
1571
1585
MachineOperand ImplicitOp2 = MachineOperand::CreateReg (0 , false );
1572
- if (!classifyLEAReg (MI, Src2, Opc, /* AllowSP=*/ false , SrcReg2, isKill2 ,
1573
- ImplicitOp2, LV, LIS))
1586
+ if (!classifyLEAReg (MI, Src2, Opc, /* AllowSP=*/ false , SrcReg2, SrcSubReg2 ,
1587
+ isKill2, ImplicitOp2, LV, LIS))
1574
1588
return nullptr ;
1575
1589
1576
1590
bool isKill;
@@ -1580,9 +1594,10 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1580
1594
// the first call inserted a COPY from Src2 and marked it as killed.
1581
1595
isKill = isKill2;
1582
1596
SrcReg = SrcReg2;
1597
+ SrcSubReg = SrcSubReg2;
1583
1598
} else {
1584
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1585
- ImplicitOp, LV, LIS))
1599
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1600
+ isKill, ImplicitOp, LV, LIS))
1586
1601
return nullptr ;
1587
1602
}
1588
1603
@@ -1592,7 +1607,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1592
1607
if (ImplicitOp2.getReg () != 0 )
1593
1608
MIB.add (ImplicitOp2);
1594
1609
1595
- NewMI = addRegReg (MIB, SrcReg, isKill, SrcReg2, isKill2);
1610
+ NewMI =
1611
+ addRegReg (MIB, SrcReg, isKill, SrcSubReg, SrcReg2, isKill2, SrcSubReg2);
1596
1612
1597
1613
// Add kills if classifyLEAReg created a new register.
1598
1614
if (LV) {
@@ -1625,13 +1641,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1625
1641
1626
1642
bool isKill;
1627
1643
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1628
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1629
- ImplicitOp, LV, LIS))
1644
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1645
+ isKill, ImplicitOp, LV, LIS))
1630
1646
return nullptr ;
1631
1647
1632
- MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
1633
- .add (Dest)
1634
- .addReg (SrcReg, getKillRegState (isKill));
1648
+ MachineInstrBuilder MIB =
1649
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1650
+ .add (Dest)
1651
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg);
1635
1652
if (ImplicitOp.getReg () != 0 )
1636
1653
MIB.add (ImplicitOp);
1637
1654
@@ -1665,13 +1682,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1665
1682
1666
1683
bool isKill;
1667
1684
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1668
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1669
- ImplicitOp, LV, LIS))
1685
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1686
+ isKill, ImplicitOp, LV, LIS))
1670
1687
return nullptr ;
1671
1688
1672
- MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
1673
- .add (Dest)
1674
- .addReg (SrcReg, getKillRegState (isKill));
1689
+ MachineInstrBuilder MIB =
1690
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1691
+ .add (Dest)
1692
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg);
1675
1693
if (ImplicitOp.getReg () != 0 )
1676
1694
MIB.add (ImplicitOp);
1677
1695
0 commit comments