diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -1246,7 +1246,12 @@ if (MI.isPosition()) { // We can manually strip out CFI instructions later. if (MI.isCFIInstruction()) - return outliner::InstrType::Invisible; + // If current function has exception handling code, we can't outline & + // strip these CFI instructions since it may break .eh_frame section + // needed in unwinding. + return MI.getMF()->getFunction().needsUnwindTableEntry() + ? outliner::InstrType::Illegal + : outliner::InstrType::Invisible; return outliner::InstrType::Illegal; } diff --git a/llvm/test/CodeGen/RISCV/machine-outliner-throw.ll b/llvm/test/CodeGen/RISCV/machine-outliner-throw.ll --- a/llvm/test/CodeGen/RISCV/machine-outliner-throw.ll +++ b/llvm/test/CodeGen/RISCV/machine-outliner-throw.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -verify-machineinstrs -enable-machine-outliner -mattr=+m -mtriple=riscv64 < %s | FileCheck %s ; Ensure that we won't outline CFIs when they are needed in unwinding. @@ -5,7 +6,15 @@ define i32 @func1(i32 %x) #0 { ; CHECK-LABEL: func1: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: call t0, OUTLINED_FUNCTION_0 +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd s0, 0(sp) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset ra, -8 +; CHECK-NEXT: .cfi_offset s0, -16 +; CHECK-NEXT: mulw a0, a0, a0 +; CHECK-NEXT: addiw s0, a0, 1 +; CHECK-NEXT: li a0, 4 ; CHECK-NEXT: call __cxa_allocate_exception@plt ; CHECK-NEXT: sw s0, 0(a0) ; CHECK-NEXT: lui a1, %hi(_ZTIi) @@ -25,7 +34,15 @@ define i32 @func2(i32 %x) #0 { ; CHECK-LABEL: func2: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: call t0, OUTLINED_FUNCTION_0 +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .cfi_def_cfa_offset 16 +; CHECK-NEXT: sd ra, 8(sp) # 8-byte Folded Spill +; CHECK-NEXT: sd s0, 0(sp) # 8-byte Folded Spill +; CHECK-NEXT: .cfi_offset ra, -8 +; CHECK-NEXT: .cfi_offset s0, -16 +; CHECK-NEXT: mulw a0, a0, a0 +; CHECK-NEXT: addiw s0, a0, 1 +; CHECK-NEXT: li a0, 4 ; CHECK-NEXT: call __cxa_allocate_exception@plt ; CHECK-NEXT: sw s0, 0(a0) ; CHECK-NEXT: lui a1, %hi(_ZTIi) @@ -42,15 +59,6 @@ unreachable } -; CHECK-LABEL: OUTLINED_FUNCTION_0: -; CHECK: # %bb.0: -; CHECK-NEXT: addi sp, sp, -16 -; CHECK-NEXT: sd ra, 8(sp) -; CHECK-NEXT: sd s0, 0(sp) -; CHECK-NEXT: mulw a0, a0, a0 -; CHECK-NEXT: addiw s0, a0, 1 -; CHECK-NEXT: li a0, 4 - @_ZTIi = external constant i8* declare i8* @__cxa_allocate_exception(i64) declare void @__cxa_throw(i8*, i8*, i8*)