[llvm-commits] [llvm] r97543 - in /llvm/trunk: include/llvm/CodeGen/Passes.h lib/CodeGen/MachineCSE.cpp

Chris Lattner clattner at apple.com
Tue Mar 2 12:50:09 PST 2010


On Mar 1, 2010, at 6:38 PM, Evan Cheng wrote:

> Author: evancheng
> Date: Mon Mar  1 20:38:24 2010
> New Revision: 97543
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=97543&view=rev
> Log:
> Add skeleton of a machine level cse pass.

Looks like a good start, but please move the main logic of the hash function to be a method on MachineInstr.  It could be useful for other passes someday.

-Chris

> 
> Added:
>    llvm/trunk/lib/CodeGen/MachineCSE.cpp
> Modified:
>    llvm/trunk/include/llvm/CodeGen/Passes.h
> 
> Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=97543&r1=97542&r2=97543&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/Passes.h Mon Mar  1 20:38:24 2010
> @@ -162,6 +162,10 @@
>   /// 
>   FunctionPass *createGCInfoPrinter(raw_ostream &OS);
> 
> +  /// createMachineCSEPass - This pass performs global CSE on machine
> +  /// instructions.
> +  FunctionPass *createMachineCSEPass();
> +
>   /// createMachineLICMPass - This pass performs LICM on machine instructions.
>   /// 
>   FunctionPass *createMachineLICMPass();
> 
> Added: llvm/trunk/lib/CodeGen/MachineCSE.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineCSE.cpp?rev=97543&view=auto
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/MachineCSE.cpp (added)
> +++ llvm/trunk/lib/CodeGen/MachineCSE.cpp Mon Mar  1 20:38:24 2010
> @@ -0,0 +1,124 @@
> +//===-- MachineCSE.cpp - Machine Common Subexpression Elimination Pass ----===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This pass performs global common subexpression elimination on machine
> +// instructions using a scoped hash table based value numbering schemem. IT
> +// must be run while the machine function is still in SSA form.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#define DEBUG_TYPE "machine-cse"
> +#include "llvm/CodeGen/Passes.h"
> +#include "llvm/CodeGen/MachineDominators.h"
> +#include "llvm/CodeGen/MachineInstr.h"
> +#include "llvm/ADT/ScopedHashTable.h"
> +#include "llvm/ADT/Statistic.h"
> +#include "llvm/Support/Debug.h"
> +
> +using namespace llvm;
> +
> +namespace llvm {
> +  template<> struct DenseMapInfo<MachineInstr*> {
> +    static inline MachineInstr *getEmptyKey() {
> +      return 0;
> +    }
> +
> +    static inline MachineInstr *getTombstoneKey() {
> +      return reinterpret_cast<MachineInstr*>(-1);
> +    }
> +
> +    static unsigned getHashValue(const MachineInstr* const &MI) {
> +      unsigned Hash = MI->getOpcode() * 37;
> +      for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
> +        const MachineOperand &MO = MI->getOperand(i);
> +        uint64_t Key = (uint64_t)MO.getType() << 32;
> +        switch (MO.getType()) {
> +        default: break;
> +        case MachineOperand::MO_Register:
> +          Key |= MO.getReg();
> +          break;
> +        case MachineOperand::MO_Immediate:
> +          Key |= MO.getImm();
> +          break;
> +        case MachineOperand::MO_FrameIndex:
> +        case MachineOperand::MO_ConstantPoolIndex:
> +        case MachineOperand::MO_JumpTableIndex:
> +          Key |= MO.getIndex();
> +          break;
> +        case MachineOperand::MO_MachineBasicBlock:
> +          Key |= DenseMapInfo<void*>::getHashValue(MO.getMBB());
> +          break;
> +        case MachineOperand::MO_GlobalAddress:
> +          Key |= DenseMapInfo<void*>::getHashValue(MO.getGlobal());
> +          break;
> +        case MachineOperand::MO_BlockAddress:
> +          Key |= DenseMapInfo<void*>::getHashValue(MO.getBlockAddress());
> +          break;
> +        }
> +        Key += ~(Key << 32);
> +        Key ^= (Key >> 22);
> +        Key += ~(Key << 13);
> +        Key ^= (Key >> 8);
> +        Key += (Key << 3);
> +        Key ^= (Key >> 15);
> +        Key += ~(Key << 27);
> +        Key ^= (Key >> 31);
> +        Hash = (unsigned)Key + Hash * 37;
> +      }
> +      return Hash;
> +    }
> +
> +    static bool isEqual(const MachineInstr* const &LHS,
> +                        const MachineInstr* const &RHS) {
> +      return LHS->isIdenticalTo(RHS);
> +    }
> +  };
> +} // end llvm namespace
> +
> +namespace {
> +  class MachineCSE : public MachineFunctionPass {
> +    ScopedHashTable<MachineInstr*, unsigned> VNT;
> +    MachineDominatorTree *DT;
> +  public:
> +    static char ID; // Pass identification
> +    MachineCSE() : MachineFunctionPass(&ID) {}
> +
> +    virtual bool runOnMachineFunction(MachineFunction &MF);
> +    
> +    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> +      AU.setPreservesCFG();
> +      MachineFunctionPass::getAnalysisUsage(AU);
> +      AU.addRequired<MachineDominatorTree>();
> +      AU.addPreserved<MachineDominatorTree>();
> +    }
> +
> +  private:
> +    bool ProcessBlock(MachineDomTreeNode *Node);
> +  };
> +} // end anonymous namespace
> +
> +char MachineCSE::ID = 0;
> +static RegisterPass<MachineCSE>
> +X("machine-cse", "Machine Common Subexpression Elimination");
> +
> +FunctionPass *llvm::createMachineCSEPass() { return new MachineCSE(); }
> +
> +bool MachineCSE::ProcessBlock(MachineDomTreeNode *Node) {
> +  ScopedHashTableScope<MachineInstr*, unsigned> VNTS(VNT);
> +  MachineBasicBlock *MBB = Node->getBlock();
> +  for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); I != E;
> +       ++I) {
> +  }
> +  return false;
> +}
> +
> +bool MachineCSE::runOnMachineFunction(MachineFunction &MF) {
> +  DT = &getAnalysis<MachineDominatorTree>();
> +  return ProcessBlock(DT->getRootNode());
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list