[llvm] 02c154a - [AArch64][MachineOutliner] Don't outline CFI instructions
Jessica Paquette via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 2 10:57:25 PST 2020
Author: Jessica Paquette
Date: 2020-03-02T10:56:35-08:00
New Revision: 02c154a9cb7f81d6bffe2326104e8d19980f2dd5
URL: https://github.com/llvm/llvm-project/commit/02c154a9cb7f81d6bffe2326104e8d19980f2dd5
DIFF: https://github.com/llvm/llvm-project/commit/02c154a9cb7f81d6bffe2326104e8d19980f2dd5.diff
LOG: [AArch64][MachineOutliner] Don't outline CFI instructions
CFI instructions can only safely be outlined when the outlined call is a tail
call, or when the outlined frame is fixed up.
For the sake of correctness, disable outlining from CFI instructions.
Add machine-outliner-cfi.mir to test this.
Added:
llvm/test/CodeGen/AArch64/machine-outliner-cfi.mir
Modified:
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index 472b5e628e19..436b26c36d2d 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -6158,6 +6158,14 @@ AArch64InstrInfo::getOutliningType(MachineBasicBlock::iterator &MIT,
if (FuncInfo->getLOHRelated().count(&MI))
return outliner::InstrType::Illegal;
+ // We can only outline these if we will tail call the outlined function, or
+ // fix up the CFI offsets. For the sake of safety, don't outline CFI
+ // instructions.
+ //
+ // FIXME: If the proper fixups are implemented, this should be possible.
+ if (MI.isCFIInstruction())
+ return outliner::InstrType::Illegal;
+
// Don't allow debug values to impact outlining type.
if (MI.isDebugInstr() || MI.isIndirectDebugValue())
return outliner::InstrType::Invisible;
diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-cfi.mir b/llvm/test/CodeGen/AArch64/machine-outliner-cfi.mir
new file mode 100644
index 000000000000..707785a566a2
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/machine-outliner-cfi.mir
@@ -0,0 +1,63 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
+# RUN: llc -mtriple=aarch64-apple-unknown -run-pass=machine-outliner -verify-machineinstrs %s -o - | FileCheck %s
+
+# Outlining CFI instructions is unsafe. It is possible if the call is tail
+# called, but otherwise, it requires fixups. Show that we don't include CFI
+# instructions in outlined sequences right now.
+
+--- |
+ define void @foo() #0 { ret void }
+ define void @bar() #0 { ret void }
+ define void @baz() #0 { ret void }
+ attributes #0 = { noredzone }
+...
+---
+name: foo
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $lr
+ ; CHECK-LABEL: name: foo
+ ; CHECK: liveins: $lr
+ ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ ; CHECK: TCRETURNdi @OUTLINED_FUNCTION_0, 0, implicit $sp, implicit-def $w12, implicit-def $w13, implicit-def $w14, implicit-def $w15
+ frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ $w12 = ORRWri $wzr, 1
+ $w13 = ORRWri $wzr, 2
+ $w14 = ORRWri $wzr, 3
+ $w15 = ORRWri $wzr, 4
+ RET undef $lr
+...
+---
+name: bar
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $lr
+ ; CHECK-LABEL: name: bar
+ ; CHECK: liveins: $lr
+ ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ ; CHECK: TCRETURNdi @OUTLINED_FUNCTION_0, 0, implicit $sp, implicit-def $w12, implicit-def $w13, implicit-def $w14, implicit-def $w15
+ frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ $w12 = ORRWri $wzr, 1
+ $w13 = ORRWri $wzr, 2
+ $w14 = ORRWri $wzr, 3
+ $w15 = ORRWri $wzr, 4
+ RET undef $lr
+...
+---
+name: baz
+tracksRegLiveness: true
+body: |
+ bb.0:
+ liveins: $lr
+ ; CHECK-LABEL: name: baz
+ ; CHECK: liveins: $lr
+ ; CHECK: frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ ; CHECK: TCRETURNdi @OUTLINED_FUNCTION_0, 0, implicit $sp, implicit-def $w12, implicit-def $w13, implicit-def $w14, implicit-def $w15
+ frame-setup CFI_INSTRUCTION def_cfa $w29, 16
+ $w12 = ORRWri $wzr, 1
+ $w13 = ORRWri $wzr, 2
+ $w14 = ORRWri $wzr, 3
+ $w15 = ORRWri $wzr, 4
+ RET undef $lr
More information about the llvm-commits
mailing list