Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[MachineOutliner] Don't outline functions starting with PATCHABLE_FUN…
…CTION_ENTER/FENTRL_CALL MachineOutliner may outline a "patchable-function-entry" function whose body has a TargetOpcode::PATCHABLE_FUNCTION_ENTER MachineInstr. This is incorrect because the special code sequence must stay unchanged to be used at run-time. Avoid outlining PATCHABLE_FUNCTION_ENTER. While here, avoid outlining FENTRY_CALL too (which doesn't reproduce currently) to allow phase ordering flexibility. Fixes #52635 Reviewed By: paquette Differential Revision: https://reviews.llvm.org/D115614
- Loading branch information
Showing
6 changed files
with
208 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
114 changes: 114 additions & 0 deletions
114
llvm/test/CodeGen/AArch64/machine-outliner-patchable.ll
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
; RUN: llc < %s -verify-machineinstrs -enable-machine-outliner | FileCheck %s | ||
|
||
target triple = "aarch64-unknown-linux-gnu" | ||
|
||
declare void @foo(i32, i32, i32, i32) minsize | ||
|
||
;; TargetOpcode::FENTRY_CALL at the start of the function expands to a __fentry__ | ||
;; call which must be present. Don't outline it. | ||
define void @fentry0(i1 %a) nounwind "fentry-call"="true" { | ||
; CHECK-LABEL: fentry0: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: # FEntry call | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
define void @fentry1(i1 %a) nounwind "fentry-call"="true" { | ||
; CHECK-LABEL: fentry1: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: # FEntry call | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
;; TargetOpcode::PATCHABLE_FUNCTION_ENTER at the start of the function expands to | ||
;; NOPs which must be present. Don't outline them. | ||
define void @patchable0(i1 %a) nounwind "patchable-function-entry"="2" { | ||
; CHECK-LABEL: patchable0: | ||
; CHECK-NEXT: .Lfunc_begin0: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: nop | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
define void @patchable1(i1 %a) nounwind "patchable-function-entry"="2" { | ||
; CHECK-LABEL: patchable1: | ||
; CHECK-NEXT: .Lfunc_begin1: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: nop | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
;; Similar to "patchable-function-entry". | ||
define void @xray0(i1 %a) nounwind "function-instrument"="xray-always" { | ||
; CHECK-LABEL: xray0: | ||
; CHECK-NEXT: .Lfunc_begin2: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: .p2align 2 | ||
; CHECK-NEXT: .Lxray_sled_0: | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
define void @xray1(i1 %a) nounwind "function-instrument"="xray-always" { | ||
; CHECK-LABEL: xray1: | ||
; CHECK-NEXT: .Lfunc_begin3: | ||
; CHECK-NEXT: // %bb.0: | ||
; CHECK-NEXT: .p2align 2 | ||
; CHECK-NEXT: .Lxray_sled_2: | ||
; CHECK: // %bb.1: | ||
; CHECK-NEXT: bl OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
; RUN: llc < %s -verify-machineinstrs -enable-machine-outliner | FileCheck %s | ||
|
||
target triple = "riscv64-unknown-linux-gnu" | ||
|
||
declare void @foo(i32, i32, i32, i32) minsize | ||
|
||
;; TargetOpcode::FENTRY_CALL at the start of the function expands to a __fentry__ | ||
;; call which must be present. Don't outline it. | ||
define void @fentry0(i1 %a) nounwind "fentry-call"="true" { | ||
; CHECK-LABEL: fentry0: | ||
; CHECK-NEXT: # %bb.0: | ||
; CHECK-NEXT: # FEntry call | ||
; CHECK: # %bb.1: | ||
; CHECK-NEXT: call t0, OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
define void @fentry1(i1 %a) nounwind "fentry-call"="true" { | ||
; CHECK-LABEL: fentry1: | ||
; CHECK-NEXT: # %bb.0: | ||
; CHECK-NEXT: # FEntry call | ||
; CHECK: # %bb.1: | ||
; CHECK-NEXT: call t0, OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
;; TargetOpcode::PATCHABLE_FUNCTION_ENTER at the start of the function expands to | ||
;; NOPs which must be present. Don't outline them. | ||
define void @patchable0(i1 %a) nounwind "patchable-function-entry"="2" { | ||
; CHECK-LABEL: patchable0: | ||
; CHECK-NEXT: .Lfunc_begin0: | ||
; CHECK-NEXT: # %bb.0: | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: nop | ||
; CHECK: # %bb.1: | ||
; CHECK-NEXT: call t0, OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} | ||
|
||
define void @patchable1(i1 %a) nounwind "patchable-function-entry"="2" { | ||
; CHECK-LABEL: patchable1: | ||
; CHECK-NEXT: .Lfunc_begin1: | ||
; CHECK-NEXT: # %bb.0: | ||
; CHECK-NEXT: nop | ||
; CHECK-NEXT: nop | ||
; CHECK: # %bb.1: | ||
; CHECK-NEXT: call t0, OUTLINED_FUNCTION_1 | ||
entry: | ||
br i1 %a, label %if.then, label %if.end | ||
if.then: | ||
call void @foo(i32 1, i32 2, i32 3, i32 4) | ||
br label %if.end | ||
if.end: | ||
call void @foo(i32 5, i32 6, i32 7, i32 8) | ||
ret void | ||
} |