@@ -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,14 @@ 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
1173
1175
// For both LEA64 and LEA32 the register already has essentially the right
1174
1176
// type (32-bit or 64-bit) we may just need to forbid SP.
1175
1177
if (Opc != X86::LEA64_32r) {
1176
1178
NewSrc = SrcReg;
1179
+ NewSrcSubReg = SubReg;
1177
1180
assert (!Src.isUndef () && " Undef op doesn't need optimization" );
1178
1181
1179
1182
if (NewSrc.isVirtual () && !MF.getRegInfo ().constrainRegClass (NewSrc, RC))
@@ -1189,6 +1192,7 @@ bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
1189
1192
ImplicitOp.setImplicit ();
1190
1193
1191
1194
NewSrc = getX86SubSuperRegister (SrcReg, 64 );
1195
+ assert (!SubReg && " no super register for source" " );
1192
1196
assert(NewSrc.isValid() && " Invalid Operand" );
1193
1197
assert(!Src.isUndef() && " Undef op doesn' t need optimization");
1194
1198
} else {
@@ -1198,7 +1202,7 @@ bool X86InstrInfo::classifyLEAReg(MachineInstr &MI, const MachineOperand &Src,
1198
1202
MachineInstr *Copy =
1199
1203
BuildMI(*MI.getParent(), MI, MI.getDebugLoc(), get(TargetOpcode::COPY))
1200
1204
.addReg(NewSrc, RegState::Define | RegState::Undef, X86::sub_32bit)
1201
- .addReg (SrcReg, getKillRegState (isKill));
1205
+ .addReg(SrcReg, getKillRegState(isKill), SubReg );
1202
1206
1203
1207
// Which is obviously going to be dead after we' re done with it.
1204
1208
isKill = true ;
@@ -1258,7 +1262,9 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1258
1262
MachineBasicBlock::iterator MBBI = MI.getIterator ();
1259
1263
Register Dest = MI.getOperand (0 ).getReg ();
1260
1264
Register Src = MI.getOperand (1 ).getReg ();
1265
+ unsigned SrcSubReg = MI.getOperand (1 ).getSubReg ();
1261
1266
Register Src2;
1267
+ unsigned Src2SubReg;
1262
1268
bool IsDead = MI.getOperand (0 ).isDead ();
1263
1269
bool IsKill = MI.getOperand (1 ).isKill ();
1264
1270
unsigned SubReg = Is8BitOp ? X86::sub_8bit : X86::sub_16bit;
@@ -1268,7 +1274,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1268
1274
MachineInstr *InsMI =
1269
1275
BuildMI (MBB, MBBI, MI.getDebugLoc (), get (TargetOpcode::COPY))
1270
1276
.addReg (InRegLEA, RegState::Define, SubReg)
1271
- .addReg (Src, getKillRegState (IsKill));
1277
+ .addReg (Src, getKillRegState (IsKill), SrcSubReg );
1272
1278
MachineInstr *ImpDef2 = nullptr ;
1273
1279
MachineInstr *InsMI2 = nullptr ;
1274
1280
@@ -1306,6 +1312,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1306
1312
case X86::ADD16rr:
1307
1313
case X86::ADD16rr_DB: {
1308
1314
Src2 = MI.getOperand (2 ).getReg ();
1315
+ Src2SubReg = MI.getOperand (2 ).getSubReg ();
1309
1316
bool IsKill2 = MI.getOperand (2 ).isKill ();
1310
1317
assert (!MI.getOperand (2 ).isUndef () && " Undef op doesn't need optimization" );
1311
1318
if (Src == Src2) {
@@ -1323,7 +1330,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1323
1330
InRegLEA2);
1324
1331
InsMI2 = BuildMI (MBB, &*MIB, MI.getDebugLoc (), get (TargetOpcode::COPY))
1325
1332
.addReg (InRegLEA2, RegState::Define, SubReg)
1326
- .addReg (Src2, getKillRegState (IsKill2));
1333
+ .addReg (Src2, getKillRegState (IsKill2), Src2SubReg );
1327
1334
addRegReg (MIB, InRegLEA, true , InRegLEA2, true );
1328
1335
}
1329
1336
if (LV && IsKill2 && InsMI2)
@@ -1428,6 +1435,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1428
1435
1429
1436
MachineInstr *NewMI = nullptr ;
1430
1437
Register SrcReg, SrcReg2;
1438
+ unsigned SrcSubReg, SrcSubReg2;
1431
1439
bool Is64Bit = Subtarget.is64Bit ();
1432
1440
1433
1441
bool Is8BitOp = false ;
@@ -1467,17 +1475,18 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1467
1475
// LEA can't handle ESP.
1468
1476
bool isKill;
1469
1477
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1470
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1471
- ImplicitOp, LV, LIS))
1478
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1479
+ isKill, ImplicitOp, LV, LIS))
1472
1480
return nullptr ;
1473
1481
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 );
1482
+ MachineInstrBuilder MIB =
1483
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1484
+ .add (Dest)
1485
+ .addReg (0 )
1486
+ .addImm (1LL << ShAmt)
1487
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg)
1488
+ .addImm (0 )
1489
+ .addReg (0 );
1481
1490
if (ImplicitOp.getReg () != 0 )
1482
1491
MIB.add (ImplicitOp);
1483
1492
NewMI = MIB;
@@ -1505,8 +1514,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1505
1514
: (Is64Bit ? X86::LEA64_32r : X86::LEA32r);
1506
1515
bool isKill;
1507
1516
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1508
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1509
- ImplicitOp, LV, LIS))
1517
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1518
+ isKill, ImplicitOp, LV, LIS))
1510
1519
return nullptr ;
1511
1520
1512
1521
MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
@@ -1531,8 +1540,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1531
1540
1532
1541
bool isKill;
1533
1542
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1534
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, isKill ,
1535
- ImplicitOp, LV, LIS))
1543
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ false , SrcReg, SrcSubReg ,
1544
+ isKill, ImplicitOp, LV, LIS))
1536
1545
return nullptr ;
1537
1546
1538
1547
MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
@@ -1569,8 +1578,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1569
1578
const MachineOperand &Src2 = MI.getOperand (2 );
1570
1579
bool isKill2;
1571
1580
MachineOperand ImplicitOp2 = MachineOperand::CreateReg (0 , false );
1572
- if (!classifyLEAReg (MI, Src2, Opc, /* AllowSP=*/ false , SrcReg2, isKill2 ,
1573
- ImplicitOp2, LV, LIS))
1581
+ if (!classifyLEAReg (MI, Src2, Opc, /* AllowSP=*/ false , SrcReg2, SrcSubReg2 ,
1582
+ isKill2, ImplicitOp2, LV, LIS))
1574
1583
return nullptr ;
1575
1584
1576
1585
bool isKill;
@@ -1581,8 +1590,8 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1581
1590
isKill = isKill2;
1582
1591
SrcReg = SrcReg2;
1583
1592
} else {
1584
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1585
- ImplicitOp, LV, LIS))
1593
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1594
+ isKill, ImplicitOp, LV, LIS))
1586
1595
return nullptr ;
1587
1596
}
1588
1597
@@ -1592,7 +1601,7 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1592
1601
if (ImplicitOp2.getReg () != 0 )
1593
1602
MIB.add (ImplicitOp2);
1594
1603
1595
- NewMI = addRegReg (MIB, SrcReg, isKill, SrcReg2, isKill2);
1604
+ NewMI = addRegReg (MIB, SrcReg, isKill, SrcReg2, isKill2); // FIXME: Subregs
1596
1605
1597
1606
// Add kills if classifyLEAReg created a new register.
1598
1607
if (LV) {
@@ -1625,13 +1634,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1625
1634
1626
1635
bool isKill;
1627
1636
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1628
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1629
- ImplicitOp, LV, LIS))
1637
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1638
+ isKill, ImplicitOp, LV, LIS))
1630
1639
return nullptr ;
1631
1640
1632
- MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
1633
- .add (Dest)
1634
- .addReg (SrcReg, getKillRegState (isKill));
1641
+ MachineInstrBuilder MIB =
1642
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1643
+ .add (Dest)
1644
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg);
1635
1645
if (ImplicitOp.getReg () != 0 )
1636
1646
MIB.add (ImplicitOp);
1637
1647
@@ -1665,13 +1675,14 @@ MachineInstr *X86InstrInfo::convertToThreeAddress(MachineInstr &MI,
1665
1675
1666
1676
bool isKill;
1667
1677
MachineOperand ImplicitOp = MachineOperand::CreateReg (0 , false );
1668
- if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, isKill ,
1669
- ImplicitOp, LV, LIS))
1678
+ if (!classifyLEAReg (MI, Src, Opc, /* AllowSP=*/ true , SrcReg, SrcSubReg ,
1679
+ isKill, ImplicitOp, LV, LIS))
1670
1680
return nullptr ;
1671
1681
1672
- MachineInstrBuilder MIB = BuildMI (MF, MI.getDebugLoc (), get (Opc))
1673
- .add (Dest)
1674
- .addReg (SrcReg, getKillRegState (isKill));
1682
+ MachineInstrBuilder MIB =
1683
+ BuildMI (MF, MI.getDebugLoc (), get (Opc))
1684
+ .add (Dest)
1685
+ .addReg (SrcReg, getKillRegState (isKill), SrcSubReg);
1675
1686
if (ImplicitOp.getReg () != 0 )
1676
1687
MIB.add (ImplicitOp);
1677
1688
0 commit comments