@@ -3244,64 +3244,18 @@ bool PPCInstrInfo::convertToImmediateForm(MachineInstr &MI,
3244
3244
return false ;
3245
3245
}
3246
3246
3247
- // This function tries to combine two RLWINMs. We not only perform such
3248
- // optimization in SSA, but also after RA, since some RLWINM is generated after
3249
- // RA.
3250
- bool PPCInstrInfo::simplifyRotateAndMaskInstr (MachineInstr &MI,
3251
- MachineInstr *&ToErase) const {
3252
- bool Is64Bit = false ;
3253
- switch (MI.getOpcode ()) {
3254
- case PPC::RLWINM:
3255
- case PPC::RLWINM_rec:
3256
- break ;
3257
- case PPC::RLWINM8:
3258
- case PPC::RLWINM8_rec:
3259
- Is64Bit = true ;
3260
- break ;
3261
- default :
3262
- return false ;
3263
- }
3247
+ bool PPCInstrInfo::combineRLWINM (MachineInstr &MI,
3248
+ MachineInstr **ToErase) const {
3264
3249
MachineRegisterInfo *MRI = &MI.getParent ()->getParent ()->getRegInfo ();
3265
- Register FoldingReg = MI.getOperand (1 ).getReg ();
3266
- MachineInstr *SrcMI = nullptr ;
3267
- bool CanErase = false ;
3268
- bool OtherIntermediateUse = true ;
3269
- if (MRI->isSSA ()) {
3270
- if (!Register::isVirtualRegister (FoldingReg))
3271
- return false ;
3272
- SrcMI = MRI->getVRegDef (FoldingReg);
3273
- } else {
3274
- SrcMI = getDefMIPostRA (FoldingReg, MI, OtherIntermediateUse);
3275
- }
3276
- if (!SrcMI)
3250
+ unsigned FoldingReg = MI.getOperand (1 ).getReg ();
3251
+ if (!Register::isVirtualRegister (FoldingReg))
3277
3252
return false ;
3278
- // TODO: The pairs of RLWINM8(RLWINM) or RLWINM(RLWINM8) never occur before
3279
- // RA, but after RA. And We can fold RLWINM8(RLWINM) -> RLWINM8, or
3280
- // RLWINM(RLWINM8) -> RLWINM.
3281
- switch (SrcMI->getOpcode ()) {
3282
- case PPC::RLWINM:
3283
- case PPC::RLWINM_rec:
3284
- if (Is64Bit)
3285
- return false ;
3286
- break ;
3287
- case PPC::RLWINM8:
3288
- case PPC::RLWINM8_rec:
3289
- if (!Is64Bit)
3290
- return false ;
3291
- break ;
3292
- default :
3253
+ MachineInstr *SrcMI = MRI->getVRegDef (FoldingReg);
3254
+ if (SrcMI->getOpcode () != PPC::RLWINM &&
3255
+ SrcMI->getOpcode () != PPC::RLWINM_rec &&
3256
+ SrcMI->getOpcode () != PPC::RLWINM8 &&
3257
+ SrcMI->getOpcode () != PPC::RLWINM8_rec)
3293
3258
return false ;
3294
- }
3295
- if (MRI->isSSA ()) {
3296
- CanErase = !SrcMI->hasImplicitDef () && MRI->hasOneNonDBGUse (FoldingReg);
3297
- } else {
3298
- CanErase = !OtherIntermediateUse && MI.getOperand (1 ).isKill () &&
3299
- !SrcMI->hasImplicitDef ();
3300
- // In post-RA, if SrcMI also defines the register to be forwarded, we can
3301
- // only do the folding if SrcMI is going to be erased.
3302
- if (!CanErase && SrcMI->definesRegister (SrcMI->getOperand (1 ).getReg ()))
3303
- return false ;
3304
- }
3305
3259
assert ((MI.getOperand (2 ).isImm () && MI.getOperand (3 ).isImm () &&
3306
3260
MI.getOperand (4 ).isImm () && SrcMI->getOperand (2 ).isImm () &&
3307
3261
SrcMI->getOperand (3 ).isImm () && SrcMI->getOperand (4 ).isImm ()) &&
@@ -3312,6 +3266,7 @@ bool PPCInstrInfo::simplifyRotateAndMaskInstr(MachineInstr &MI,
3312
3266
uint64_t MBMI = MI.getOperand (3 ).getImm ();
3313
3267
uint64_t MESrc = SrcMI->getOperand (4 ).getImm ();
3314
3268
uint64_t MEMI = MI.getOperand (4 ).getImm ();
3269
+
3315
3270
assert ((MEMI < 32 && MESrc < 32 && MBMI < 32 && MBSrc < 32 ) &&
3316
3271
" Invalid PPC::RLWINM Instruction!" );
3317
3272
// If MBMI is bigger than MEMI, we always can not get run of ones.
@@ -3355,6 +3310,8 @@ bool PPCInstrInfo::simplifyRotateAndMaskInstr(MachineInstr &MI,
3355
3310
3356
3311
// If final mask is 0, MI result should be 0 too.
3357
3312
if (FinalMask.isNullValue ()) {
3313
+ bool Is64Bit =
3314
+ (MI.getOpcode () == PPC::RLWINM8 || MI.getOpcode () == PPC::RLWINM8_rec);
3358
3315
Simplified = true ;
3359
3316
LLVM_DEBUG (dbgs () << " Replace Instr: " );
3360
3317
LLVM_DEBUG (MI.dump ());
@@ -3412,10 +3369,12 @@ bool PPCInstrInfo::simplifyRotateAndMaskInstr(MachineInstr &MI,
3412
3369
LLVM_DEBUG (dbgs () << " To: " );
3413
3370
LLVM_DEBUG (MI.dump ());
3414
3371
}
3415
- if (Simplified && CanErase) {
3416
- // If SrcMI has no implicit def, and FoldingReg has no non-debug use or
3417
- // its flag is "killed", it's safe to delete SrcMI. Otherwise keep it.
3418
- ToErase = SrcMI;
3372
+ if (Simplified & MRI->use_nodbg_empty (FoldingReg) &&
3373
+ !SrcMI->hasImplicitDef ()) {
3374
+ // If FoldingReg has no non-debug use and it has no implicit def (it
3375
+ // is not RLWINMO or RLWINM8o), it's safe to delete its def SrcMI.
3376
+ // Otherwise keep it.
3377
+ *ToErase = SrcMI;
3419
3378
LLVM_DEBUG (dbgs () << " Delete dead instruction: " );
3420
3379
LLVM_DEBUG (SrcMI->dump ());
3421
3380
}
0 commit comments