@@ -49,6 +49,7 @@ using namespace llvm;
49
49
#define DEBUG_TYPE "riscv-lower"
50
50
51
51
STATISTIC(NumTailCalls, "Number of tail calls");
52
+ STATISTIC(NumADDIsMerged, "Number of ADDIs merged.");
52
53
53
54
static cl::opt<unsigned> ExtensionMaxWebSize(
54
55
DEBUG_TYPE "-ext-max-web-size", cl::Hidden,
@@ -2278,6 +2279,81 @@ bool RISCVTargetLowering::isLegalElementTypeForRVV(EVT ScalarTy) const {
2278
2279
}
2279
2280
}
2280
2281
2282
+ static bool tryToFoldInstIntoUse(MachineInstr &UseMI, MachineInstr &MI) {
2283
+
2284
+ if (MI.getOpcode() != RISCV::ADDI)
2285
+ return false;
2286
+ if (!(MI.getOperand(0).isReg() && MI.getOperand(1).isReg()))
2287
+ return false;
2288
+
2289
+ switch (UseMI.getOpcode()) {
2290
+ default:
2291
+ return false;
2292
+ case RISCV::LB:
2293
+ case RISCV::LH:
2294
+ case RISCV::LW:
2295
+ case RISCV::LD:
2296
+ case RISCV::LBU:
2297
+ case RISCV::LHU:
2298
+ case RISCV::SB:
2299
+ case RISCV::SH:
2300
+ case RISCV::SW:
2301
+ case RISCV::SD:
2302
+ break;
2303
+ }
2304
+ MachineOperand &OriginalBaseMO = UseMI.getOperand(1);
2305
+ if (!OriginalBaseMO.isReg())
2306
+ return false;
2307
+ if (OriginalBaseMO.getReg() != MI.getOperand(0).getReg())
2308
+ return false;
2309
+
2310
+ MachineOperand &OriginalOffsetMO = UseMI.getOperand(2);
2311
+ MachineOperand &ADDIOffsetMO = MI.getOperand(2);
2312
+ if (!(OriginalOffsetMO.isImm() && ADDIOffsetMO.isImm()))
2313
+ return false;
2314
+
2315
+ int64_t OriginalOffset = OriginalOffsetMO.getImm();
2316
+ int64_t ADDIOffset = ADDIOffsetMO.getImm();
2317
+ int64_t TotalOffset = OriginalOffset + ADDIOffset;
2318
+ if (!isInt<12>(TotalOffset))
2319
+ return false;
2320
+
2321
+ OriginalOffsetMO.setImm(TotalOffset);
2322
+ OriginalBaseMO.setReg(MI.getOperand(1).getReg());
2323
+ NumADDIsMerged++;
2324
+ return true;
2325
+ }
2326
+
2327
+ void RISCVTargetLowering::finalizeLowering(MachineFunction &MF) const {
2328
+ TargetLoweringBase::finalizeLowering(MF);
2329
+ MachineRegisterInfo &MRI = MF.getRegInfo();
2330
+
2331
+ SmallVector<MachineInstr *, 8> ToErase;
2332
+ for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
2333
+ MachineBasicBlock *MBB = &*I;
2334
+ for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
2335
+ MBBI != MBBE;) {
2336
+ MachineInstr &MI = *MBBI++;
2337
+ if (MI.getOpcode() != RISCV::ADDI)
2338
+ continue;
2339
+ if (!MI.getOperand(0).isReg())
2340
+ continue;
2341
+ SmallVector<MachineInstr *, 4> Users;
2342
+ for (MachineInstr &UseMI :
2343
+ MRI.use_instructions(MI.getOperand(0).getReg()))
2344
+ Users.push_back(&UseMI);
2345
+ bool AllUsesWereFolded = true;
2346
+ for (MachineInstr *UseMI : Users)
2347
+ AllUsesWereFolded &= tryToFoldInstIntoUse(*UseMI, MI);
2348
+ if (AllUsesWereFolded)
2349
+ ToErase.push_back(&MI);
2350
+ }
2351
+ }
2352
+ for (MachineInstr *MI : ToErase)
2353
+ MI->eraseFromParent();
2354
+
2355
+ return;
2356
+ }
2281
2357
2282
2358
unsigned RISCVTargetLowering::combineRepeatedFPDivisors() const {
2283
2359
return NumRepeatedDivisors;
0 commit comments