@@ -54,6 +54,11 @@ ReMatPICStubLoad("remat-pic-stub-load",
54
54
X86InstrInfo::X86InstrInfo (X86TargetMachine &tm)
55
55
: TargetInstrInfoImpl(X86Insts, array_lengthof(X86Insts)),
56
56
TM(tm), RI(tm, *this ) {
57
+ enum {
58
+ TB_NOT_REVERSABLE = 1U << 31 ,
59
+ TB_FLAGS = TB_NOT_REVERSABLE
60
+ };
61
+
57
62
static const unsigned OpTbl2Addr[][2 ] = {
58
63
{ X86::ADC32ri, X86::ADC32mi },
59
64
{ X86::ADC32ri8, X86::ADC32mi8 },
@@ -64,12 +69,15 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
64
69
{ X86::ADD16ri, X86::ADD16mi },
65
70
{ X86::ADD16ri8, X86::ADD16mi8 },
66
71
{ X86::ADD16rr, X86::ADD16mr },
72
+ { X86::ADD16rr_DB, X86::ADD16mr | TB_NOT_REVERSABLE },
67
73
{ X86::ADD32ri, X86::ADD32mi },
68
74
{ X86::ADD32ri8, X86::ADD32mi8 },
69
75
{ X86::ADD32rr, X86::ADD32mr },
76
+ { X86::ADD32rr_DB, X86::ADD32mr | TB_NOT_REVERSABLE },
70
77
{ X86::ADD64ri32, X86::ADD64mi32 },
71
78
{ X86::ADD64ri8, X86::ADD64mi8 },
72
79
{ X86::ADD64rr, X86::ADD64mr },
80
+ { X86::ADD64rr_DB, X86::ADD64mr | TB_NOT_REVERSABLE },
73
81
{ X86::ADD8ri, X86::ADD8mi },
74
82
{ X86::ADD8rr, X86::ADD8mr },
75
83
{ X86::AND16ri, X86::AND16mi },
@@ -214,16 +222,21 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
214
222
215
223
for (unsigned i = 0 , e = array_lengthof (OpTbl2Addr); i != e; ++i) {
216
224
unsigned RegOp = OpTbl2Addr[i][0 ];
217
- unsigned MemOp = OpTbl2Addr[i][1 ];
218
- if (!RegOp2MemOpTable2Addr.insert (std::make_pair (RegOp,
219
- std::make_pair (MemOp,0 ))).second )
220
- assert (false && " Duplicated entries?" );
225
+ unsigned MemOp = OpTbl2Addr[i][1 ] & ~TB_FLAGS;
226
+ assert (!RegOp2MemOpTable2Addr.count (RegOp) && " Duplicated entries?" );
227
+ RegOp2MemOpTable2Addr[RegOp] = std::make_pair (MemOp, 0U );
228
+
229
+ // If this is not a reversable operation (because there is a many->one)
230
+ // mapping, don't insert the reverse of the operation into MemOp2RegOpTable.
231
+ if (OpTbl2Addr[i][1 ] & TB_NOT_REVERSABLE)
232
+ continue ;
233
+
221
234
// Index 0, folded load and store, no alignment requirement.
222
235
unsigned AuxInfo = 0 | (1 << 4 ) | (1 << 5 );
223
- if (!MemOp2RegOpTable. insert ( std::make_pair (MemOp,
224
- std::make_pair (RegOp,
225
- AuxInfo))). second )
226
- assert ( false && " Duplicated entries in unfolding maps? " );
236
+
237
+ assert (!MemOp2RegOpTable. count (MemOp) &&
238
+ " Duplicated entries in unfolding maps? " );
239
+ MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo );
227
240
}
228
241
229
242
// If the third value is 1, then it's folding either a load or a store.
@@ -453,8 +466,11 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
453
466
{ X86::ADC32rr, X86::ADC32rm, 0 },
454
467
{ X86::ADC64rr, X86::ADC64rm, 0 },
455
468
{ X86::ADD16rr, X86::ADD16rm, 0 },
469
+ { X86::ADD16rr_DB, X86::ADD16rm | TB_NOT_REVERSABLE, 0 },
456
470
{ X86::ADD32rr, X86::ADD32rm, 0 },
471
+ { X86::ADD32rr_DB, X86::ADD32rm | TB_NOT_REVERSABLE, 0 },
457
472
{ X86::ADD64rr, X86::ADD64rm, 0 },
473
+ { X86::ADD64rr_DB, X86::ADD64rm | TB_NOT_REVERSABLE, 0 },
458
474
{ X86::ADD8rr, X86::ADD8rm, 0 },
459
475
{ X86::ADDPDrr, X86::ADDPDrm, 16 },
460
476
{ X86::ADDPSrr, X86::ADDPSrm, 16 },
@@ -649,16 +665,23 @@ X86InstrInfo::X86InstrInfo(X86TargetMachine &tm)
649
665
650
666
for (unsigned i = 0 , e = array_lengthof (OpTbl2); i != e; ++i) {
651
667
unsigned RegOp = OpTbl2[i][0 ];
652
- unsigned MemOp = OpTbl2[i][1 ];
668
+ unsigned MemOp = OpTbl2[i][1 ] & ~TB_FLAGS ;
653
669
unsigned Align = OpTbl2[i][2 ];
654
- if (!RegOp2MemOpTable2.insert (std::make_pair (RegOp,
655
- std::make_pair (MemOp,Align))).second )
656
- assert (false && " Duplicated entries?" );
670
+
671
+ assert (!RegOp2MemOpTable2.count (RegOp) && " Duplicate entry!" );
672
+ RegOp2MemOpTable2[RegOp] = std::make_pair (MemOp, Align);
673
+
674
+
675
+ // If this is not a reversable operation (because there is a many->one)
676
+ // mapping, don't insert the reverse of the operation into MemOp2RegOpTable.
677
+ if (OpTbl2[i][1 ] & TB_NOT_REVERSABLE)
678
+ continue ;
679
+
657
680
// Index 2, folded load
658
681
unsigned AuxInfo = 2 | (1 << 4 );
659
- if (!MemOp2RegOpTable.insert ( std::make_pair ( MemOp,
660
- std::make_pair (RegOp, AuxInfo))). second )
661
- assert ( false && " Duplicated entries in unfolding maps? " );
682
+ assert (!MemOp2RegOpTable.count ( MemOp) &&
683
+ " Duplicated entries in unfolding maps? " );
684
+ MemOp2RegOpTable[MemOp] = std::make_pair (RegOp, AuxInfo );
662
685
}
663
686
}
664
687
@@ -1133,7 +1156,8 @@ X86InstrInfo::convertToThreeAddressWithLEA(unsigned MIOpc,
1133
1156
case X86::ADD16ri8:
1134
1157
addRegOffset (MIB, leaInReg, true , MI->getOperand (2 ).getImm ());
1135
1158
break ;
1136
- case X86::ADD16rr: {
1159
+ case X86::ADD16rr:
1160
+ case X86::ADD16rr_DB: {
1137
1161
unsigned Src2 = MI->getOperand (2 ).getReg ();
1138
1162
bool isKill2 = MI->getOperand (2 ).isKill ();
1139
1163
unsigned leaInReg2 = 0 ;
@@ -1346,18 +1370,27 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
1346
1370
Src, isKill, -1 );
1347
1371
break ;
1348
1372
case X86::ADD64rr:
1349
- case X86::ADD32rr: {
1373
+ case X86::ADD64rr_DB:
1374
+ case X86::ADD32rr:
1375
+ case X86::ADD32rr_DB: {
1350
1376
assert (MI->getNumOperands () >= 3 && " Unknown add instruction!" );
1351
- unsigned Opc = MIOpc == X86::ADD64rr ? X86::LEA64r
1352
- : (is64Bit ? X86::LEA64_32r : X86::LEA32r);
1377
+ unsigned Opc;
1378
+ TargetRegisterClass *RC;
1379
+ if (MIOpc == X86::ADD64rr || MIOpc == X86::ADD64rr_DB) {
1380
+ Opc = X86::LEA64r;
1381
+ RC = X86::GR64_NOSPRegisterClass;
1382
+ } else {
1383
+ Opc = is64Bit ? X86::LEA64_32r : X86::LEA32r;
1384
+ RC = X86::GR32_NOSPRegisterClass;
1385
+ }
1386
+
1387
+
1353
1388
unsigned Src2 = MI->getOperand (2 ).getReg ();
1354
1389
bool isKill2 = MI->getOperand (2 ).isKill ();
1355
1390
1356
1391
// LEA can't handle RSP.
1357
1392
if (TargetRegisterInfo::isVirtualRegister (Src2) &&
1358
- !MF.getRegInfo ().constrainRegClass (Src2,
1359
- MIOpc == X86::ADD64rr ? X86::GR64_NOSPRegisterClass :
1360
- X86::GR32_NOSPRegisterClass))
1393
+ !MF.getRegInfo ().constrainRegClass (Src2, RC))
1361
1394
return 0 ;
1362
1395
1363
1396
NewMI = addRegReg (BuildMI (MF, MI->getDebugLoc (), get (Opc))
@@ -1368,7 +1401,8 @@ X86InstrInfo::convertToThreeAddress(MachineFunction::iterator &MFI,
1368
1401
LV->replaceKillInstruction (Src2, MI, NewMI);
1369
1402
break ;
1370
1403
}
1371
- case X86::ADD16rr: {
1404
+ case X86::ADD16rr:
1405
+ case X86::ADD16rr_DB: {
1372
1406
if (DisableLEA16)
1373
1407
return is64Bit ? convertToThreeAddressWithLEA (MIOpc, MFI, MBBI, LV) : 0 ;
1374
1408
assert (MI->getNumOperands () >= 3 && " Unknown add instruction!" );
@@ -2596,13 +2630,8 @@ bool X86InstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
2596
2630
OpcodeTablePtr = &RegOp2MemOpTable2;
2597
2631
}
2598
2632
2599
- if (OpcodeTablePtr) {
2600
- // Find the Opcode to fuse
2601
- DenseMap<unsigned , std::pair<unsigned ,unsigned > >::const_iterator I =
2602
- OpcodeTablePtr->find (Opc);
2603
- if (I != OpcodeTablePtr->end ())
2604
- return true ;
2605
- }
2633
+ if (OpcodeTablePtr && OpcodeTablePtr->count (Opc))
2634
+ return true ;
2606
2635
return TargetInstrInfoImpl::canFoldMemoryOperand (MI, Ops);
2607
2636
}
2608
2637
0 commit comments