[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / CodeGen / AArch64 / GlobalISel / arm64-fallback.ll
blobcd247718eba0396c696f6cf41c43a98b2a2df668
1 ; RUN: not llc -O0 -global-isel -global-isel-abort=1 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=ERROR
2 ; RUN: llc -O0 -global-isel -global-isel-abort=0 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefix=FALLBACK
3 ; RUN: llc -O0 -global-isel -global-isel-abort=2 -pass-remarks-missed='gisel*' -verify-machineinstrs %s -o %t.out 2> %t.err
4 ; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-OUT < %t.out
5 ; RUN: FileCheck %s --check-prefix=FALLBACK-WITH-REPORT-ERR < %t.err
6 ; RUN: not llc -global-isel -mtriple aarch64_be %s -o - 2>&1 | FileCheck %s --check-prefix=BIG-ENDIAN
7 ; This file checks that the fallback path to selection dag works.
8 ; The test is fragile in the sense that it must be updated to expose
9 ; something that fails with global-isel.
10 ; When we cannot produce a test case anymore, that means we can remove
11 ; the fallback path.
13 target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
14 target triple = "aarch64--"
16 ; BIG-ENDIAN: unable to translate in big endian mode
18 ; We use __fixunstfti as the common denominator for __fixunstfti on Linux and
19 ; ___fixunstfti on iOS
20 ; ERROR: unable to translate instruction: ret
21 ; FALLBACK: ldr q0,
22 ; FALLBACK-NEXT: bl __fixunstfti
24 ; FALLBACK-WITH-REPORT-ERR: unable to translate instruction: ret
25 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for ABIi128
26 ; FALLBACK-WITH-REPORT-OUT-LABEL: ABIi128:
27 ; FALLBACK-WITH-REPORT-OUT: ldr q0,
28 ; FALLBACK-WITH-REPORT-OUT-NEXT: bl __fixunstfti
29 define i128 @ABIi128(i128 %arg1) {
30   %farg1 =       bitcast i128 %arg1 to fp128
31   %res = fptoui fp128 %farg1 to i128
32   ret i128 %res
35   ; The key problem here is that we may fail to create an MBB referenced by a
36   ; PHI. If so, we cannot complete the G_PHI and mustn't try or bad things
37   ; happen.
38 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: cannot select: G_STORE %6:gpr(s32), %2:gpr(p0) :: (store seq_cst 4 into %ir.addr) (in function: pending_phis)
39 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for pending_phis
40 ; FALLBACK-WITH-REPORT-OUT-LABEL: pending_phis:
41 define i32 @pending_phis(i1 %tst, i32 %val, i32* %addr) {
42   br i1 %tst, label %true, label %false
44 end:
45   %res = phi i32 [%val, %true], [42, %false]
46   ret i32 %res
48 true:
49   store atomic i32 42, i32* %addr seq_cst, align 4
50   br label %end
52 false:
53   br label %end
57 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: G_STORE %1:_(<7 x s32>), %0:_(p0) :: (store 28 into %ir.addr, align 32) (in function: odd_vector)
58 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for odd_vector
59 ; FALLBACK-WITH-REPORT-OUT-LABEL: odd_vector:
60 define void @odd_vector(<7 x i32>* %addr) {
61   %vec = load <7 x i32>, <7 x i32>* %addr
62   store <7 x i32> %vec, <7 x i32>* %addr
63   ret void
66   ; AArch64 was asserting instead of returning an invalid mapping for unknown
67   ; sizes.
68 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to translate instruction: ret: '  ret i128 undef' (in function: sequence_sizes)
69 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for sequence_sizes
70 ; FALLBACK-WITH-REPORT-LABEL: sequence_sizes:
71 define i128 @sequence_sizes([8 x i8] %in) {
72   ret i128 undef
75 ; Just to make sure we don't accidentally emit a normal load/store.
76 ; FALLBACK-WITH-REPORT-ERR: cannot select: G_STORE %1:gpr(s64), %0:gpr64sp(p0) :: (store unordered 8 into %ir.addr) (in function: atomic_ops)
77 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for atomic_ops
78 ; FALLBACK-WITH-REPORT-LABEL: atomic_ops:
79 define i64 @atomic_ops(i64* %addr) {
80   store atomic i64 0, i64* %addr unordered, align 8
81   %res = load atomic i64, i64* %addr seq_cst, align 8
82   ret i64 %res
85 ; Make sure we don't mess up metadata arguments.
86 declare void @llvm.write_register.i64(metadata, i64)
88 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to translate instruction: call: ' call void @llvm.write_register.i64(metadata !0, i64 0)' (in function: test_write_register_intrin)
89 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for test_write_register_intrin
90 ; FALLBACK-WITH-REPORT-LABEL: test_write_register_intrin:
91 define void @test_write_register_intrin() {
92   call void @llvm.write_register.i64(metadata !{!"sp"}, i64 0)
93   ret void
96 @_ZTIi = external global i8*
97 declare i32 @__gxx_personality_v0(...)
99 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %0:_(s128) = G_FCONSTANT fp128 0xL00000000000000004000000000000000
100 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for test_quad_dump
101 ; FALLBACK-WITH-REPORT-OUT-LABEL: test_quad_dump:
102 define fp128 @test_quad_dump() {
103   ret fp128 0xL00000000000000004000000000000000
106 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %2:_(p0) = G_EXTRACT_VECTOR_ELT %0:_(<2 x p0>), %3:_(s64) (in function: vector_of_pointers_extractelement)
107 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for vector_of_pointers_extractelement
108 ; FALLBACK-WITH-REPORT-OUT-LABEL: vector_of_pointers_extractelement:
109 @var = global <2 x i16*> zeroinitializer
110 define void @vector_of_pointers_extractelement() {
111   br label %end
113 block:
114   %dummy = extractelement <2 x i16*> %vec, i32 0
115   store i16* %dummy, i16** undef
116   ret void
118 end:
119   %vec = load <2 x i16*>, <2 x i16*>* undef
120   br label %block
123 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %2:_(<2 x p0>) = G_INSERT_VECTOR_ELT %0:_, %3:_(p0), %5:_(s32) (in function: vector_of_pointers_insertelement)
124 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for vector_of_pointers_insertelement
125 ; FALLBACK-WITH-REPORT-OUT-LABEL: vector_of_pointers_insertelement:
126 define void @vector_of_pointers_insertelement() {
127   br label %end
129 block:
130   %dummy = insertelement <2 x i16*> %vec, i16* null, i32 0
131   store <2 x i16*> %dummy, <2 x i16*>* undef
132   ret void
134 end:
135   %vec = load <2 x i16*>, <2 x i16*>* undef
136   br label %block
139 ; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %3, %4 :: (store 12 into `i96* undef`, align 16) (in function: nonpow2_add_narrowing)
140 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_add_narrowing
141 ; FALLBACK-WITH-REPORT-OUT-LABEL: nonpow2_add_narrowing:
142 define void @nonpow2_add_narrowing() {
143   %a = add i128 undef, undef
144   %b = trunc i128 %a to i96
145   %dummy = add i96 %b, %b
146   store i96 %dummy, i96* undef
147   ret void
150 ; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %3, %4 :: (store 12 into `i96* undef`, align 16) (in function: nonpow2_add_narrowing)
151 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_or_narrowing
152 ; FALLBACK-WITH-REPORT-OUT-LABEL: nonpow2_or_narrowing:
153 define void @nonpow2_or_narrowing() {
154   %a = add i128 undef, undef
155   %b = trunc i128 %a to i96
156   %dummy = or i96 %b, %b
157   store i96 %dummy, i96* undef
158   ret void
161 ; FALLBACK-WITH-REPORT-ERR remark: <unknown>:0:0: unable to legalize instruction: G_STORE %0, %1 :: (store 12 into `i96* undef`, align 16) (in function: nonpow2_load_narrowing)
162 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_load_narrowing
163 ; FALLBACK-WITH-REPORT-OUT-LABEL: nonpow2_load_narrowing:
164 define void @nonpow2_load_narrowing() {
165   %dummy = load i96, i96* undef
166   store i96 %dummy, i96* undef
167   ret void
170 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: cannot select: %5:fpr32(s32) = G_EXTRACT %{{[0-9]+}}:fpr(s128), 64 (in function: nonpow2_store_narrowing)
171 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_store_narrowing
172 ; FALLBACK-WITH-REPORT-OUT-LABEL: nonpow2_store_narrowing:
173 define void @nonpow2_store_narrowing(i96* %c) {
174   %a = add i128 undef, undef
175   %b = trunc i128 %a to i96
176   store i96 %b, i96* %c
177   ret void
180 ; Currently can't handle vector lengths that aren't an exact multiple of
181 ; natively supported vector lengths. Test that the fall-back works for those.
182 ; FALLBACK-WITH-REPORT-ERR-G_IMPLICIT_DEF-LEGALIZABLE: (FIXME: this is what is expected once we can legalize non-pow-of-2 G_IMPLICIT_DEF) remark: <unknown>:0:0: unable to legalize instruction: %1:_(<7 x s64>) = G_ADD %0, %0 (in function: nonpow2_vector_add_fewerelements
183 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to legalize instruction: %2:_(s64) = G_EXTRACT_VECTOR_ELT %1:_(<7 x s64>), %3:_(s64) (in function: nonpow2_vector_add_fewerelements)
184 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for nonpow2_vector_add_fewerelements
185 ; FALLBACK-WITH-REPORT-OUT-LABEL: nonpow2_vector_add_fewerelements:
186 define void @nonpow2_vector_add_fewerelements() {
187   %dummy = add <7 x i64> undef, undef
188   %ex = extractelement <7 x i64> %dummy, i64 0
189   store i64 %ex, i64* undef
190   ret void
193 ; Currently can't handle dealing with a split type (s128 -> 2 x s64) on the stack yet.
194 declare void @use_s128(i128 %a, i128 %b)
195 ; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to lower arguments: i32 (i32, i128, i32, i32, i32, i128, i32)* (in function: fn1)
196 ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for fn1
197 ; FALLBACK-WITH-REPORT-OUT-LABEL: fn1:
198 define i32 @fn1(i32 %p1, i128 %p2, i32 %p3, i32 %p4, i32 %p5, i128 %p6, i32 %p7) {
199 entry:
200   call void @use_s128(i128 %p2, i128 %p6)
201   ret i32 0