mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
178bc607c9
This patch handles cases where we have to save/restore the link register into the stack and and load/store instruction which use the stack are part of the outlined region. It checks that there will be no overflow introduced by the new offset and fixup these instructions accordingly. Differential Revision: https://reviews.llvm.org/D92934
85 lines
2.7 KiB
YAML
85 lines
2.7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=arm-- -run-pass=machine-outliner -verify-machineinstrs \
|
|
# RUN: %s -o - | FileCheck %s
|
|
|
|
--- |
|
|
define void @outline_no_save_ok_arm() #0 { ret void }
|
|
define void @outline_no_save_ok_thumb() #1 { ret void }
|
|
|
|
declare void @foo()
|
|
|
|
attributes #0 = { minsize optsize }
|
|
attributes #1 = { minsize optsize "target-features"="+armv7-a,+thumb-mode" }
|
|
...
|
|
---
|
|
|
|
name: outline_no_save_ok_arm
|
|
tracksRegLiveness: true
|
|
body: |
|
|
; CHECK-LABEL: name: outline_no_save_ok_arm
|
|
; CHECK: bb.0:
|
|
; CHECK: BL @OUTLINED_FUNCTION_1
|
|
; CHECK: bb.1:
|
|
; CHECK: BL @OUTLINED_FUNCTION_1
|
|
; CHECK: bb.2:
|
|
; CHECK: BX_RET 14 /* CC::al */, $noreg
|
|
bb.0:
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r3 = LDRi12 $sp, 8, 14, $noreg
|
|
bb.1:
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r2 = MOVi 1, 14, $noreg, $noreg
|
|
$r3 = LDRi12 $sp, 8, 14, $noreg
|
|
bb.2:
|
|
BX_RET 14, $noreg
|
|
...
|
|
---
|
|
|
|
name: outline_no_save_ok_thumb
|
|
tracksRegLiveness: true
|
|
body: |
|
|
; CHECK-LABEL: name: outline_no_save_ok_thumb
|
|
; CHECK: bb.0:
|
|
; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_0
|
|
; CHECK: bb.1:
|
|
; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_0
|
|
; CHECK: bb.2:
|
|
; CHECK: tBX_RET 14 /* CC::al */, $noreg
|
|
bb.0:
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
t2STRi12 $r2, $sp, 0, 14, $noreg
|
|
bb.1:
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
$r2 = t2MOVi 1, 14, $noreg, $noreg
|
|
t2STRi12 $r2, $sp, 0, 14, $noreg
|
|
bb.2:
|
|
tBX_RET 14, $noreg
|
|
|
|
; CHECK-LABEL: name: OUTLINED_FUNCTION_0
|
|
; CHECK: bb.0:
|
|
; CHECK: $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: t2STRi12 $r2, $sp, 0, 14 /* CC::al */, $noreg
|
|
; CHECK: tBX_RET 14 /* CC::al */, $noreg
|
|
|
|
; CHECK-LABEL: name: OUTLINED_FUNCTION_1
|
|
; CHECK: bb.0:
|
|
; CHECK: $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg
|
|
; CHECK: $r3 = LDRi12 $sp, 8, 14 /* CC::al */, $noreg
|
|
; CHECK: MOVPCLR 14 /* CC::al */, $noreg
|