llvm-mirror/test/CodeGen/AArch64/machine-outliner-compatible-candidates.mir
Jessica Paquette 7d1c45a131 [MachineOutliner] Drop candidates that require fixups if it's beneficial
If it's a bigger code size win to drop candidates that require stack fixups
than to demote every candidate to that variant, the outliner should do that.

This happens if the number of bytes taken by calls to functions that don't
require fixups, plus the number of bytes that'd be left is less than the
number of bytes that it'd take to emit a save + restore for all candidates.

Also add tests for each possible new behaviour.

- machine-outliner-compatible-candidates shows that when we have candidates
that don't use the stack, we can use the default call variant along with the
no save/regsave variant.

- machine-outliner-all-stack shows that when it's better to fix up the stack,
we still will demote all candidates to that case

- machine-outliner-drop-stack shows that we can discard candidates that
require stack fixups when it would be beneficial to do so.

llvm-svn: 348168
2018-12-03 19:11:27 +00:00

104 lines
2.8 KiB
YAML

# RUN: llc -mtriple=aarch64--- -run-pass=machine-outliner \
# RUN: -verify-machineinstrs %s -o - | FileCheck %s
# Ensure that we can outline candidates with compatible call/frame classes.
#
# - Save/restores that don't impact the stack can be outlined together.
# - Save/restores that impact the stack if the outlined sequence doesn't use
# the stack.
--- |
define void @no-save1() #0 { ret void }
define void @no-save2() #0 { ret void }
define void @reg-save() #0 { ret void }
define void @stack-save() #0 { ret void }
attributes #0 = { minsize noinline noredzone "no-frame-pointer-elim"="true" }
...
---
name: no-save1
tracksRegLiveness: true
body: |
bb.0:
liveins: $lr
$lr = ORRXri $xzr, 1
bb.1:
; CHECK-LABEL: name: no-save1
; CHECK: BL [[FN:@OUTLINED_FUNCTION_[0-9]+]]
; CHECK-NOT: STRXpre
; CHECK-NOT: $lr =
; CHECK-NOT: ORRXrs
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
bb.2:
RET undef $lr
...
---
name: no-save2
tracksRegLiveness: true
body: |
bb.0:
liveins: $lr
$lr = ORRXri $xzr, 1
bb.1:
; CHECK-LABEL: name: no-save2
; CHECK: BL [[FN]]
; CHECK-NOT: STRXpre
; CHECK-NOT: $lr =
; CHECK-NOT: ORRXrs
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
bb.2:
RET undef $lr
...
---
name: reg-save
tracksRegLiveness: true
body: |
bb.0:
liveins: $lr
$lr = ORRXri $xzr, 1
bb.1:
liveins: $lr
; CHECK-LABEL: name: reg-save
; CHECK: $[[REG:x[0-9]+]] = ORRXrs $xzr, $lr, 0
; CHECK-NEXT: BL [[FN]]
; CHECK-NEXT: $lr = ORRXrs $xzr, $[[REG]], 0
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
bb.2:
liveins: $lr
RET undef $lr
...
---
name: stack-save
tracksRegLiveness: true
body: |
bb.0:
liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
$lr = ORRXri $xzr, 1
bb.1:
liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
; CHECK-LABEL: name: stack-save
; CHECK: $sp = STRXpre $lr, $sp, -16
; CHECK-NEXT: BL [[FN]]
; CHECK-NEXT: $sp, $lr = LDRXpost $sp, 16
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
$w11 = ORRWri $wzr, 1
bb.2:
liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
RET undef $lr