[llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Makefile SparcV8.h SparcV8TargetMachine.cpp
Chris Lattner
lattner at cs.uiuc.edu
Fri Dec 16 23:47:12 PST 2005
Changes in directory llvm/lib/Target/SparcV8:
SparcV8ISelDAGToDAG.cpp added (r1.1)
Makefile updated: 1.11 -> 1.12
SparcV8.h updated: 1.6 -> 1.7
SparcV8TargetMachine.cpp updated: 1.32 -> 1.33
---
Log message:
Add the framework for a dag-dag isel
---
Diffs of the changes: (+185 -2)
Makefile | 3
SparcV8.h | 2
SparcV8ISelDAGToDAG.cpp | 172 +++++++++++++++++++++++++++++++++++++++++++++++
SparcV8TargetMachine.cpp | 10 ++
4 files changed, 185 insertions(+), 2 deletions(-)
Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp
diff -c /dev/null llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.1
*** /dev/null Sat Dec 17 01:47:11 2005
--- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Sat Dec 17 01:47:01 2005
***************
*** 0 ****
--- 1,172 ----
+ //===-- SparcV8ISelDAGToDAG.cpp - A dag to dag inst selector for SparcV8 --===//
+ //
+ // The LLVM Compiler Infrastructure
+ //
+ // This file was developed by Chris Lattner and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file defines an instruction selector for the V8 target
+ //
+ //===----------------------------------------------------------------------===//
+
+ #include "SparcV8.h"
+ #include "SparcV8TargetMachine.h"
+ #include "llvm/CodeGen/SelectionDAG.h"
+ #include "llvm/CodeGen/SelectionDAGISel.h"
+ #include "llvm/Target/TargetLowering.h"
+ #include "llvm/Support/Debug.h"
+ #include <iostream>
+ using namespace llvm;
+
+ //===----------------------------------------------------------------------===//
+ // TargetLowering Implementation
+ //===----------------------------------------------------------------------===//
+
+ namespace {
+ class SparcV8TargetLowering : public TargetLowering {
+ public:
+ SparcV8TargetLowering(TargetMachine &TM);
+
+ virtual std::vector<SDOperand>
+ LowerArguments(Function &F, SelectionDAG &DAG);
+ virtual std::pair<SDOperand, SDOperand>
+ LowerCallTo(SDOperand Chain, const Type *RetTy, bool isVarArg,
+ unsigned CC,
+ bool isTailCall, SDOperand Callee, ArgListTy &Args,
+ SelectionDAG &DAG);
+
+ virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op,
+ SelectionDAG &DAG);
+ virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP,
+ Value *VAListV, SelectionDAG &DAG);
+ virtual std::pair<SDOperand,SDOperand>
+ LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV,
+ const Type *ArgTy, SelectionDAG &DAG);
+ virtual std::pair<SDOperand, SDOperand>
+ LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth,
+ SelectionDAG &DAG);
+ };
+ }
+
+ SparcV8TargetLowering::SparcV8TargetLowering(TargetMachine &TM)
+ : TargetLowering(TM) {
+
+ // Set up the register classes.
+ addRegisterClass(MVT::i32, V8::IntRegsRegisterClass);
+ addRegisterClass(MVT::f32, V8::FPRegsRegisterClass);
+ addRegisterClass(MVT::f64, V8::DFPRegsRegisterClass);
+
+ computeRegisterProperties();
+ }
+
+ std::vector<SDOperand>
+ SparcV8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ std::pair<SDOperand, SDOperand>
+ SparcV8TargetLowering::LowerCallTo(SDOperand Chain, const Type *RetTy,
+ bool isVarArg, unsigned CC,
+ bool isTailCall, SDOperand Callee,
+ ArgListTy &Args, SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ SDOperand SparcV8TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op,
+ SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ SDOperand SparcV8TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
+ Value *VAListV, SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ std::pair<SDOperand,SDOperand>
+ SparcV8TargetLowering::LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV,
+ const Type *ArgTy, SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ std::pair<SDOperand, SDOperand>
+ SparcV8TargetLowering::LowerFrameReturnAddress(bool isFrameAddr, SDOperand Chain, unsigned Depth,
+ SelectionDAG &DAG) {
+ assert(0 && "Unimp");
+ abort();
+ }
+
+ //===----------------------------------------------------------------------===//
+ // Instruction Selector Implementation
+ //===----------------------------------------------------------------------===//
+
+ //===--------------------------------------------------------------------===//
+ /// SparcV8DAGToDAGISel - PPC specific code to select Sparc V8 machine
+ /// instructions for SelectionDAG operations.
+ ///
+ namespace {
+ class SparcV8DAGToDAGISel : public SelectionDAGISel {
+ SparcV8TargetLowering V8Lowering;
+ public:
+ SparcV8DAGToDAGISel(TargetMachine &TM)
+ : SelectionDAGISel(V8Lowering), V8Lowering(TM) {}
+
+ SDOperand Select(SDOperand Op);
+
+ /// InstructionSelectBasicBlock - This callback is invoked by
+ /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
+ virtual void InstructionSelectBasicBlock(SelectionDAG &DAG);
+
+ virtual const char *getPassName() const {
+ return "PowerPC DAG->DAG Pattern Instruction Selection";
+ }
+
+ // Include the pieces autogenerated from the target description.
+ #include "SparcV8GenDAGISel.inc"
+ };
+ } // end anonymous namespace
+
+ /// InstructionSelectBasicBlock - This callback is invoked by
+ /// SelectionDAGISel when it has created a SelectionDAG for us to codegen.
+ void SparcV8DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) {
+ DEBUG(BB->dump());
+
+ // Select target instructions for the DAG.
+ DAG.setRoot(Select(DAG.getRoot()));
+ CodeGenMap.clear();
+ DAG.RemoveDeadNodes();
+
+ // Emit machine code to BB.
+ ScheduleAndEmitDAG(DAG);
+ }
+
+
+ SDOperand SparcV8DAGToDAGISel::Select(SDOperand Op) {
+ SDNode *N = Op.Val;
+ if (N->getOpcode() >= ISD::BUILTIN_OP_END/* &&
+ N->getOpcode() < V8ISD::FIRST_NUMBER*/)
+ return Op; // Already selected.
+ // If this has already been converted, use it.
+ std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(Op);
+ if (CGMI != CodeGenMap.end()) return CGMI->second;
+
+ switch (N->getOpcode()) {
+ default: break;
+ }
+
+ return SelectCode(Op);
+ }
+
+
+ /// createPPCISelDag - This pass converts a legalized DAG into a
+ /// PowerPC-specific DAG, ready for instruction scheduling.
+ ///
+ FunctionPass *llvm::createSparcV8ISelDag(TargetMachine &TM) {
+ return new SparcV8DAGToDAGISel(TM);
+ }
Index: llvm/lib/Target/SparcV8/Makefile
diff -u llvm/lib/Target/SparcV8/Makefile:1.11 llvm/lib/Target/SparcV8/Makefile:1.12
--- llvm/lib/Target/SparcV8/Makefile:1.11 Fri Dec 16 00:34:17 2005
+++ llvm/lib/Target/SparcV8/Makefile Sat Dec 17 01:47:01 2005
@@ -13,7 +13,8 @@
# Make sure that tblgen is run, first thing.
BUILT_SOURCES = SparcV8GenRegisterInfo.h.inc SparcV8GenRegisterNames.inc \
SparcV8GenRegisterInfo.inc SparcV8GenInstrNames.inc \
- SparcV8GenInstrInfo.inc SparcV8GenAsmWriter.inc
+ SparcV8GenInstrInfo.inc SparcV8GenAsmWriter.inc \
+ SparcV8GenDAGISel.inc
include $(LEVEL)/Makefile.common
Index: llvm/lib/Target/SparcV8/SparcV8.h
diff -u llvm/lib/Target/SparcV8/SparcV8.h:1.6 llvm/lib/Target/SparcV8/SparcV8.h:1.7
--- llvm/lib/Target/SparcV8/SparcV8.h:1.6 Thu Apr 21 18:21:30 2005
+++ llvm/lib/Target/SparcV8/SparcV8.h Sat Dec 17 01:47:01 2005
@@ -23,6 +23,8 @@
class TargetMachine;
FunctionPass *createSparcV8SimpleInstructionSelector(TargetMachine &TM);
+ FunctionPass *createSparcV8ISelDag(TargetMachine &TM);
+
FunctionPass *createSparcV8CodePrinterPass(std::ostream &OS,
TargetMachine &TM);
FunctionPass *createSparcV8DelaySlotFillerPass(TargetMachine &TM);
Index: llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp
diff -u llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.32 llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.33
--- llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp:1.32 Fri Dec 16 00:06:07 2005
+++ llvm/lib/Target/SparcV8/SparcV8TargetMachine.cpp Sat Dec 17 01:47:01 2005
@@ -20,12 +20,17 @@
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetMachineRegistry.h"
#include "llvm/Transforms/Scalar.h"
+#include "llvm/Support/CommandLine.h"
#include <iostream>
using namespace llvm;
namespace {
// Register the target.
RegisterTarget<SparcV8TargetMachine> X("sparcv8"," SPARC V8 (experimental)");
+
+ cl::opt<bool> DisableV8DAGDAG("disable-v8-dag-isel", cl::Hidden,
+ cl::desc("Disable DAG-to-DAG isel for V8"),
+ cl::init(1));
}
/// SparcV8TargetMachine ctor - Create an ILP32 architecture model
@@ -87,7 +92,10 @@
if (PrintMachineCode)
PM.add(new PrintFunctionPass());
- PM.add(createSparcV8SimpleInstructionSelector(*this));
+ if (DisableV8DAGDAG)
+ PM.add(createSparcV8SimpleInstructionSelector(*this));
+ else
+ PM.add(createSparcV8ISelDag(*this));
// Print machine instructions as they were initially generated.
if (PrintMachineCode)
More information about the llvm-commits
mailing list