diff options
-rw-r--r-- | llvm/lib/Target/Mips/Mips16ISelDAGToDAG.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/Mips16ISelDAGToDAG.h | 6 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsISelDAGToDAG.h | 4 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h | 7 | ||||
-rw-r--r-- | llvm/lib/Target/Mips/MipsTargetMachine.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/Mips/selectiondag-optlevel.ll | 22 |
7 files changed, 40 insertions, 13 deletions
diff --git a/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.cpp b/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.cpp index df075a1eea6..0405291431c 100644 --- a/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.cpp +++ b/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.cpp @@ -254,6 +254,7 @@ bool Mips16DAGToDAGISel::trySelect(SDNode *Node) { return false; } -FunctionPass *llvm::createMips16ISelDag(MipsTargetMachine &TM) { - return new Mips16DAGToDAGISel(TM); +FunctionPass *llvm::createMips16ISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel) { + return new Mips16DAGToDAGISel(TM, OptLevel); } diff --git a/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.h b/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.h index 7c6a408594c..bbf8cc36f24 100644 --- a/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.h +++ b/llvm/lib/Target/Mips/Mips16ISelDAGToDAG.h @@ -20,7 +20,8 @@ namespace llvm { class Mips16DAGToDAGISel : public MipsDAGToDAGISel { public: - explicit Mips16DAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {} + explicit Mips16DAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) + : MipsDAGToDAGISel(TM, OL) {} private: std::pair<SDNode *, SDNode *> selectMULT(SDNode *N, unsigned Opc, @@ -47,7 +48,8 @@ private: void initMips16SPAliasReg(MachineFunction &MF); }; -FunctionPass *createMips16ISelDag(MipsTargetMachine &TM); +FunctionPass *createMips16ISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel); } #endif diff --git a/llvm/lib/Target/Mips/MipsISelDAGToDAG.h b/llvm/lib/Target/Mips/MipsISelDAGToDAG.h index 84e09611e16..289832a8064 100644 --- a/llvm/lib/Target/Mips/MipsISelDAGToDAG.h +++ b/llvm/lib/Target/Mips/MipsISelDAGToDAG.h @@ -31,8 +31,8 @@ namespace llvm { class MipsDAGToDAGISel : public SelectionDAGISel { public: - explicit MipsDAGToDAGISel(MipsTargetMachine &TM) - : SelectionDAGISel(TM), Subtarget(nullptr) {} + explicit MipsDAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) + : SelectionDAGISel(TM, OL), Subtarget(nullptr) {} // Pass Name const char *getPassName() const override { diff --git a/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp b/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp index ff24e534e31..d9528da5a96 100644 --- a/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp +++ b/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp @@ -1033,6 +1033,7 @@ SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID, return true; } -FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) { - return new MipsSEDAGToDAGISel(TM); +FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel) { + return new MipsSEDAGToDAGISel(TM, OptLevel); } diff --git a/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h b/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h index 6a09e516ece..0f08b72a334 100644 --- a/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h +++ b/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.h @@ -21,7 +21,8 @@ namespace llvm { class MipsSEDAGToDAGISel : public MipsDAGToDAGISel { public: - explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {} + explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) + : MipsDAGToDAGISel(TM, OL) {} private: @@ -131,8 +132,8 @@ private: std::vector<SDValue> &OutOps) override; }; -FunctionPass *createMipsSEISelDag(MipsTargetMachine &TM); - +FunctionPass *createMipsSEISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel); } #endif diff --git a/llvm/lib/Target/Mips/MipsTargetMachine.cpp b/llvm/lib/Target/Mips/MipsTargetMachine.cpp index 8366129b205..c248c3a50ac 100644 --- a/llvm/lib/Target/Mips/MipsTargetMachine.cpp +++ b/llvm/lib/Target/Mips/MipsTargetMachine.cpp @@ -229,8 +229,8 @@ void MipsPassConfig::addIRPasses() { // the ISelDag to gen Mips code. bool MipsPassConfig::addInstSelector() { addPass(createMipsModuleISelDagPass(getMipsTargetMachine())); - addPass(createMips16ISelDag(getMipsTargetMachine())); - addPass(createMipsSEISelDag(getMipsTargetMachine())); + addPass(createMips16ISelDag(getMipsTargetMachine(), getOptLevel())); + addPass(createMipsSEISelDag(getMipsTargetMachine(), getOptLevel())); return false; } diff --git a/llvm/test/CodeGen/Mips/selectiondag-optlevel.ll b/llvm/test/CodeGen/Mips/selectiondag-optlevel.ll new file mode 100644 index 00000000000..99936113174 --- /dev/null +++ b/llvm/test/CodeGen/Mips/selectiondag-optlevel.ll @@ -0,0 +1,22 @@ +; RUN: llc -march=mips -fast-isel=false -O0 < %s 2>&1 | FileCheck %s -check-prefix=O0 +; RUN: llc -march=mips -fast-isel=false -O2 < %s 2>&1 | FileCheck %s -check-prefix=O2 + +; At -O0, DAGCombine won't try to merge these consecutive loads but it will at +; -O2. + +define void @foo() nounwind { +entry: + %0 = alloca [2 x i8], align 32 + %1 = getelementptr inbounds [2 x i8], [2 x i8]* %0, i32 0, i32 0 + store i8 1, i8* %1 + %2 = getelementptr inbounds [2 x i8], [2 x i8]* %0, i32 0, i32 1 + store i8 1, i8* %2 + ret void +} + +; O0: addiu $[[REG:[0-9]+]], $zero, 1 +; O0-DAG: sb $[[REG]], 0($sp) +; O0-DAG: sb $[[REG]], 1($sp) + +; O2: addiu $[[REG:[0-9]+]], $zero, 257 +; O2: sh $[[REG]], 0($sp) |