llvm-project/llvm/test/CodeGen/ARM/fast-isel-inline-asm.ll
Nikita Popov cd91992de8 [ARM] Convert test to opaque pointers
When converting this test to opaque pointers, we get a register
move between the call and the inline asm. However, the test
comment specifically says that there should be nothing between them.

As far as I can tell, this is fine, both in that the inline asm
doesn't use the relevant registers, but also more generally
because the inline asm doesn't declare any clobbers, so really
LLVM can do whatever, side effects or not. The test was added
by 618ce3e85ed1c68e89dc696b7c9ab94a6a910797 with only a reference
to Apple's internal issue tracker.

Differential Revision: https://reviews.llvm.org/D147512
2023-04-11 10:28:40 +02:00

31 lines
1012 B
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -fast-isel < %s | FileCheck %s
target datalayout = "e-m:o-p:32:32-i1:8:32-i8:8:32-i16:16:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
target triple = "thumbv7-apple-ios5.0.0"
%0 = type opaque
; Make sure that there are no unexpected instructions between the call to bar
; and the inline asm.
define void @test_inline_asm_sideeffect(ptr %call) {
; CHECK-LABEL: test_inline_asm_sideeffect:
; CHECK: @ %bb.0:
; CHECK-NEXT: push {r4, r7, lr}
; CHECK-NEXT: add r7, sp, #4
; CHECK-NEXT: mov r4, r0
; CHECK-NEXT: bl _bar
; CHECK-NEXT: mov r0, r4
; CHECK-NEXT: @ InlineAsm Start
; CHECK-NEXT: mov r7, r7 @ marker
; CHECK-NEXT: @ InlineAsm End
; CHECK-NEXT: bl _foo
; CHECK-NEXT: pop {r4, r7, pc}
call void @bar()
call void asm sideeffect "mov\09r7, r7\09\09@ marker", ""()
%1 = call ptr @foo(ptr %call)
ret void
}
declare ptr @foo(ptr)
declare void @bar()