diff --git a/llvm/lib/Target/LoongArch/LoongArch.h b/llvm/lib/Target/LoongArch/LoongArch.h index 09ca089c91151bc6f928f13764c9b3635549261a..a2267024a976023932fbb70cdbff4eca36154a47 100644 --- a/llvm/lib/Target/LoongArch/LoongArch.h +++ b/llvm/lib/Target/LoongArch/LoongArch.h @@ -34,7 +34,8 @@ bool lowerLoongArchMachineOperandToMCOperand(const MachineOperand &MO, const AsmPrinter &AP); FunctionPass *createLoongArchExpandAtomicPseudoPass(); -FunctionPass *createLoongArchISelDag(LoongArchTargetMachine &TM); +FunctionPass *createLoongArchISelDag(LoongArchTargetMachine &TM, + CodeGenOpt::Level OptLevel); FunctionPass *createLoongArchPreRAExpandPseudoPass(); FunctionPass *createLoongArchExpandPseudoPass(); void initializeLoongArchDAGToDAGISelPass(PassRegistry &); diff --git a/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.cpp b/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.cpp index 01b2f720f902cee5a44e928936421ae097688e24..535405022edafbbb59480991db0bde6c4a018be9 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.cpp @@ -412,6 +412,7 @@ bool LoongArchDAGToDAGISel::selectVSplatUimmPow2(SDValue N, // This pass converts a legalized DAG into a LoongArch-specific DAG, ready // for instruction scheduling. -FunctionPass *llvm::createLoongArchISelDag(LoongArchTargetMachine &TM) { - return new LoongArchDAGToDAGISel(TM); +FunctionPass *llvm::createLoongArchISelDag(LoongArchTargetMachine &TM, + CodeGenOpt::Level OptLevel) { + return new LoongArchDAGToDAGISel(TM, OptLevel); } diff --git a/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h b/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h index 5e3d6ccc3755c06f3cf5f582f0b3299b30bc8cb6..8149e04321269acf1812412d141feb41527e949b 100644 --- a/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h +++ b/llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h @@ -28,8 +28,9 @@ public: LoongArchDAGToDAGISel() = delete; - explicit LoongArchDAGToDAGISel(LoongArchTargetMachine &TM) - : SelectionDAGISel(ID, TM) {} + explicit LoongArchDAGToDAGISel(LoongArchTargetMachine &TM, + CodeGenOpt::Level OptLevel) + : SelectionDAGISel(ID, TM, OptLevel) {} bool runOnMachineFunction(MachineFunction &MF) override { Subtarget = &MF.getSubtarget(); diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp index 0efc5e6ebb99d6109a121850b97df538ea66c3b1..c683902331d9456e2287abcba58d59c4459736d3 100644 --- a/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchTargetMachine.cpp @@ -167,7 +167,7 @@ void LoongArchPassConfig::addIRPasses() { } bool LoongArchPassConfig::addInstSelector() { - addPass(createLoongArchISelDag(getLoongArchTargetMachine())); + addPass(createLoongArchISelDag(getLoongArchTargetMachine(), getOptLevel())); return false; } diff --git a/llvm/test/CodeGen/LoongArch/O0-pipeline.ll b/llvm/test/CodeGen/LoongArch/O0-pipeline.ll index 84d235d78eb9e5999953972911482e3be02f8d67..9786390687d6716f2d6f530702bee98e07106cf1 100644 --- a/llvm/test/CodeGen/LoongArch/O0-pipeline.ll +++ b/llvm/test/CodeGen/LoongArch/O0-pipeline.ll @@ -35,15 +35,7 @@ ; CHECK-NEXT: Safe Stack instrumentation pass ; CHECK-NEXT: Insert stack protectors ; CHECK-NEXT: Module Verifier -; CHECK-NEXT: Dominator Tree Construction -; CHECK-NEXT: Basic Alias Analysis (stateless AA impl) -; CHECK-NEXT: Function Alias Analysis Results -; CHECK-NEXT: Natural Loop Information -; CHECK-NEXT: Post-Dominator Tree Construction -; CHECK-NEXT: Branch Probability Analysis ; CHECK-NEXT: Assignment Tracking Analysis -; CHECK-NEXT: Lazy Branch Probability Analysis -; CHECK-NEXT: Lazy Block Frequency Analysis ; CHECK-NEXT: LoongArch DAG->DAG Pattern Instruction Selection ; CHECK-NEXT: Finalize ISel and expand pseudo-instructions ; CHECK-NEXT: Local Stack Slot Allocation diff --git a/llvm/test/CodeGen/LoongArch/isel-optnone.ll b/llvm/test/CodeGen/LoongArch/isel-optnone.ll new file mode 100644 index 0000000000000000000000000000000000000000..4d2528a3148ac96cd40da704de182321a994c439 --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/isel-optnone.ll @@ -0,0 +1,10 @@ +; REQUIRES: asserts +; RUN: llc %s -O0 -mtriple=loongarch64 -o /dev/null -debug-only=isel 2>&1 | FileCheck %s + +define void @fooOptnone() #0 { +; CHECK-NOT: Changing optimization level for Function fooOptnone +; CHECK-NOT: Restoring optimization level for Function fooOptnone + ret void +} + +attributes #0 = { nounwind optnone noinline } diff --git a/llvm/test/CodeGen/LoongArch/shrinkwrap.ll b/llvm/test/CodeGen/LoongArch/shrinkwrap.ll index 5f15dd2e7eafa812afdf52b29080f252ea10a99e..0323b56080f83e7e8553112efa7ec3bf5cc22309 100644 --- a/llvm/test/CodeGen/LoongArch/shrinkwrap.ll +++ b/llvm/test/CodeGen/LoongArch/shrinkwrap.ll @@ -9,7 +9,6 @@ define void @eliminate_restore(i32 %n) nounwind { ; NOSHRINKW: # %bb.0: ; NOSHRINKW-NEXT: addi.d $sp, $sp, -16 ; NOSHRINKW-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill -; NOSHRINKW-NEXT: # kill: def $r5 killed $r4 ; NOSHRINKW-NEXT: addi.w $a1, $a0, 0 ; NOSHRINKW-NEXT: ori $a0, $zero, 32 ; NOSHRINKW-NEXT: bltu $a0, $a1, .LBB0_2 @@ -52,9 +51,8 @@ define void @conditional_alloca(i32 %n) nounwind { ; NOSHRINKW-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill ; NOSHRINKW-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill ; NOSHRINKW-NEXT: addi.d $fp, $sp, 32 -; NOSHRINKW-NEXT: move $a1, $a0 -; NOSHRINKW-NEXT: st.d $a1, $fp, -24 # 8-byte Folded Spill ; NOSHRINKW-NEXT: addi.w $a1, $a0, 0 +; NOSHRINKW-NEXT: st.d $a0, $fp, -24 # 8-byte Folded Spill ; NOSHRINKW-NEXT: ori $a0, $zero, 32 ; NOSHRINKW-NEXT: bltu $a0, $a1, .LBB1_2 ; NOSHRINKW-NEXT: b .LBB1_1 diff --git a/llvm/test/CodeGen/LoongArch/spill-ra-without-kill.ll b/llvm/test/CodeGen/LoongArch/spill-ra-without-kill.ll index 092da5aba2d9373622e82733724f2a8cea28abe9..6fba703018f02b2677fe39ffc71fd9155347b454 100644 --- a/llvm/test/CodeGen/LoongArch/spill-ra-without-kill.ll +++ b/llvm/test/CodeGen/LoongArch/spill-ra-without-kill.ll @@ -19,13 +19,13 @@ define dso_local ptr @f(i32 noundef signext %i) "frame-pointer"="all" { ; CHECK-NEXT: addi.d $fp, $sp, 48 ; CHECK-NEXT: .cfi_def_cfa 22, 0 ; CHECK-NEXT: st.d $ra, $fp, -40 # 8-byte Folded Spill -; CHECK-NEXT: move $a1, $a0 +; CHECK-NEXT: # kill: def $r5 killed $r4 +; CHECK-NEXT: st.w $a0, $fp, -28 ; CHECK-NEXT: pcalau12i $a0, %pc_hi20(calls) -; CHECK-NEXT: addi.d $a3, $a0, %pc_lo12(calls) -; CHECK-NEXT: ld.w $a0, $a3, 0 -; CHECK-NEXT: addi.d $a2, $a0, 1 -; CHECK-NEXT: st.w $a2, $a3, 0 -; CHECK-NEXT: st.w $a1, $fp, -28 +; CHECK-NEXT: addi.d $a2, $a0, %pc_lo12(calls) +; CHECK-NEXT: ld.w $a0, $a2, 0 +; CHECK-NEXT: addi.d $a1, $a0, 1 +; CHECK-NEXT: st.w $a1, $a2, 0 ; CHECK-NEXT: bnez $a0, .LBB0_2 ; CHECK-NEXT: b .LBB0_1 ; CHECK-NEXT: .LBB0_1: # %if.then @@ -39,6 +39,7 @@ define dso_local ptr @f(i32 noundef signext %i) "frame-pointer"="all" { ; CHECK-NEXT: b .LBB0_3 ; CHECK-NEXT: .LBB0_3: # %if.end ; CHECK-NEXT: ld.d $a0, $fp, -48 # 8-byte Folded Reload +; CHECK-NEXT: addi.w $a0, $a0, 0 ; CHECK-NEXT: ori $a1, $zero, 1 ; CHECK-NEXT: bne $a0, $a1, .LBB0_6 ; CHECK-NEXT: b .LBB0_4