- Timestamp:
- Apr 19, 2011, 11:12:07 PM (14 years ago)
- Location:
- clamav/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
clamav/trunk ¶
-
Property svn:mergeinfo
set to
/clamav/vendor/0.97 merged eligible
-
Property svn:mergeinfo
set to
-
TabularUnified clamav/trunk/libclamav/c++/llvm/lib/CodeGen/ProcessImplicitDefs.cpp ¶
r189 r319 27 27 28 28 char ProcessImplicitDefs::ID = 0; 29 static RegisterPass<ProcessImplicitDefs> X("processimpdefs",30 "Process Implicit Definitions.");29 INITIALIZE_PASS(ProcessImplicitDefs, "processimpdefs", 30 "Process Implicit Definitions.", false, false); 31 31 32 32 void ProcessImplicitDefs::getAnalysisUsage(AnalysisUsage &AU) const { … … 42 42 } 43 43 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; 44 bool 45 ProcessImplicitDefs::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 60 static 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 } 56 72 return false; 57 73 } … … 90 106 ++I; 91 107 if (MI->isImplicitDef()) { 108 if (MI->getOperand(0).getSubReg()) 109 continue; 92 110 unsigned Reg = MI->getOperand(0).getReg(); 93 111 ImpDefRegs.insert(Reg); … … 100 118 } 101 119 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())) { 107 124 if (MO.isKill()) { 108 125 LiveVariables::VarInfo& vi = lv_->getVarInfo(MO.getReg()); … … 118 135 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 119 136 MachineOperand& MO = MI->getOperand(i); 120 if (!MO.isReg() || !MO.isUse() || MO.isUndef())137 if (!MO.isReg() || (MO.isDef() && !MO.getSubReg()) || MO.isUndef()) 121 138 continue; 122 139 unsigned Reg = MO.getReg(); … … 126 143 continue; 127 144 // 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)) { 129 146 bool isKill = MO.isKill(); 130 147 MI->setDesc(tii_->get(TargetOpcode::IMPLICIT_DEF)); … … 143 160 Changed = true; 144 161 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 } 145 168 if (MO.isKill() || MI->isRegTiedToDefOperand(i)) { 146 169 // Make sure other uses of … … 217 240 218 241 // 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)) { 222 243 RMI->setDesc(tii_->get(TargetOpcode::IMPLICIT_DEF)); 223 244
Note:
See TracChangeset
for help on using the changeset viewer.