Index: lib/Target/Mips/Mips16ISelDAGToDAG.h =================================================================== --- lib/Target/Mips/Mips16ISelDAGToDAG.h +++ lib/Target/Mips/Mips16ISelDAGToDAG.h @@ -20,7 +20,8 @@ class Mips16DAGToDAGISel : public MipsDAGToDAGISel { public: - explicit Mips16DAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {} + explicit Mips16DAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) + : MipsDAGToDAGISel(TM, OL) {} private: std::pair selectMULT(SDNode *N, unsigned Opc, @@ -47,7 +48,8 @@ void initMips16SPAliasReg(MachineFunction &MF); }; -FunctionPass *createMips16ISelDag(MipsTargetMachine &TM); +FunctionPass *createMips16ISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel); } #endif Index: lib/Target/Mips/Mips16ISelDAGToDAG.cpp =================================================================== --- lib/Target/Mips/Mips16ISelDAGToDAG.cpp +++ lib/Target/Mips/Mips16ISelDAGToDAG.cpp @@ -254,6 +254,7 @@ return false; } -FunctionPass *llvm::createMips16ISelDag(MipsTargetMachine &TM) { - return new Mips16DAGToDAGISel(TM); +FunctionPass *llvm::createMips16ISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel) { + return new Mips16DAGToDAGISel(TM, OptLevel); } Index: lib/Target/Mips/MipsISelDAGToDAG.h =================================================================== --- lib/Target/Mips/MipsISelDAGToDAG.h +++ lib/Target/Mips/MipsISelDAGToDAG.h @@ -31,8 +31,8 @@ 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 { Index: lib/Target/Mips/MipsSEISelDAGToDAG.h =================================================================== --- lib/Target/Mips/MipsSEISelDAGToDAG.h +++ lib/Target/Mips/MipsSEISelDAGToDAG.h @@ -21,7 +21,8 @@ class MipsSEDAGToDAGISel : public MipsDAGToDAGISel { public: - explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {} + explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM, CodeGenOpt::Level OL) + : MipsDAGToDAGISel(TM, OL) {} private: @@ -122,8 +123,8 @@ std::vector &OutOps) override; }; -FunctionPass *createMipsSEISelDag(MipsTargetMachine &TM); - +FunctionPass *createMipsSEISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel); } #endif Index: lib/Target/Mips/MipsSEISelDAGToDAG.cpp =================================================================== --- lib/Target/Mips/MipsSEISelDAGToDAG.cpp +++ lib/Target/Mips/MipsSEISelDAGToDAG.cpp @@ -1009,6 +1009,7 @@ return true; } -FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM) { - return new MipsSEDAGToDAGISel(TM); +FunctionPass *llvm::createMipsSEISelDag(MipsTargetMachine &TM, + CodeGenOpt::Level OptLevel) { + return new MipsSEDAGToDAGISel(TM, OptLevel); } Index: lib/Target/Mips/MipsTargetMachine.cpp =================================================================== --- lib/Target/Mips/MipsTargetMachine.cpp +++ lib/Target/Mips/MipsTargetMachine.cpp @@ -229,8 +229,8 @@ // 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; } Index: test/CodeGen/Mips/selectiondag-optlevel.ll =================================================================== --- /dev/null +++ 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)