Instructions with unique labels or embedded jumptables cannot be duplicated during ifcvt.

llvm-svn: 37606
This commit is contained in:
Evan Cheng 2007-06-15 21:15:00 +00:00
parent 297d43be00
commit 36b1f5476e
2 changed files with 31 additions and 0 deletions

View File

@ -446,6 +446,35 @@ bool ARMInstrInfo::isPredicated(const MachineInstr *MI) const {
return PIdx != -1 && MI->getOperand(PIdx).getImmedValue() != ARMCC::AL;
}
bool ARMInstrInfo::CanBeDuplicated(const MachineInstr *MI) const {
switch (MI->getOpcode()) {
default: return true;
// These have unique labels.
case ARM::PICADD:
case ARM::PICLD:
case ARM::PICLDZH:
case ARM::PICLDZB:
case ARM::PICLDH:
case ARM::PICLDB:
case ARM::PICLDSH:
case ARM::PICLDSB:
case ARM::PICSTR:
case ARM::PICSTRH:
case ARM::PICSTRB:
case ARM::LEApcrel:
case ARM::LEApcrelJT:
case ARM::tPICADD:
case ARM::tLEApcrel:
case ARM::tLEApcrelJT:
case ARM::CONSTPOOL_ENTRY:
// These embed jumptables.
case ARM::BR_JTr:
case ARM::BR_JTm:
case ARM::BR_JTadd:
return false;
}
}
bool ARMInstrInfo::PredicateInstruction(MachineInstr *MI,
const std::vector<MachineOperand> &Pred) const {
unsigned Opc = MI->getOpcode();

View File

@ -106,6 +106,8 @@ public:
// Predication support.
virtual bool isPredicated(const MachineInstr *MI) const;
virtual bool CanBeDuplicated(const MachineInstr *MI) const;
virtual
bool PredicateInstruction(MachineInstr *MI,
const std::vector<MachineOperand> &Pred) const;