From 381cb07544a2bc119e39969d7d508a6247773e1c Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 8 Aug 2008 07:27:28 +0000 Subject: [PATCH] Add skeleton of simple basic block instruction selector. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54522 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 10 +++-- lib/CodeGen/SelectionDAG/SimpleBBISel.cpp | 29 ++++++++++++ lib/CodeGen/SelectionDAG/SimpleBBISel.h | 45 +++++++++++++++++++ 3 files changed, 81 insertions(+), 3 deletions(-) create mode 100644 lib/CodeGen/SelectionDAG/SimpleBBISel.cpp create mode 100644 lib/CodeGen/SelectionDAG/SimpleBBISel.h diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index ac30ff63b70..d1c49d00eed 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -12,10 +12,10 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "isel" +#include "llvm/CodeGen/SelectionDAGISel.h" +#include "SimpleBBISel.h" #include "llvm/ADT/BitVector.h" #include "llvm/Analysis/AliasAnalysis.h" -#include "llvm/CodeGen/SelectionDAGISel.h" -#include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/Constants.h" #include "llvm/CallingConv.h" #include "llvm/DerivedTypes.h" @@ -33,6 +33,7 @@ #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/Target/TargetRegisterInfo.h" @@ -5441,11 +5442,14 @@ void SelectionDAGISel::SelectAllBasicBlocks(Function &Fn, MachineFunction &MF, // each basic block. NodeAllocatorType NodeAllocator; + SimpleBBISel SISel(MF, TLI); std::vector > PHINodesToUpdate; for (Function::iterator I = Fn.begin(), E = Fn.end(); I != E; ++I) { BasicBlock *LLVMBB = &*I; PHINodesToUpdate.clear(); - SelectBasicBlock(LLVMBB, MF, FuncInfo, PHINodesToUpdate, NodeAllocator); + + if (!FastISel || !SISel.SelectBasicBlock(LLVMBB, FuncInfo.MBBMap[LLVMBB])) + SelectBasicBlock(LLVMBB, MF, FuncInfo, PHINodesToUpdate, NodeAllocator); FinishBasicBlock(LLVMBB, MF, FuncInfo, PHINodesToUpdate, NodeAllocator); } } diff --git a/lib/CodeGen/SelectionDAG/SimpleBBISel.cpp b/lib/CodeGen/SelectionDAG/SimpleBBISel.cpp new file mode 100644 index 00000000000..1200cd3b0d5 --- /dev/null +++ b/lib/CodeGen/SelectionDAG/SimpleBBISel.cpp @@ -0,0 +1,29 @@ +//===-- SimpleBBISel.cpp - Implement the SimpleBBISel class ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This implements simple basic block instruction selection. If the given +// BasicBlock is considered "simple", i.e. all operations are supported by +// the target and their types are legal, it does instruction directly from +// LLVM BasicBlock to MachineInstr's. +// +//===----------------------------------------------------------------------===// + +#define DEBUG_TYPE "simple-isel" +#include "SimpleBBISel.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/SelectionDAG.h" +using namespace llvm; + +/// SelectBasicBlock - Try to convert a LLVM basic block into a +/// MachineBasicBlock using simple instruction selection. Returns false if it +/// is not able to do so. +bool SimpleBBISel::SelectBasicBlock(BasicBlock *BB, MachineBasicBlock *MBB) { + return false; +} diff --git a/lib/CodeGen/SelectionDAG/SimpleBBISel.h b/lib/CodeGen/SelectionDAG/SimpleBBISel.h new file mode 100644 index 00000000000..f5a8be588f0 --- /dev/null +++ b/lib/CodeGen/SelectionDAG/SimpleBBISel.h @@ -0,0 +1,45 @@ +//===-- SimpleBBISel.cpp - Definition of the SimpleBBISel class -----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the SimpleBBISel class which handles simple basic block +// instruction selection. If the given BasicBlock is considered "simple", i.e. +// all operations are supported by the target and their types are legal, it +// does instruction directly from LLVM BasicBlock to MachineInstr's. +// +//===----------------------------------------------------------------------===// + +#ifndef SELECTIONDAG_SIMPLEBBISEL_H +#define SELECTIONDAG_SIMPLEBBISEL_H + +#include "llvm/Support/Compiler.h" + +namespace llvm { + +class BasicBlock; +class MachineBasicBlock; +class MachineFunction; +class TargetLowering; + +class VISIBILITY_HIDDEN SimpleBBISel { + MachineFunction &MF; + TargetLowering &TLI; + + public: + explicit SimpleBBISel(MachineFunction &mf, TargetLowering &tli) + : MF(mf), TLI(tli) {}; + + /// SelectBasicBlock - Try to convert a LLVM basic block into a + /// MachineBasicBlock using simple instruction selection. Returns false if it + /// is not able to do so. + bool SelectBasicBlock(BasicBlock *BB, MachineBasicBlock *MBB); +}; + +} // end namespace llvm. + +#endif -- 2.34.1