forked from OSchip/llvm-project
Revert "[ARM][MVE] VPT Blocks: findVCMPToFoldIntoVPS"
This reverts commit e34801c8e6
and the followup due to multiple
problems.
I've tried to keep the tests and RDA parts where possible, as those
still seem useful.
This commit is contained in:
parent
ba3a1774a9
commit
d50e188a07
|
@ -22,9 +22,9 @@
|
|||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineInstrBundle.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/ReachingDefAnalysis.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/MC/MCInstrDesc.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include <cassert>
|
||||
#include <new>
|
||||
|
@ -37,21 +37,16 @@ namespace {
|
|||
class MVEVPTBlock : public MachineFunctionPass {
|
||||
public:
|
||||
static char ID;
|
||||
const Thumb2InstrInfo *TII;
|
||||
const TargetRegisterInfo *TRI;
|
||||
|
||||
MVEVPTBlock() : MachineFunctionPass(ID) {}
|
||||
|
||||
bool runOnMachineFunction(MachineFunction &Fn) override;
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
AU.addRequired<ReachingDefAnalysis>();
|
||||
MachineFunctionPass::getAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
MachineFunctionProperties getRequiredProperties() const override {
|
||||
return MachineFunctionProperties().set(
|
||||
MachineFunctionProperties::Property::NoVRegs).set(
|
||||
MachineFunctionProperties::Property::TracksLiveness);
|
||||
MachineFunctionProperties::Property::NoVRegs);
|
||||
}
|
||||
|
||||
StringRef getPassName() const override {
|
||||
|
@ -60,9 +55,6 @@ namespace {
|
|||
|
||||
private:
|
||||
bool InsertVPTBlocks(MachineBasicBlock &MBB);
|
||||
|
||||
const Thumb2InstrInfo *TII = nullptr;
|
||||
ReachingDefAnalysis *RDA = nullptr;
|
||||
};
|
||||
|
||||
char MVEVPTBlock::ID = 0;
|
||||
|
@ -71,32 +63,41 @@ namespace {
|
|||
|
||||
INITIALIZE_PASS(MVEVPTBlock, DEBUG_TYPE, "ARM MVE VPT block pass", false, false)
|
||||
|
||||
static MachineInstr *findVCMPToFoldIntoVPST(MachineInstr *MI,
|
||||
ReachingDefAnalysis *RDA,
|
||||
static MachineInstr *findVCMPToFoldIntoVPST(MachineBasicBlock::iterator MI,
|
||||
const TargetRegisterInfo *TRI,
|
||||
unsigned &NewOpcode) {
|
||||
// First, search backwards to the instruction that defines VPR
|
||||
auto *Def = RDA->getReachingMIDef(MI, ARM::VPR);
|
||||
if (!Def)
|
||||
// Search backwards to the instruction that defines VPR. This may or not
|
||||
// be a VCMP, we check that after this loop. If we find another instruction
|
||||
// that reads cpsr, we return nullptr.
|
||||
MachineBasicBlock::iterator CmpMI = MI;
|
||||
while (CmpMI != MI->getParent()->begin()) {
|
||||
--CmpMI;
|
||||
if (CmpMI->modifiesRegister(ARM::VPR, TRI))
|
||||
break;
|
||||
if (CmpMI->readsRegister(ARM::VPR, TRI))
|
||||
break;
|
||||
}
|
||||
|
||||
if (CmpMI == MI)
|
||||
return nullptr;
|
||||
NewOpcode = VCMPOpcodeToVPT(CmpMI->getOpcode());
|
||||
if (NewOpcode == 0)
|
||||
return nullptr;
|
||||
|
||||
// Now check that Def is a VCMP
|
||||
if (!(NewOpcode = VCMPOpcodeToVPT(Def->getOpcode())))
|
||||
// Search forward from CmpMI to MI, checking if either register was def'd
|
||||
if (registerDefinedBetween(CmpMI->getOperand(1).getReg(), std::next(CmpMI),
|
||||
MI, TRI))
|
||||
return nullptr;
|
||||
|
||||
// Check that Def's operands are not defined between the VCMP and MI, i.e.
|
||||
// check that they have the same reaching def.
|
||||
if (!RDA->hasSameReachingDef(Def, MI, Def->getOperand(1).getReg()) ||
|
||||
!RDA->hasSameReachingDef(Def, MI, Def->getOperand(2).getReg()))
|
||||
if (registerDefinedBetween(CmpMI->getOperand(2).getReg(), std::next(CmpMI),
|
||||
MI, TRI))
|
||||
return nullptr;
|
||||
|
||||
return Def;
|
||||
return &*CmpMI;
|
||||
}
|
||||
|
||||
bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
|
||||
bool Modified = false;
|
||||
MachineBasicBlock::instr_iterator MBIter = Block.instr_begin();
|
||||
MachineBasicBlock::instr_iterator EndIter = Block.instr_end();
|
||||
SmallSet<MachineInstr *, 4> RemovedVCMPs;
|
||||
|
||||
while (MBIter != EndIter) {
|
||||
MachineInstr *MI = &*MBIter;
|
||||
|
@ -142,7 +143,7 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
|
|||
// a VPST directly
|
||||
MachineInstrBuilder MIBuilder;
|
||||
unsigned NewOpcode;
|
||||
MachineInstr *VCMP = findVCMPToFoldIntoVPST(MI, RDA, NewOpcode);
|
||||
MachineInstr *VCMP = findVCMPToFoldIntoVPST(MI, TRI, NewOpcode);
|
||||
if (VCMP) {
|
||||
LLVM_DEBUG(dbgs() << " folding VCMP into VPST: "; VCMP->dump());
|
||||
MIBuilder = BuildMI(Block, MI, dl, TII->get(NewOpcode));
|
||||
|
@ -150,11 +151,7 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
|
|||
MIBuilder.add(VCMP->getOperand(1));
|
||||
MIBuilder.add(VCMP->getOperand(2));
|
||||
MIBuilder.add(VCMP->getOperand(3));
|
||||
// We delay removing the actual VCMP instruction by saving it to a list
|
||||
// and deleting all instructions in this list in one go after we have
|
||||
// created the VPT blocks. We do this in order not to invalidate the
|
||||
// ReachingDefAnalysis that is queried by 'findVCMPToFoldIntoVPST'.
|
||||
RemovedVCMPs.insert(VCMP);
|
||||
VCMP->eraseFromParent();
|
||||
} else {
|
||||
MIBuilder = BuildMI(Block, MI, dl, TII->get(ARM::MVE_VPST));
|
||||
MIBuilder.addImm(BlockMask);
|
||||
|
@ -165,17 +162,10 @@ bool MVEVPTBlock::InsertVPTBlocks(MachineBasicBlock &Block) {
|
|||
|
||||
Modified = true;
|
||||
}
|
||||
|
||||
for (auto *I : RemovedVCMPs)
|
||||
I->eraseFromParent();
|
||||
|
||||
return Modified;
|
||||
}
|
||||
|
||||
bool MVEVPTBlock::runOnMachineFunction(MachineFunction &Fn) {
|
||||
if (skipFunction(Fn.getFunction()))
|
||||
return false;
|
||||
|
||||
const ARMSubtarget &STI =
|
||||
static_cast<const ARMSubtarget &>(Fn.getSubtarget());
|
||||
|
||||
|
@ -183,7 +173,7 @@ bool MVEVPTBlock::runOnMachineFunction(MachineFunction &Fn) {
|
|||
return false;
|
||||
|
||||
TII = static_cast<const Thumb2InstrInfo *>(STI.getInstrInfo());
|
||||
RDA = &getAnalysis<ReachingDefAnalysis>();
|
||||
TRI = STI.getRegisterInfo();
|
||||
|
||||
LLVM_DEBUG(dbgs() << "********** ARM MVE VPT BLOCKS **********\n"
|
||||
<< "********** Function: " << Fn.getName() << '\n');
|
||||
|
|
|
@ -145,7 +145,6 @@
|
|||
; CHECK-NEXT: Machine Natural Loop Construction
|
||||
; CHECK-NEXT: Machine Block Frequency Analysis
|
||||
; CHECK-NEXT: If Converter
|
||||
; CHECK-NEXT: ReachingDefAnalysis
|
||||
; CHECK-NEXT: MVE VPT block insertion pass
|
||||
; CHECK-NEXT: Thumb IT blocks insertion pass
|
||||
; CHECK-NEXT: MachineDominator Tree Construction
|
||||
|
|
|
@ -73,9 +73,9 @@ body: |
|
|||
; CHECK: renamable $q6 = MVE_VLDRBU32 killed renamable $r4, 0, 1, internal renamable $vpr
|
||||
; CHECK: }
|
||||
; CHECK: renamable $r4 = t2ADDrr renamable $r11, renamable $r10, 14, $noreg, $noreg
|
||||
; CHECK: BUNDLE implicit-def dead $vpr, implicit-def $q7, implicit-def $d14, implicit-def $s28, implicit-def $s29, implicit-def $d15, implicit-def $s30, implicit-def $s31, implicit $q1, implicit $q5, implicit killed $r4 {
|
||||
; CHECK: MVE_VPTv4u32 8, renamable $q1, renamable $q5, 2, implicit-def $vpr
|
||||
; CHECK: renamable $q7 = MVE_VLDRBU32 killed renamable $r4, 0, 1, internal killed renamable $vpr
|
||||
; CHECK: BUNDLE implicit-def $q7, implicit-def $d14, implicit-def $s28, implicit-def $s29, implicit-def $d15, implicit-def $s30, implicit-def $s31, implicit killed $vpr, implicit killed $r4 {
|
||||
; CHECK: MVE_VPST 8, implicit $vpr
|
||||
; CHECK: renamable $q7 = MVE_VLDRBU32 killed renamable $r4, 0, 1, killed renamable $vpr
|
||||
; CHECK: }
|
||||
; CHECK: t2LoopEnd renamable $lr, %bb.0, implicit-def dead $cpsr
|
||||
; CHECK: t2B %bb.0, 14, $noreg
|
||||
|
|
|
@ -66,7 +66,10 @@ body: |
|
|||
; CHECK-LABEL: name: test_vminnmq_m_f32_v2
|
||||
; CHECK: liveins: $q0, $q1, $q2, $r0
|
||||
; CHECK: $vpr = VMSR_P0 killed $r0, 14, $noreg
|
||||
; CHECK: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0
|
||||
; CHECK: BUNDLE implicit-def $q0, implicit-def $d0, implicit-def $s0, implicit-def $s1, implicit-def $d1, implicit-def $s2, implicit-def $s3, implicit killed $vpr, implicit killed $q1, implicit killed $q2, implicit killed $q0 {
|
||||
; CHECK: MVE_VPST 8, implicit $vpr
|
||||
; CHECK: renamable $q0 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0
|
||||
; CHECK: }
|
||||
; CHECK: tBX_RET 14, $noreg, implicit $q0
|
||||
$vpr = VMSR_P0 killed $r0, 14, $noreg
|
||||
renamable $q0 = nnan ninf nsz MVE_VMINNMf32 killed renamable $q1, killed renamable $q2, 1, killed renamable $vpr, killed renamable $q0
|
||||
|
|
Loading…
Reference in New Issue