Ignore:
Timestamp:
Apr 19, 2011, 11:12:07 PM (14 years ago)
Author:
Yuri Dario
Message:

clamav: update trunk to 0.97.

Location:
clamav/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • clamav/trunk

  • TabularUnified clamav/trunk/libclamav/c++/llvm/lib/CodeGen/ProcessImplicitDefs.cpp

    r189 r319  
    2727
    2828char ProcessImplicitDefs::ID = 0;
    29 static RegisterPass<ProcessImplicitDefs> X("processimpdefs",
    30                                            "Process Implicit Definitions.");
     29INITIALIZE_PASS(ProcessImplicitDefs, "processimpdefs",
     30                "Process Implicit Definitions.", false, false);
    3131
    3232void ProcessImplicitDefs::getAnalysisUsage(AnalysisUsage &AU) const {
     
    4242}
    4343
    44 bool ProcessImplicitDefs::CanTurnIntoImplicitDef(MachineInstr *MI,
    45                                                  unsigned Reg, unsigned OpIdx,
    46                                                  const TargetInstrInfo *tii_) {
    47   unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
    48   if (tii_->isMoveInstr(*MI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
    49       Reg == SrcReg)
    50     return true;
    51 
    52   if (OpIdx == 2 && MI->isSubregToReg())
    53     return true;
    54   if (OpIdx == 1 && MI->isExtractSubreg())
    55     return true;
     44bool
     45ProcessImplicitDefs::CanTurnIntoImplicitDef(MachineInstr *MI,
     46                                            unsigned Reg, unsigned OpIdx,
     47                                            const TargetInstrInfo *tii_,
     48                                            SmallSet<unsigned, 8> &ImpDefRegs) {
     49  switch(OpIdx) {
     50  case 1:
     51    return MI->isCopy() && (MI->getOperand(0).getSubReg() == 0 ||
     52                            ImpDefRegs.count(MI->getOperand(0).getReg()));
     53  case 2:
     54    return MI->isSubregToReg() && (MI->getOperand(0).getSubReg() == 0 ||
     55                                  ImpDefRegs.count(MI->getOperand(0).getReg()));
     56  default: return false;
     57  }
     58}
     59
     60static bool isUndefCopy(MachineInstr *MI, unsigned Reg,
     61                        const TargetInstrInfo *tii_,
     62                        SmallSet<unsigned, 8> &ImpDefRegs) {
     63  if (MI->isCopy()) {
     64    MachineOperand &MO0 = MI->getOperand(0);
     65    MachineOperand &MO1 = MI->getOperand(1);
     66    if (MO1.getReg() != Reg)
     67      return false;
     68    if (!MO0.getSubReg() || ImpDefRegs.count(MO0.getReg()))
     69      return true;
     70    return false;
     71  }
    5672  return false;
    5773}
     
    90106      ++I;
    91107      if (MI->isImplicitDef()) {
     108        if (MI->getOperand(0).getSubReg())
     109          continue;
    92110        unsigned Reg = MI->getOperand(0).getReg();
    93111        ImpDefRegs.insert(Reg);
     
    100118      }
    101119
    102       if (MI->isInsertSubreg()) {
    103         MachineOperand &MO = MI->getOperand(2);
    104         if (ImpDefRegs.count(MO.getReg())) {
    105           // %reg1032<def> = INSERT_SUBREG %reg1032, undef, 2
    106           // This is an identity copy, eliminate it now.
     120      // Eliminate %reg1032:sub<def> = COPY undef.
     121      if (MI->isCopy() && MI->getOperand(0).getSubReg()) {
     122        MachineOperand &MO = MI->getOperand(1);
     123        if (MO.isUndef() || ImpDefRegs.count(MO.getReg())) {
    107124          if (MO.isKill()) {
    108125            LiveVariables::VarInfo& vi = lv_->getVarInfo(MO.getReg());
     
    118135      for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
    119136        MachineOperand& MO = MI->getOperand(i);
    120         if (!MO.isReg() || !MO.isUse() || MO.isUndef())
     137        if (!MO.isReg() || (MO.isDef() && !MO.getSubReg()) || MO.isUndef())
    121138          continue;
    122139        unsigned Reg = MO.getReg();
     
    126143          continue;
    127144        // Use is a copy, just turn it into an implicit_def.
    128         if (CanTurnIntoImplicitDef(MI, Reg, i, tii_)) {
     145        if (CanTurnIntoImplicitDef(MI, Reg, i, tii_, ImpDefRegs)) {
    129146          bool isKill = MO.isKill();
    130147          MI->setDesc(tii_->get(TargetOpcode::IMPLICIT_DEF));
     
    143160        Changed = true;
    144161        MO.setIsUndef();
     162        // This is a partial register redef of an implicit def.
     163        // Make sure the whole register is defined by the instruction.
     164        if (MO.isDef()) {
     165          MI->addRegisterDefined(Reg);
     166          continue;
     167        }
    145168        if (MO.isKill() || MI->isRegTiedToDefOperand(i)) {
    146169          // Make sure other uses of
     
    217240
    218241        // Turn a copy use into an implicit_def.
    219         unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
    220         if (tii_->isMoveInstr(*RMI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
    221             Reg == SrcReg) {
     242        if (isUndefCopy(RMI, Reg, tii_, ImpDefRegs)) {
    222243          RMI->setDesc(tii_->get(TargetOpcode::IMPLICIT_DEF));
    223244
Note: See TracChangeset for help on using the changeset viewer.