--- /dev/null
+; RUN: llc -O0 -mtriple=aarch64-apple-ios -o - %s | FileCheck %s
+; RUN: not llc -O0 -mtriple=aarch64-apple-ios -o /dev/null -fast-isel-abort=3 %s 2> %t
+; RUN: FileCheck %s --check-prefix=CHECK-ERRORS < %t
+
+; The issue here is that FastISel cannot emit an ADDrr where one of the inputs
+; is SP. This only ever crops up with function calls, and then only if the
+; argument is at an offset > 2^12 * size from SP.
+
+; If FastISel ever starts coping with this and emits an "add xD, sp, xM" it's
+; critical to check the encoding as well as the textual assembly. An ADDXrs with
+; SP as an operand will still print with SP, but will actually mean XZR.
+
+; CHECK-ERRORS: LLVM ERROR: FastISel missed call
+
+; CHECK-LABEL: foo:
+; CHECK-DAG: mov x[[SP:[0-9]+]], sp
+; CHECK-DAG: mov [[TMP:w[0-9]+]], #4104
+; CHECK: mov w[[OFFSET:[0-9]+]], [[TMP]]
+; CHECK: strb w0, [x[[SP]], x[[OFFSET]]]
+
+define void @foo(i8 %in) {
+ call void @bar(i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; All regs gone.
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 32
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 64
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 128
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 256
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 512
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 1024
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 2048
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef,
+ i64 undef, i64 undef, i64 undef, i64 undef, ; sp + 4096
+ i64 undef, ; sp + 4104 (i.e. not uimm12 or uimm12 << 12).
+ i8 %in)
+ ret void
+}
+
+declare void @bar(i64, i64, i64, i64,
+ i64, i64, i64, i64, ; All regs gone.
+ i64, i64, i64, i64, ; sp + 32
+ i64, i64, i64, i64, ; sp + 64
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 128
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 256
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 512
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 1024
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 2048
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64,
+ i64, i64, i64, i64, ; sp + 4096
+ i64,
+ i8)