[llvm-commits] [llvm] r119382 - in /llvm/trunk: include/llvm/CodeGen/Passes.h include/llvm/InitializePasses.h lib/CodeGen/ExpandPseudos.cpp lib/CodeGen/LLVMTargetMachine.cpp lib/CodeGen/SelectionDAG/InstrEmitter.cpp

Jim Grosbach grosbach at apple.com
Tue Nov 16 13:14:29 PST 2010


Hi Dan,

Naming implies redundancy with the ARMExpandPseudos pass for the ARM target. IIRC (vague memories here, so....), these may happen earlier? Would it be reasonable to try to merge those passes?

One nitty comment below.

-Jim


On Nov 16, 2010, at 1:02 PM, Dan Gohman wrote:

> Author: djg
> Date: Tue Nov 16 15:02:37 2010
> New Revision: 119382
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=119382&view=rev
> Log:
> Split pseudo-instruction expansion into a separate pass, to make it
> easier to debug, and to avoid complications when the CFG changes
> in the middle of the instruction selection process.
> 
> Added:
>    llvm/trunk/lib/CodeGen/ExpandPseudos.cpp
> Modified:
>    llvm/trunk/include/llvm/CodeGen/Passes.h
>    llvm/trunk/include/llvm/InitializePasses.h
>    llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
>    llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> 
> Modified: llvm/trunk/include/llvm/CodeGen/Passes.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/Passes.h?rev=119382&r1=119381&r2=119382&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/CodeGen/Passes.h (original)
> +++ llvm/trunk/include/llvm/CodeGen/Passes.h Tue Nov 16 15:02:37 2010
> @@ -213,6 +213,10 @@
>   /// addressing.
>   FunctionPass *createLocalStackSlotAllocationPass();
> 
> +  /// createExpandPseudosPass - This pass expands pseudo-instructions.
> +  ///
> +  FunctionPass *createExpandPseudosPass();
> +
> } // End llvm namespace
> 
> #endif
> 
> Modified: llvm/trunk/include/llvm/InitializePasses.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/InitializePasses.h?rev=119382&r1=119381&r2=119382&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/InitializePasses.h (original)
> +++ llvm/trunk/include/llvm/InitializePasses.h Tue Nov 16 15:02:37 2010
> @@ -92,6 +92,7 @@
> void initializeDominanceFrontierPass(PassRegistry&);
> void initializeDominatorTreePass(PassRegistry&);
> void initializeEdgeProfilerPass(PassRegistry&);
> +void initializeExpandPseudosPass(PassRegistry&);
> void initializeFindUsedTypesPass(PassRegistry&);
> void initializeFunctionAttrsPass(PassRegistry&);
> void initializeGCModuleInfoPass(PassRegistry&);
> 
> Added: llvm/trunk/lib/CodeGen/ExpandPseudos.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/ExpandPseudos.cpp?rev=119382&view=auto
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/ExpandPseudos.cpp (added)
> +++ llvm/trunk/lib/CodeGen/ExpandPseudos.cpp Tue Nov 16 15:02:37 2010
> @@ -0,0 +1,84 @@
> +//===-- llvm/CodeGen/ExpandPseudos.cpp --------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// Expand Psuedo-instructions produced by ISel. These is usually to allow
> +// the expansion to contain control flow, such as a conditional move

Grammar. "These are".

> +// implemented with a conditional branch and a phi, or an atomic operation
> +// implemented with a loop.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#define DEBUG_TYPE "expand-pseudos"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/CodeGen/Passes.h"
> +#include "llvm/Target/TargetLowering.h"
> +#include "llvm/Target/TargetMachine.h"
> +#include "llvm/Support/Debug.h"
> +using namespace llvm;
> +
> +namespace {
> +  class ExpandPseudos : public MachineFunctionPass {
> +  public:
> +    static char ID; // Pass identification, replacement for typeid
> +    ExpandPseudos() : MachineFunctionPass(ID) {}
> +
> +  private:
> +    virtual bool runOnMachineFunction(MachineFunction &MF);
> +
> +    const char *getPassName() const {
> +      return "Expand CodeGen Pseudo-instructions";
> +    }
> +
> +    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
> +      MachineFunctionPass::getAnalysisUsage(AU);
> +    }
> +  };
> +} // end anonymous namespace
> +
> +char ExpandPseudos::ID = 0;
> +INITIALIZE_PASS_BEGIN(ExpandPseudos, "expand-pseudos",
> +                "Expand CodeGen Psueod-instructions", false, false)
> +INITIALIZE_PASS_END(ExpandPseudos, "expand-pseudos",
> +                "Expand CodeGen Psueod-instructions", false, false)
> +
> +FunctionPass *llvm::createExpandPseudosPass() {
> +  return new ExpandPseudos();
> +}
> +
> +bool ExpandPseudos::runOnMachineFunction(MachineFunction &MF) {
> +  bool Changed = false;
> +  const TargetLowering *TLI = MF.getTarget().getTargetLowering();
> +
> +  // Iterate through each instruction in the function, looking for pseudos.
> +  for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
> +    MachineBasicBlock *MBB = I;
> +    for (MachineBasicBlock::iterator MBBI = MBB->begin(), MBBE = MBB->end();
> +         MBBI != MBBE; ) {
> +      MachineInstr *MI = MBBI++;
> +
> +      // If MI is a pseudo, expand it.
> +      const TargetInstrDesc &TID = MI->getDesc();
> +      if (TID.usesCustomInsertionHook()) {
> +        Changed = true;
> +        MachineBasicBlock *NewMBB =
> +          TLI->EmitInstrWithCustomInserter(MI, MBB);
> +        // The expansion may involve new basic blocks.
> +        if (NewMBB != MBB) {
> +          MBB = NewMBB;
> +          I = NewMBB;
> +          MBBI = NewMBB->begin();
> +          MBBE = NewMBB->end();
> +        }
> +      }
> +    }
> +  }
> +
> +  return Changed;
> +}
> 
> Modified: llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp?rev=119382&r1=119381&r2=119382&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp (original)
> +++ llvm/trunk/lib/CodeGen/LLVMTargetMachine.cpp Tue Nov 16 15:02:37 2010
> @@ -345,6 +345,9 @@
>   // Print the instruction selected machine code...
>   printAndVerify(PM, "After Instruction Selection");
> 
> +  // Expand pseudo-instructions emitted by isel.
> +  PM.add(createExpandPseudosPass());
> +
>   // Optimize PHIs before DCE: removing dead PHI cycles may make more
>   // instructions dead.
>   if (OptLevel != CodeGenOpt::None)
> 
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp?rev=119382&r1=119381&r2=119382&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp Tue Nov 16 15:02:37 2010
> @@ -721,19 +721,6 @@
>   // hook knows where in the block to insert the replacement code.
>   MBB->insert(InsertPos, MI);
> 
> -  if (II.usesCustomInsertionHook()) {
> -    // Insert this instruction into the basic block using a target
> -    // specific inserter which may returns a new basic block.
> -    bool AtEnd = InsertPos == MBB->end();
> -    MachineBasicBlock *NewMBB = TLI->EmitInstrWithCustomInserter(MI, MBB);
> -    if (NewMBB != MBB) {
> -      if (AtEnd)
> -        InsertPos = NewMBB->end();
> -      MBB = NewMBB;
> -    }
> -    return;
> -  }
> -  
>   // Additional results must be an physical register def.
>   if (HasPhysRegOuts) {
>     for (unsigned i = II.getNumDefs(); i < NumResults; ++i) {
> 
> 
> _______________________________________________
> 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