PeepholeOptimizer.cpp revision a65568676d0d9d53dd4aae8f1c58271bb4cfff10
16cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling//===-- PeepholeOptimizer.cpp - Peephole Optimizations --------------------===// 27da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// 37da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// The LLVM Compiler Infrastructure 47da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// 57da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// This file is distributed under the University of Illinois Open Source 67da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// License. See LICENSE.TXT for details. 77da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng// 87da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng//===----------------------------------------------------------------------===// 9d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng// 106cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// Perform peephole optimizations on the machine code: 11d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng// 126cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// - Optimize Extensions 13d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng// 146cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// Optimization of sign / zero extension instructions. It may be extended to 156cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// handle other instructions with similar properties. 166cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 176cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// On some targets, some instructions, e.g. X86 sign / zero extension, may 186cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// leave the source value in the lower part of the result. This optimization 196cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// will replace some uses of the pre-extension value with uses of the 206cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// sub-register of the results. 216cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 226cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// - Optimize Comparisons 236cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 246cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// Optimization of comparison instructions. For instance, in this code: 256cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 266cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// sub r1, 1 276cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// cmp r1, 0 286cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// bz L1 296cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 306cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// If the "sub" instruction all ready sets (or could be modified to set) the 316cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// same flag that the "cmp" instruction sets and that "bz" uses, then we can 326cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// eliminate the "cmp" instruction. 336cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// 34d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng//===----------------------------------------------------------------------===// 357da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 366cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling#define DEBUG_TYPE "peephole-opt" 377da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/CodeGen/Passes.h" 387da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/CodeGen/MachineDominators.h" 397da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/CodeGen/MachineInstrBuilder.h" 407da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/CodeGen/MachineRegisterInfo.h" 417da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/Target/TargetInstrInfo.h" 427da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/Target/TargetRegisterInfo.h" 437da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/Support/CommandLine.h" 447da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/ADT/SmallPtrSet.h" 457da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng#include "llvm/ADT/Statistic.h" 467da9ecf9677b751d81515f95168ae3cb2df54160Evan Chengusing namespace llvm; 477da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 486cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling// Optimize Extensions 496cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendlingstatic cl::opt<bool> 506cdb1abe4e4f6364649e7ef656589441754e82aeBill WendlingAggressive("aggressive-ext-opt", cl::Hidden, 516cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling cl::desc("Aggressive extension optimization")); 527da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 5369c5eb59f592087af89b971bea072f070f2a5cfaBill WendlingSTATISTIC(NumReuse, "Number of extension results reused"); 546cdb1abe4e4f6364649e7ef656589441754e82aeBill WendlingSTATISTIC(NumEliminated, "Number of compares eliminated"); 556cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 567da9ecf9677b751d81515f95168ae3cb2df54160Evan Chengnamespace { 576cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling class PeepholeOptimizer : public MachineFunctionPass { 587da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng const TargetMachine *TM; 597da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng const TargetInstrInfo *TII; 606cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling MachineRegisterInfo *MRI; 616cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling MachineDominatorTree *DT; // Machine dominator tree 627da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 637da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng public: 647da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng static char ID; // Pass identification 656cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling PeepholeOptimizer() : MachineFunctionPass(ID) {} 667da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 677da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng virtual bool runOnMachineFunction(MachineFunction &MF); 687da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 697da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng virtual void getAnalysisUsage(AnalysisUsage &AU) const { 707da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng AU.setPreservesCFG(); 717da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng MachineFunctionPass::getAnalysisUsage(AU); 72d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng if (Aggressive) { 73d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng AU.addRequired<MachineDominatorTree>(); 74d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng AU.addPreserved<MachineDominatorTree>(); 75d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng } 767da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng } 77d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 78d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng private: 79220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling bool OptimizeCmpInstr(MachineInstr *MI, MachineBasicBlock *MBB, 80220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling MachineBasicBlock::iterator &MII); 816cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling bool OptimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB, 826cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling SmallPtrSet<MachineInstr*, 8> &LocalMIs); 837da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng }; 847da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng} 857da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 866cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendlingchar PeepholeOptimizer::ID = 0; 876cdb1abe4e4f6364649e7ef656589441754e82aeBill WendlingINITIALIZE_PASS(PeepholeOptimizer, "peephole-opts", 886cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling "Peephole Optimizations", false, false); 896cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 906cdb1abe4e4f6364649e7ef656589441754e82aeBill WendlingFunctionPass *llvm::createPeepholeOptimizerPass() { 916cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling return new PeepholeOptimizer(); 926cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling} 936cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 946cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// OptimizeExtInstr - If instruction is a copy-like instruction, i.e. it reads 956cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// a single register and writes a single register and it does not modify the 966cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// source, and if the source value is preserved as a sub-register of the 976cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// result, then replace all reachable uses of the source with the subreg of the 986cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// result. 996cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// 1006cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// Do not generate an EXTRACT that is used only in a debug use, as this changes 1016cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// the code. Since this code does not currently share EXTRACTs, just ignore all 1026cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// debug uses. 1036cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendlingbool PeepholeOptimizer:: 1046cdb1abe4e4f6364649e7ef656589441754e82aeBill WendlingOptimizeExtInstr(MachineInstr *MI, MachineBasicBlock *MBB, 1056cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling SmallPtrSet<MachineInstr*, 8> &LocalMIs) { 106d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng LocalMIs.insert(MI); 107d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 108d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng unsigned SrcReg, DstReg, SubIdx; 10994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (!TII->isCoalescableExtInstr(*MI, SrcReg, DstReg, SubIdx)) 11094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling return false; 11194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 11294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (TargetRegisterInfo::isPhysicalRegister(DstReg) || 11394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling TargetRegisterInfo::isPhysicalRegister(SrcReg)) 11494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling return false; 11594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 11694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineRegisterInfo::use_nodbg_iterator UI = MRI->use_nodbg_begin(SrcReg); 11794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (++UI == MRI->use_nodbg_end()) 11894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // No other uses. 11994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling return false; 12094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 1216cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // The source has other uses. See if we can replace the other uses with use of 1226cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // the result of the extension. 12394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling SmallPtrSet<MachineBasicBlock*, 4> ReachedBBs; 12494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UI = MRI->use_nodbg_begin(DstReg); 12594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end(); 12694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UI != UE; ++UI) 12794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling ReachedBBs.insert(UI->getParent()); 12894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 12994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Uses that are in the same BB of uses of the result of the instruction. 13094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling SmallVector<MachineOperand*, 8> Uses; 1316cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 13294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Uses that the result of the instruction can reach. 13394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling SmallVector<MachineOperand*, 8> ExtendedUses; 13494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 1356cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling bool ExtendLife = true; 13694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UI = MRI->use_nodbg_begin(SrcReg); 13794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling for (MachineRegisterInfo::use_nodbg_iterator UE = MRI->use_nodbg_end(); 13894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UI != UE; ++UI) { 13994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineOperand &UseMO = UI.getOperand(); 14094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineInstr *UseMI = &*UI; 14194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (UseMI == MI) 14294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling continue; 1436cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 14494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (UseMI->isPHI()) { 14594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling ExtendLife = false; 14694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling continue; 14794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling } 148d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 14994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // It's an error to translate this: 15094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // 15194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // %reg1025 = <sext> %reg1024 15294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // ... 15394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // %reg1026 = SUBREG_TO_REG 0, %reg1024, 4 15494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // 15594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // into this: 15694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // 15794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // %reg1025 = <sext> %reg1024 15894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // ... 15994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // %reg1027 = COPY %reg1025:4 16094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // %reg1026 = SUBREG_TO_REG 0, %reg1027, 4 16194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // 16294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // The problem here is that SUBREG_TO_REG is there to assert that an 16394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // implicit zext occurs. It doesn't insert a zext instruction. If we allow 16494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // the COPY here, it will give us the value after the <sext>, not the 16594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // original value of %reg1024 before <sext>. 16694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (UseMI->getOpcode() == TargetOpcode::SUBREG_TO_REG) 16794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling continue; 16894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling 16994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineBasicBlock *UseMBB = UseMI->getParent(); 17094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (UseMBB == MBB) { 17194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Local uses that come after the extension. 17294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (!LocalMIs.count(UseMI)) 17394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling Uses.push_back(&UseMO); 1746cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } else if (ReachedBBs.count(UseMBB)) { 1756cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // Non-local uses where the result of the extension is used. Always 1766cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // replace these unless it's a PHI. 17794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling Uses.push_back(&UseMO); 1786cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } else if (Aggressive && DT->dominates(MBB, UseMBB)) { 1796cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // We may want to extend the live range of the extension result in order 1806cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // to replace these uses. 18194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling ExtendedUses.push_back(&UseMO); 1826cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } else { 18394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Both will be live out of the def MBB anyway. Don't extend live range of 18494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // the extension result. 18594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling ExtendLife = false; 18694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling break; 18794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling } 18894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling } 189d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 19094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (ExtendLife && !ExtendedUses.empty()) 1916cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // Extend the liveness of the extension result. 19294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling std::copy(ExtendedUses.begin(), ExtendedUses.end(), 19394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling std::back_inserter(Uses)); 194eb18812f755b634f3e7554c1912aeb2d7476cb53Evan Cheng 19594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Now replace all uses. 19694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling bool Changed = false; 19794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (!Uses.empty()) { 19894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling SmallPtrSet<MachineBasicBlock*, 4> PHIBBs; 1996cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 20094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // Look for PHI uses of the extended result, we don't want to extend the 20194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // liveness of a PHI input. It breaks all kinds of assumptions down 20294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling // stream. A PHI use is expected to be the kill of its source values. 20394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UI = MRI->use_nodbg_begin(DstReg); 2046cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling for (MachineRegisterInfo::use_nodbg_iterator 2056cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling UE = MRI->use_nodbg_end(); UI != UE; ++UI) 20694e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (UI->isPHI()) 20794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling PHIBBs.insert(UI->getParent()); 208d64ba3ee62cc854218d9b76b9420493d82313d06Bill Wendling 20994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling const TargetRegisterClass *RC = MRI->getRegClass(SrcReg); 21094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling for (unsigned i = 0, e = Uses.size(); i != e; ++i) { 21194e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineOperand *UseMO = Uses[i]; 21294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling MachineInstr *UseMI = UseMO->getParent(); 213d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng MachineBasicBlock *UseMBB = UseMI->getParent(); 21494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling if (PHIBBs.count(UseMBB)) 21594e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling continue; 2166cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 21794e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling unsigned NewVR = MRI->createVirtualRegister(RC); 21894e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling BuildMI(*UseMBB, UseMI, UseMI->getDebugLoc(), 21994e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling TII->get(TargetOpcode::COPY), NewVR) 22094e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling .addReg(DstReg, 0, SubIdx); 2216cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 22294e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling UseMO->setReg(NewVR); 22394e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling ++NumReuse; 22494e4008fbaa85600777b55605098bfd9cc3b9294Bill Wendling Changed = true; 225d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng } 226d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng } 227d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 228d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng return Changed; 229d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng} 230d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng 2316cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// OptimizeCmpInstr - If the instruction is a compare and the previous 2326cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// instruction it's comparing against all ready sets (or could be modified to 2336cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// set) the same flag as the compare, then we can remove the comparison and use 2346cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling/// the flag from the previous instruction. 2356cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendlingbool PeepholeOptimizer::OptimizeCmpInstr(MachineInstr *MI, 236220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling MachineBasicBlock *MBB, 237220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling MachineBasicBlock::iterator &NextIter){ 2386cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // If this instruction is a comparison against zero and isn't comparing a 2396cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling // physical register, we can try to optimize it. 2406cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling unsigned SrcReg; 2416cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling int CmpValue; 2426cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling if (!TII->AnalyzeCompare(MI, SrcReg, CmpValue) || 24392ad57f066e9f256e4e3d72febf152e68caa80c7Bill Wendling TargetRegisterInfo::isPhysicalRegister(SrcReg)) 2446cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling return false; 2456cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 246a65568676d0d9d53dd4aae8f1c58271bb4cfff10Bill Wendling // Attempt to optimize the comparison instruction. 247a65568676d0d9d53dd4aae8f1c58271bb4cfff10Bill Wendling if (TII->OptimizeCompareInstr(MI, SrcReg, CmpValue, NextIter)) { 2486cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling ++NumEliminated; 2496cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling return true; 2506cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } 2516cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 2526cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling return false; 2536cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling} 2546cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 2556cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendlingbool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) { 2566cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling TM = &MF.getTarget(); 2577da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng TII = TM->getInstrInfo(); 2587da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng MRI = &MF.getRegInfo(); 2596cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling DT = Aggressive ? &getAnalysis<MachineDominatorTree>() : 0; 2607da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 2617da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng bool Changed = false; 2627da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 2637da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng SmallPtrSet<MachineInstr*, 8> LocalMIs; 2647da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) { 2657da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng MachineBasicBlock *MBB = &*I; 266d89d5180d12107a2cdffa179c213370db2e088d5Evan Cheng LocalMIs.clear(); 2676cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 2686cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling for (MachineBasicBlock::iterator 269220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling MII = I->begin(), MIE = I->end(); MII != MIE; ) { 2707da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng MachineInstr *MI = &*MII; 2716cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling 2726cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling if (MI->getDesc().isCompare()) { 273220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling if (OptimizeCmpInstr(MI, MBB, MII)) 274220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling Changed = true; 275220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling else 276220e240bdf3235252c2a1fc8fcc5d4b8e8117918Bill Wendling ++MII; 2776cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } else { 2786cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling Changed |= OptimizeExtInstr(MI, MBB, LocalMIs); 2796cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling ++MII; 2806cdb1abe4e4f6364649e7ef656589441754e82aeBill Wendling } 2817da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng } 2827da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng } 2837da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng 2847da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng return Changed; 2857da9ecf9677b751d81515f95168ae3cb2df54160Evan Cheng} 286