From 5c3ea078482d5442a99f6e9387a96946b5094d15 Mon Sep 17 00:00:00 2001 From: wangpc Date: Fri, 22 Apr 2022 12:22:36 +0800 Subject: [PATCH] [RISCV] Do not outline CFI instructions when they are needed in EH We saw a failure caused by unwinding with incomplete CFIs, so we can't outline CFI instructions when they are needed in EH. This is a recommit of 0d40688, which was reverted in ce83883 as related precommit test 360d44e caused some errors. Reviewed By: luismarques Differential Revision: https://reviews.llvm.org/D122634 --- llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 7 ++++- .../CodeGen/RISCV/machine-outliner-throw.ll | 30 ++++++++++++------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp index 8f931c6ad1d9..09b88c077964 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp @@ -1246,7 +1246,12 @@ RISCVInstrInfo::getOutliningType(MachineBasicBlock::iterator &MBBI, 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 index b0ac9c9da23a..4c42f93cbb87 100644 --- 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 @@ entry: 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 @@ entry: 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*)